利用赛门铁克漏洞渗透整个企业网络

1.引言

赛门铁克端点保护Symantec Endpoint Protection (SEP) 12.1的存在数个高危漏洞!一旦攻击者拿下了管理端,得到了管理员的权限,那么他就可以重新部署安装升级包,把木马藏进安装包,推送至客户端执行,从而拿下整个企业网络。目前只有升级到12.1 RU6 MP1的版本不被影响。

简单介绍一下,SEP 是一个企业版的杀毒产品,分为管理端和客户端。管理端是提供web UI,允许管理员管理和察看客户端的状态和客户端的病毒感染事件等等。而客户端基本上就是一个普通的赛门铁克杀毒软件,但是接受管理端的管理并且定时上报 自己的状态。值得一提的是,管理员还可以在管理端部署安装升级包,以便客户端通过管理端来进行升级。

本文重点介绍这几个漏洞和利用方法:攻击者最终可以在管理端和所有客户端得到 ‘NT Authority\SYSTEM’ 的权限。

2.攻击SEP管理端

攻击以SEP管理端的登陆页面为突破口,因为登陆页面是暴露在最外层的接口。

2.1 CVE-2015-1486: 绕过SEP管理端登陆认证

当用户认证以后,setAdminCredential()把用户信息存在与当前session相关的AdminCredential对象中。而阅 读源代码后发现,setAdminCredential()在两个地方被调用,一个在LoginHandler类里面,一个在 ResetPasswordHandler类里面。奇怪的是,setAdminCredential()为什么会在 ResetPasswordHandler类里面被调用呢?看起来很可疑,这个值得我们研究一下。从名称上看,ResetPasswordHandler 类用来处理口令重置,其中handleRequest()方法的代码如下

92行调用了getCredential()方法,用以取出AdminCredential对象。AdminCredential对象包含用户的信息,比如用户名,邮箱地址,口令hash值等等。以下是getCredential()的代码

367行创建了一个新的session,也就产生了一个新的JsessionID cookie。有意思的是第368行,用doGetAdminCredentialWithoutAuthentication()无需任何认证就根据用户输入的用户名和域名得到了一个AdminCredential对象。

最后,在369行,这个AdminCredential对象和新创建的session关联起来。使得该session成为了一个拥有SEP管理员权限的session.也就是说,发出一个口令重设请求,你就得到了一个拥有SEP管理员权限的session.

发一个POST请求验证一下

得到

这个HTTP响应包含了一个JSESSIONID cookie,用于关联新创建的管理员session。注意,虽然有管理员权限,但是由于某些限制,这个session还是无法用于直接登陆管理端。然而测试发现攻击者可以用这个session使用其他web API,比如,创建一个新的管理员账号。从而攻击者可以用这个新创建的账号登陆管理端。而且这个session还可以继续用于下一个漏洞。

2.2 CVE-2015-1487: 任意文件写入

UploadPackage允许管理员把客户端的安装包上传到管理端,以便客户端升级维护。 然而这里有一个任意文件写入的漏洞,看源代码

 

注意189行到191行,上传文件时,文件名和文件目标路径分别取值于PackageFile和KnownHosts属性。

196行,这里有个检查,目标路径禁止包含’/’ and ’\\’,可惜的是,检查过以后,199行又把文件名和目标路径组装在了一起。那么,如果我们把目标路径写在文件名里面,就可以绕过检查。

这样,我们就可以得到一个 ‘NT Service\semsrv’的权限的cmd.

2.3 CVE-2015-1489: SEP管理端主机提权

在 SEP管理端, 有一个名为SemLaunchSvc.exe的服务。该服务有’NT Authority\SYSTEM’权限,用来处理一些需要高权限的操作,比如实时升级等。这个服务监听本地8447端口与管理端程序通信。而管理端用一 个名为SemLaunchService的类来实现和SemLaunchSvc.exe通信。该类支持CommonCMD,可以打开一个cmd。

既然我们已经可以上传并执行任意java代码,那么我们可以进一步调用SemLaunchService中的CommonCMD, 从而得

3. 攻击SEP客户端

3.1 CVE-2015-1492:SEP 客户端二进制植入

一旦有了管理端的权限,攻击者就可以在管理端添加一个修改过的客户端升级安装包,然后通过管理端把伪装的安装包推送到客户端上并执行。当然这里还要用到一个DLL劫持漏洞。这个漏洞劫持或者替换正常的DLL,欺骗正常程序加载攻击者预先准备好的恶意DLL。

安装升级SEP客户端的时候,SEP客户端ccSvcHst.exe首先会打开安装包,在里面 找到一个名为smcinst.exe的程序,并且启动之,而smcinst.exe会调用一些系统DLL, 比如说UxTheme.dll。这里很可能smcinst.exe使用了相对路径来调入DLL, 并且没有检查DLL的签名。这样攻击者只要在安装包里加入一个伪造的UxTheme.dll就可以啦!由于LoadLibrary的特性,同在安装包下的 这个伪造的UxTheme.dll会优先被调入。而一旦被调入,这个伪造的UxTheme.dll可以拥有NT Authority\SYSTEM权限。

那怎么把伪造的dll文件加到安装包里面,并推送到客户端呢?

管理端的保护是众中之重,一旦管理端被突破,客户端则难保,从而整个企业网络沦陷。

[via@freebufnickchang]