首页 资讯 安全 查看内容

Github企业版远程代码执行漏洞分析

2017-3-17 11:15 |来自: 互联网 3352 0

摘要: 翻译:shan66预估稿费:170RMB投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿前言眼下,几乎人人都在使用GitHub。如果您有大量的绿皮书或者对自己的代码非常偏执,那么不妨运行自己的GitHub。支付$ 2500 ...

翻译: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/
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部