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中
配置好后,burp可以在扫描时自动识别java反序列化漏洞,如图所示
或者也可以手动进行测试,首先将测试的请求发送到DS-Manual testing
然后打开burp标签栏上的Deserialization Scanner,选择插入点、测试方式并开始测试
测试结果将显示在右侧
当然,这个插件也有漏洞利用的功能,这里先不介绍了
漏洞复现
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一般是存在了;
启动测试环境
Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译、运行一个完整的漏洞靶场镜像。旨在让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。
1 | git clone https://github.com/vulhub/vulhub.git #下载环境 |
访问靶机ip:8080 出现如下页面说明启动成功
攻击演示
使用java反序列化终极测试工具
使用java反序列化终极测试工具,输入目标地址,首先获取信息,查看是否存在漏洞,如果存在漏洞可以直接执行命令,简单又好用
使用Jexboss
jexboss是一个使用Python编写的Jboss漏洞检测利用工具,通过它可以检测并利用web-console,jmx-console,JMXInvokerServlet这三个漏洞,并且可以获得一个shell。
1 | https://github.com/joaomatosf/jexboss.git |
接着输入
1 | No |
按下回车后再在nc监听窗口按一下回车获得反弹的shell,这种方式获得的shell一般权限都比较高。
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
属性执行任意命令,有几个条件:
- 目标网站使用fastjson库解析json
- 解析时设置了
Feature.SupportNonPublicField
,否则不支持传入私有属性 - 目标使用的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源码
- main/java java类
- pom.xml 配置文件,使用maven可以直接将本项目编译成war包
- exploit.php 读取编译好的POC字节码,并转换成base64
- fastjson-1.0.war 打包好的web环境,可以直接放到tomcat下运行
1 | cd vulhub/fastjson/vuln #进入目录 |
在攻击机上访问http:192.168.31.7:8080显示Hello World 说明启动成功了
生成Payload
首先需要自己修改Poc.java 这个类,将要执行的命令写进去,然后编译这个类获得class文件,获得字节码
1 | cd src/main/java #进入目录 |
这里设置执行的命令是在home下创建hacker文件,实际中可以执行任意命令
1 | import com.sun.org.apache.xalan.internal.xsltc.DOM; |
然后回到主目录编译代码,这里首先要安装maven,比较简单,这里不再赘述。
1 | cd ../../../ |
生成后放到如下位置中
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拼接成一句话返回。
接下在发送构造的poc发送
可以看到执行成功了
reference
http://xxlegend.com/2018/06/20/先知议题 Java反序列化实战 解读
https://mp.weixin.qq.com/s/nYY4zg2m2xsqT0GXa9pMGA
https://www.oracle.com/technetwork/security-advisory/cpuapr2018-3678067.html
本文作者 : W4rnIn9
原文链接 : http://joner11234.github.io/article/a6638bb3.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!