Gitlab 任意文件读取漏洞复现

访客4年前关于黑客接单929

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 会按照如下步骤处理:

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

  2. 服务器根据 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 mi *** atch: 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:: *** ON.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。访问 ,设置管理员(用户名 )密码,登录。

1608812492_5fe487cc677f967d7938c.png!small?1608812491766

新建一个项目,点击 :

1608812524_5fe487ec43f38790d2ccd.png!small?1608812523626

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

1608812536_5fe487f888df227842bb2.png!small?1608812536451

1608812564_5fe48814752eac2f5e79c.png!small?1608812563768

1608812589_5fe4882dbc0c2c98c1723.png!small?1608812590001

漏洞修复

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

1608813123_5fe48a43f25dfb2d2be4a.png!small?1608813123255

1608813158_5fe48a660348b4c232379.png!small?1608813157294

1608813187_5fe48a838168708987063.png!small?1608813186728

参考资料

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

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

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


相关文章

蓝色黑客同盟地址怎么找-海内最大的黑客论坛(海内最大黑客买卖网站

程序编写和网络黑客是啥关联 qq网页登陆器登录密码(qq登陆器电脑版网页) 在网上怎祥寻找网络黑客 服务平台被黑客入侵会涌起什么原因(黑客入侵 互联网大数据) 网络黑客如何定位手机...

海绵宝宝英语动漫(海绵宝宝英语版动漫)

可以在优酷或土豆上直接观看! 海绵宝宝英语版2013-08-0623:29提问者悬赏:5分|匿名|分类:动漫谁有英文版的海绵宝宝?要中英文字幕的,谢谢我有更好的答案。 海绵宝宝-央视热播52集美国...

美国单日新冠死亡人数演员李亚林破纪录 日本暂停奥运圣火

  中新网1月8日电 综合报道,据美国约翰斯·霍普金斯大学网站数据显示,截至北京时间8日7时22分,全球累计确诊新冠病例超8791万例,累计死亡病例近190万例。美国新冠住院患者数激增,单日死亡人数再...

首批50城喜提5G各运营商套餐资费出炉 5G首批开通城市完整名单

首批50城喜提5G各运营商套餐资费出炉 5G首批开通城市完整名单

在今天(10月31日)举行的2019年中国国际信息通信展览会上,工信部与三大运营商举行5G商用启动仪式。中国移动、中国联通、中国电信正式公布5G套餐,并于11月1日正式上线5G商用套餐。这标志着我国将...

声卡是什么(带你全面了解声卡的作用)

声卡是什么(带你全面了解声卡的作用)

关于声卡,其实早在很多年前就被发明出来了,然而,在近几年我们才慢慢开始熟悉它,这主要得益于全民直播的兴起,让声卡也借此红了一把,那这是怎么回事呢?原来,大部分的主播在直播时都会使用声卡,因为声音通过它...

计算机黑客史上第一人(第一位黑客)

计算机黑客史上第一人(第一位黑客)

全球第一黑客是谁? 1、相当多的人认为凯文·米特尼克(Kevin David Mitnick,1964年美国洛杉矶出生),是世界上“头号电脑黑客(骇客)”。有评论称他为“世界头号黑客”。这位“著名人物...