当前位置:首页 > 黑客技术 > 正文内容

Gitlab 任意文件读取漏洞复现

访客4年前 (2021-04-15)黑客技术456

Gitlab 任意文件读取漏洞(CVE-2016-9086)

GitLab 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。近日研究者发现在其多个版本中存在文件读取漏洞 (CVE-2016-9086) 和 任意用户 authentication_token 泄漏漏洞,攻击者可以通过这两个漏洞来获取管理员的权限,进而控制所有 gitlab 项目。

影响版本:

  • 任意文件读取漏洞 (CVE-2016-9086):GitLab CE/EEversions 8.9, 8.10, 8.11, 8.12, and 8.13

  • 任意用户 authentication_token 泄露漏洞:Gitlab CE/EE versions 8.10.3-8.10.5

漏洞分析

本文在前辈研究基础上只分析任意斍读取漏洞。

从 8.9.0 版本开始,GitLab 新增了导入导出项目的功能。一个空的 gitlab 项目导出后结构如下:

VERSION ? ? ? ? # GitLab 的导出模块的版本
project.json ? ? # 包含了项目的配置文件

当我们导入 GitLab 的导出文件的时候,GitLab 会按照如下步骤处理:

  • 服务器根据 VERSION 文件内容检测导出文件版本,如果版本符合,则导入。

  • 服务器根据 Project.json 文件创建一个新的项目,并将对应的项目文件拷贝到服务器上对应的位置。

  • 检测 VERSION 文件的代码位于:中:

    ... def check! version=File.open(version_file, &:readline) verify_version!(version) rescue=> e shared.error(e) false end ... def verify_version!(version) if Gem::Version.new(version) !=Gem::Version.new(Gitlab::ImportExport.version) raise Gitlab::ImportExport::Error.new("Import version mismatch: Required #{Gitlab::ImportExport.version} but was #{version}") else true end end ...

    我们可以看到这里的逻辑是读取 VERSION 文件的第一行赋值给变量 version,然后检测 verison 与当前版本是否相同,相同返回 true,不相同则返回错误信息 (错误信息中包括变量 version 的值). 于是漏洞发现者 Jobert Abma 巧妙的使用了软链接来达到读取任意文件的目的。首先,我们给 VERSION 文件加上软链接并重新打包。

    ln -sf /etc/passwd VERSION tar zcf change_version.tar.gz https://www.freebuf.com/articles/web/

    这样,读取 VERSION 文件的时候服务器就会根据软链接读取到 /etc/passwd 的第一行内容并赋值给 version。但是由于 version 与当前版本不相同,所以会输出 version 的值,也就是 /etc/passwd 第一行的内容。

    但是,如果只读取任意文件的第一行,能做的事情还是太少了。漏洞发现者显然不满足这一结果,他继续找了下去.读取 Project.json 这一配置文件的代码位于:/lib/gitlab/import_export/project_tree_restorer.rb 中:

    ... def restore json=IO.read(@path) tree_hash=ActiveSupport::JSON.decode(json) project_members=tree_hash.delete('project_members') ActiveRecord::Base.no_touching do create_relations end rescue=> e shared.error(e) false end ...

    在这里,我们可以再次使用软链接使变量 json 获取到任意文件的内容,但是由于获取的文件不是 json 格式,无法 decode,导致异常抛出,最终在前端显示出任意文件的内容。 添加软链接并打包:

    ln -sf /etc/passwd project.json tar zcf change_version.tar.gz https://www.freebuf.com/articles/web/

    测试环境

    如下测试环境借助 vulhub 的 docker 镜像,附上 P 师傅的链接:https://github.com/vulhub/vulhub

    编译及运行环境:

    docker-compose up -d

    请使用 2G 及以上内存的 VPS 或虚拟机运行该环境,实测 1G 内存的机器无法正常运行 Gitlab(运行后 502 错误)。

    漏洞复现

    环境运行后,Web 端口为 10080,ssh 端口为 10022。访问 ,设置管理员(用户名 )密码,登录。

    新建一个项目,点击 :

    将 test.tar.gz上传,将会读取到 文件内容:

    漏洞修复

    官方先移除了导入包里的软连接,其次,读取 VERSION 的内容和 project.json 的内容出错后将内容输出到日志里而非返回到前端。

    参考资料

  • https://github.com/gitlabhq/gitlabhq/commit/912e1ff4284eb39fe020b8e823085a2cb7f244fb

  • http://paper.seebug.org/104/

  • https://vulhub.org/#/environments/gitlab/CVE-2016-9086/


  • 扫描二维码推送至手机访问。

    版权声明:本文由黑客接单发布,如需转载请注明出处。

    本文链接:http://therlest.com/106033.html

    分享给朋友:

    “Gitlab 任意文件读取漏洞复现” 的相关文章

    华流年京东618怎么买便宜

    京东618活动已经在火热进行中的哦,各位有买什么东西了吗?很多小伙伴在活动一开始的时候就迫不及待的买了很多东西了,还有些小伙伴还很犹豫不知道买啥,接下来百思特小编就来教教大家2020年京东618怎么便宜吧~ 京东618怎么买便宜 活动时...

    安宫牛黄丸现在价格 - 天地和堂安宫牛黄丸多少钱

    一丸280元左右.装同仁堂安宫牛黄丸,那个年代的这个玩意,中医说法多少,体外培育牛黄。 两丸,字[2000]201号\制定安宫牛黄丸等药品价格的批复,到正规的同仁堂自己品牌的药店购买,价格不一样,希望懂得.天然牛黄天然麝香。北京同仁堂牛黄解毒丸的市场价格在2005年。 绿色木盒这三种包装的价格一样,...

    奶牛多少钱一头2021年奶牛价格,2021年奶牛市场行情

    字体:大中小,一般不超过200斤重的奶牛,怀孕母牛价格要稍贵一些,一般小点的,优质纯种荷斯坦奶牛,见效慢,关闭窗口,通常3-8个月小。 月的奶牛奶牛,花色、请问一头一头半成年奶牛多少钱!但我家不像你那个样子.荷斯坦奶牛、年龄大小。 来源、厘米,他的特点是投资巨大,理性回归2005-09-1511:5...

    糖尿病胰岛素多少钱一支_血糖高不高,看脚就知道

    饮食和运动可以让你不怕糖尿病过好生活.也与运动太少有关。眼睛发痒一般是过敏.哪家医院对糖尿病的治疗上信誉. 血糖高是哪个部位.据统计,黎明现象,空腹和。 精神状态等各方面根本的健康因素并不重视,不过在这家医院现在可以实现跨省异地直接,之前就血糖高,口服药是可以降糖的!治疗导致的并发症,就换了别的药,...

    Webshell安全检测篇

    0x00 依据流量的检测办法 1.概述 笔者一直在重视webshell的安全剖析,最近就这段时刻的心得体会和咱们做个共享。 webshell一般有三种检测办法: 依据流量方法 依据agent方法(本质是直接剖析webshell文件) 依据日志剖析方法 Webshell的分...

    实用的刷卡门禁一体机 - 门禁设置说明书

    2011-04-0511:45:53卡号:方向:未知,具体操作说明:门禁控制器,还要看你们所用的门禁是ID的还是IC的。具体的可以根据说明书操作。 手动开门[1 的大门2011-04-0511:45:43[1 大门无效用户刷卡时间,你这个说的真不知道怎么回答你。蜂鸣器连续断续鸣响报警,具体到可以统计...

    评论列表

    依疚软祣
    3年前 (2022-07-07)

    .org/#/environments/gitlab/CVE-2016-9086/

    柔侣粢醍
    3年前 (2022-07-07)

    on mismatch: Required #{Gitlab::ImportExport.version} but was #{version}") el

    澄萌千仐
    3年前 (2022-07-08)

    bert Abma 巧妙的使用了软链接来达到读取任意文件的目的。首先,我们给 VERSION 文件加上软链接并重新打包。ln -sf /etc/passwd VERSIONtar zcf chang

    夙世悸初
    3年前 (2022-07-07)

    文件加上软链接并重新打包。ln -sf /etc/passwd VERSIONtar zcf change_version.tar.gz https://www.freebuf.com/ar

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法和观点。