框架安全是安全界众所周知的问题,实际上,Apache Struts漏洞就是此类问题的最好体现。如果我们从产品供应商的角度来看待这个问题,会发现更多相似案例。比如趋势科技在多款产品使用了相同的代码库,本文中我会展示用一个RCE漏洞就可渗透多款趋势安全软件。
大部分趋势安全软件都在管理员界面中嵌入了一个组件(widget),虽然软件核心程序为Java或但该组件却为PHP实现机制,这意味着,不论何时使用该组件,软件中肯定要包含PHP解释器模块。这就为我们研究打开了可以想像的空间:这个存在于不同安全软件中的代码库一旦存在漏洞,就能通吃所有软件,成功实现软件系统的入侵渗透。
基于此,我对Trend Micro OfficeScan的组件(widget)系统进行了一次安全审计,结果也让人吃惊:我发现了其中存在的6个漏洞,有2个为0day漏洞。在演示漏洞之前,我们来看看该组件库的工作机制。
该组件框架有一个代理机制,也即是存在proxy_controller.php这么一个服务端来接收用户提供的参数,然后根据输入来调用相关的类函数,而组件类型主要有用户自定义和默认类型。以下为proxy_controller.php中的源代码:
实际上可有多种WFProxy实现方式,主要取决于从客户端所获取的变量。现在,知道了不同类之间的参数传递方式,我们可以深入来分析其中的安全问题。
很显然,这里存在着潜在的命令注入漏洞,因为我们可以完全控制数组$this-cgiArgs和$g_GetPost。每个WFProxy类都是扩展的ABaseProxy抽象类,以下则为基类中的__construct方法头两行:
后来,我想起该漏洞可能是研究人员Steven Seeley前久发现的漏洞,趋势可以已经在几周前就发布了补丁更新,根据公告,该漏洞利用需要用到身份认证机制,而我已经找到了绕过身份认证的另外一个0day漏洞了,后续漏洞#6中我会作介绍。
前文提到的两种组件类型:用户自定义和默认,在此基础上趋势安全软件在其代码库中又存在着一种默认的用户自定义组件实现:modSimple,我觉得这是一种提供给用户的实现示例。该组件的proxy_exec()方法实现代码如下:
它直接使用了url参数传递而没采用了校验机制,而前面提到的$this-cgiArgs[url]数组是可被我们完全控制的,所以就有了以下PoC:
前面说过,由于趋势安全软件核心系统是Java/.NET编写的,但其组件widget系统却完全是PHP架构的,所以问题来了:
为此,可以利用Burp来对用户登录行为进行抓包分析,确定组件是否被调用进行身份认证,以下HTTP POST请求引起了我的注意:
而在此过程,我并未见识到所谓的认证过程,甚至连参数的hash认证过程也没有,所以,在这种服务端中,用相同的变量就可完成所有的用户身份认证。
现在,我们有两个可用漏洞,一个是刚发布补丁的命令注入,另一个是利用组件系统的身份认证绕过漏洞(0day),这两个漏洞的组合将会让我们在不需任何凭据的条件下,直接对目标系统执行操作系统命令,实现成功入侵渗透:exploit-GitHub,视频演示:
我想说的是,趋势科技已经对以上的命令注入漏洞发布了修复补丁,如果你是趋势用户,请尽快升级!另外,在不同产品中使用相同代码库不是啥子坏事,但一旦这种代码库存在漏洞将会使大量产品受到影响。目前,我还没对该漏洞影响的趋势产品进行核查,但可以肯定的常之多。
推荐: