转载

新痛点:APT组织PawnStorm 0Day如何绕过Java点击播放保护

几个月以前,趋势科技发现了APT组织Pawn Storm利用之前未经披露的Java漏洞(CVE-2015-2590)进行攻击。在那之后,我们注意到一个被用于染过Java点击播放(click-to-play)保护的独立漏洞。第二个漏洞(CVE-2015-4902)现在已经在Oracle定期的季度更新中被修复,并将此归功于趋势科技的发现。

FreeBuf百科

Click-to-play要求用户在Java应用程序执行之前,在空白处单击一下。实际上,它要求用户只有在十分确定需要运行Java代码的情况下才会运行。

绕过click-to-play保护技术允许恶意Java代码在没有显示任何警告窗口的情况下运行。Pawn Storm对于这一手段运用得炉火纯青,因为它在今年年初针对北约成员以及白宫进行的攻击中利用了这些漏洞的exp。Pawn Storm本身就以超高频率运用着0day漏洞:上个星期,就被发现使用了未补丁的Adobe Flash漏洞实施攻击(这个漏洞已被Adobe修复)。

Oracle在我们报告这个漏洞时就承认了漏洞的存在。用于绕过这种保护的方式很巧妙,在我们讨论漏洞之前,有必要先对背景信息进行一下梳理。

相关背景介绍

Oracle为应用程序在用户桌面启动提供了Java网络启动协议Java Network Launch Protocol(JNLP)技术,允许调用远程Web服务器托管的资源。它可以用于部署一个应用程序或者Web Start应用程序。在攻击场景中,使用JNLP部署应用程序。

Java提供了一个目录服务,允许Java软件用户通过一个名字来发现与查找目标。这就是所谓的Java命名与目录接口(JNDI),Java命名与目录接口。这个机制是Java远程过程调用的基础,又名远程方法调用(RMI)。JNDI与这个exp相关的一些基础概念,如下所示:

· Context——一组name-to-object绑定。换句话说,Context对象能够解决名字与对象间一一对应。对象包含几种类型;其中RegistryContext便是这些类型之一。 · ContextFactory——这可以创建一个用于调用的Context对象。RegisterContextFactory则是用来创建ContextFactory对象的。

EXP的工作原理

新痛点:APT组织PawnStorm 0Day如何绕过Java点击播放保护

图1. 如何绕过click-to-play

攻击者在攻击前需要完成三个任务:

1、将图2中的HTML代码添加到一个恶意网站;

2、创建一个具备公共IP地址的RMI注册服务器;

3、创建另一个同样具有公共IP地址的web服务器,用来保存恶意Java代码。

新痛点:APT组织PawnStorm 0Day如何绕过Java点击播放保护

图2. 插入恶意网站的HTML代码

攻击究竟是如何进行的?

1、在受害者机器上,jp2launcher.exe进程是由web浏览器进程forke而来,并且从恶意网络服务器上请求init.jnlp。以上操作都是使用图片二中的HTML代码完成的(.jnlp是使用JNLP技术启动Java代码的后缀)。

2、恶意网站发送回init.jnlp,现在再来看一下文件的内容:

新痛点:APT组织PawnStorm 0Day如何绕过Java点击播放保护

图3. Init.jnlp内容

红色圈中的内容并不寻常。进程级的标签含义可从Java开发人员指南中找到。这类应该可以实现Java接口DownloadServiceListener。但是,攻击者使用javax.naming.InitialContext。然而,JRE并不能用于检测并让代码执行。

3、Java类Javax.naming.InitialContext的构造函数要从恶意网站请求应用程序的JNDI.properties(即JNDI配置文件)。

4、恶意网站服务器发送JNDI.properties到客户端。下面让我们来看看这个文件的内容:

新痛点:APT组织PawnStorm 0Day如何绕过Java点击播放保护

图4. JNDI.properties内容

Java.naming.factory.intial 指定了初始context factory类。 java.naming.provider.url指定目录服务器提供者的地址为.javax.naming。InitialContext的构造函数会创建com.sun.jndi.rmi.registry.RegistryContextFactory对象,并使用它来创建初始上下文。

5、在创建初始上下文期间,它会与RMI注册服务器沟通来获取上下文信息。在图4中,这个java.naming.provider.url=rmi://{恶意服务器}/Go。这个URL使用了以下格式://[主机]/[对象]。因此,[对象]是Go。这便会允许客户端找到EMI服务器上的对象信息。

6、RMI服务器送还它的回复并允许客户端通过HTTP服务器从恶意Java类请求Go.class。

7、服务器发送Go.class内容给客户端。Java类中的代码在目标机器上运行的。

步骤3-7将在javax.naming.InitialContext的构造函数内进行,这不失为一个相当聪明的绕过click-to-play保护方式。

这里我们强调了用于复杂系统例如Java中安全保护特性(例如click-to-play)的重要性,对于已存在新特点进行审计是个必要过程。这确保了“优秀”功能和安全性都不会丧失。

如果Java仍能继续被广泛使用,绕过click-to-play保护的意义将是深远的。任何偶然发现的0day漏洞都将会利用。

这个特殊漏洞已经在最新的Java版本中获得了修复。用户应该尽快下载最新版本Java,尽管在一些情况下Java已经被慢慢淘汰。依赖Java的机构应该考虑是否

威胁指标IOC

JNLP文件用于启动这一exp链的SHA1值为:38F643B48B35B765326CEE6A1D16E1C35DCA93FD。

*参考来源: 趋势科技 ,作者/Jack Tang,编译/哆啦A梦,转载请注明来自黑客与极客(FreeBuf.COM)

正文到此结束
Loading...