翻译:shan66 预估稿费:170RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 前言 眼下,几乎人人都在使用GitHub。如果您有大量的绿皮书或者对自己的代码非常偏执,那么不妨运行自己的GitHub。支付$ 2500美元,就可以得到一个GitHub企业版,可供10个用户使用一年。实际上,Github企业版就是一个虚拟机,只不过提供了一个功能齐全的GitHub实例而已。尽管有一些边缘的情况下偶尔用到了GitHub.enterprise?调用,但是它运行的是与原始代码库一样的代码库。 所以,让我们干掉它。 代码的反混淆处理 当您下载Github企业版时,将会得到一个VirtualBox镜像,你可以将其部署到自己的机器上面。我通过启动随机恢复镜像考察机器的内部情况时,在/data目录里找到了GitHub的代码:
原来,有一个名为ruby_concealer.so的ruby模块,会对二进制字符串执行Zlib :: Inflate :: inflate,然后利用密钥“This obfuscation is intended to discourage GitHub Enterprise customers from making modifications to the VM. We know this 'encryption' is easily broken”进行XOR运算。就像密钥文字所提示的那样,这的确非常用以破解。现在,我们就通过以下工具对代码进行反混淆处理:
企业管理接口 现在,我们已经得到了反混淆后的代码,自然就可以开始寻找漏洞了。我认为管理控制台将是一个不错的攻击目标。如果你是管理员,你可以添加SSH密钥(用于root权限)、关闭服务等。但对于普通权限的用户来说,其界面如下所示:
毫不奇怪,代码可以从/data/enterprise-manager/current /中找到。 会话管理 由于管理接口是一个Rack应用程序,所以首先要做的事情就是查看config.ru文件,以便进一步了解这个应用程序的架构详情,我注意到它使用了Rack :: Session :: Cookie。就像您从名称中可以猜到的那样,这是一个将会话数据转储到cookie的Rack中间件。 实际上,它在内部完成的工作只有一件,那就是: 将会话数据序列化为cookie 当这个Rack应用程序完成时,Rack :: Session :: Cookie将使用下面展示的算法将会话数据保存到Cookie中: 取得应用程序放在env [“rack.session”]的会话哈希值({“user_id”=> 1234,“admin”=> true}或类似的东西) 运行Marshal.dump将这个ruby哈希值转换为字符串 对生成的字符串进行Base64编码 并附加已经用密钥进行了加盐的数据哈希值,以防止篡改。 将结果保存到_gh_manage cookie中。 对来自cookie的会话数据进行反序列化处理 让我们通过一个例子来仔细考察反序列化的过程:为了从cookie加载数据,Rack :: Session :: Cookie需要执行相应的操作。例如,将cookie设置为下面的值。
漏洞分析 上面的代码存在两个问题。 ENV ["ENTERPRISE_SESSION_SECRET"]从未进行设置,因此该密钥默认为上述值。您可以给任意Cookie进行签名并根据需要设置会话ID。但这并没有什么帮助,因为会话ID是32个随机字节。 不过,你现在可以将任意数据输入Marshal.load,因为你可以伪造一个有效的签名。与JSON不同,Marshal格式不仅允许使用散列、数组和静态类型,而且还允许使用ruby对象。这就会导致远程代码执行漏洞,这一点将在下面介绍。 制作漏洞代码 要想运行任意代码,我们需要生成运行反序列化代码的Marshal.load的输入。为此,我需要精心构造获访问该对象的代码。这需要分两步完成: 恶意ERb模板 解析.erb模板的方式是Erubis读取模版并生成一个Erubis :: Eruby对象,该对象保存有位于@src实例变量中的模板代码。所以如果我们把自己的代码放入那里的话,那么只需要设法调用object.result,我们的代码就会得到运行。 如果我现在访问session [“exploit”],它会调用erubis.result,然后运行嵌入的shell命令id> / tmp / pwned并返回1。 现在,我们只要把它封装成一个会话cookie,用密钥进行签名,就可以进行完成远程代码执行攻击了。 漏洞利用 下面是我提供给GitHub的完整漏洞利用代码,注意,它仅限于教育用途。
时间线 2017年1月26日 将问题报告给GitHub 2017年1月26日 GitHub将问题分类 2017年1月31日 被要求更新 2017年1月31日 GitHub颁发一万美元的赏金、T恤、几张贴纸和一个免费的个人计划。哈哈,名人堂也有俺的一席之地了, 真棒! 2017年1月31日 GitHub Enterprise 2.8.7发布 2017年3月14日 在完成本文的时候,GitHub又支付了8000美元。Wow。 致谢 特别感谢Phenoelit的joernchen撰写的关于ruby的安全文章,这里的漏洞利用代码借鉴了他的思路,非常感谢! 此外,我还要特别感谢Orange,正是他关于攻击GitHub企业版方面的博客文章才引起了我对这方面的兴趣。 |
| 本文出处: http://www.toutiao.com/a6398015199270027522/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|