来源:http://bbs.ichunqiu.com/thread-10492-1-1.html?from=ch
绕过McAfee系统底层应用白名单的绝佳姿势
原文来自exploit-db.com,由ichunqiu签约作者prison翻译发布
'''
前方高能,多字预警,这篇文章。。很长很长。。所以分两部发。。。
本文属于paper文献类,干货较多,翻译水平有限,请多多指教。
手动鞠躬。
'''
1.摘要
本文介绍了SEC安全顾问实验室对于验证在McAfee控制下的应用的安全性测试的研究结果。这个产品的一个例子是进一步为像SCADA的服务器环境或像工作站一样对于系统安全性能有高需求的关键系统进行强化。程序白名单有什么卵用呢?简单来说就像是澡堂子一样,分男女浴室,女浴室当然是不准男生随便乱进的。(当然了总有能例外的人,这也是这篇文章要讨论的事),在操作系统上也基本是这个概念。【本段原文没有,原文解释略刻板】这应该可以防止恶意软件的执行,由此来防御更先进的持续威胁(APT)攻击,McAfee应用程序控制软件就是这样一个例子。它可以安装在任意一个系统上,然而,他的主要功能是对基础设施的严格保护,而且他还有一些额外的安全功能,包括读写保护和不同的内存保护。
本次研究的是针对Windows下的McAfee(6.1.3.353版本)弱点缺陷检查设计和实现。已经确定了有几种方法可以绕过McAfee控制的主要特征程序的白名单,由此来执行未经授权的代码。不同的审计过程是现在最常见的攻击方法。在大多数情况下,应用程序最初的攻击可以被拦截,但是,只要应用程序改变一点点,它是有可能绕过保护来感染系统的。这些方案包括各种社会工程学攻击和内存损耗攻击。McAfee拦截程序可以避免内存泄漏攻击(例如缓冲区溢出)。事实上,这些保护只针对典型的操纵系统,如利用ASLR和DEP开发的新系统运行时则没什么卵用。因为他们已经包括了DEP和ASLP绕过方法。
已经确定一些额外的设计缺陷和弱点可以用于绕过读写保护,另外内核驱动程序中存在几个滥用可以导致系统崩溃的漏洞。基础设施的安全对于主要的应用程序正常运行是至关重要的(比如定期去电厂检查服务器的发热情况)这样的攻击基本上可以导致很严重的问题。最后注意,McAfee还附带一些非常过时的从1999年就可以利用的应用程序控制组件。
2.引言
“McAfee的应用控制软件提供了对服务器,企业台式机和固定设备对于未经授权的程序和代码的拦截提供了一种非常有效的方式,这种集中管理的白名单解决方案使用一个动态信任模型和比较创新的安全特性,阻止先进的持续攻击--而不需要签名更新或费时费力的列表管理”。
McAfee是一种通过白名单机制进一步对操作系统强化的应用控制程序。这对保护重要的基础设施非常有用。基础设施可能因为特别的可靠性和可用性和需求不符而不安装更新。这种要求的例子经常可以在SCADA环境不更新来避免从一个更新包的缺陷而感染中发现。理论上来说应用不应该阻止白名单上的可执行程序,因此可以防止执行攻击者提供的代码。产品主页上可以找到以下引用:
“最大限度的减少修补,同时保护内存--给你把部署补丁的时间推迟到常规补丁周期的时间,留有余地。此外。它可以防止白名单中的程序被通过被内存缓冲区溢出攻击Windows32和64位系统”
本文的目的是验证上文中说过的研究结果,即如果由McAfee提供应用程序的拦,得有多难才能够绕过它。
第二节描述了能够绕过白名单实现任意代码执行的各种方法。第一个描述了通过技术获取所谓的“基本代码执行”,这说明一个基本形式的代码是否具有代码执行的能力。第二部分阐述了一些基本的执行代码可以在绕过白名单时变成完整的代码执行,这也同样包含了McAfee提供的内存安全保护以及攻击者如何绕过的问题。第三部分阐述的概念是如何做到如何在运行着McAfee的微软系统上进行绕过UCA(用户账户控制)。
第三节用来理解读写保护概念和怎样通过一些简单的方法来绕过这些保护机制实现任意代码执行,第四节描述了内核驱动程序以及它们产生的影响,最后一张给出了研究的结论。
3.绕过代码执行保护机制
McAfee应用控制主要的安全功能就是拦截未经授权的执行代码。因此,第一步是演示如何绕过这个功能,在下面的讨论中,获取完整的代码执行的总体目标主要分为三个部分。
第一步是实现基本的代码执行,也就是某种非常基本的代码执行。比如说具有启动白名单程序中的具体参数的能力。第二步是用基本的代码执行完整执行代码,也就是可以构成任意代码执行(shellcode)。这一阶段是完全绕过McAfee的代码执行保护机制。
最后但不是必要的一步是绕过用户账户控制(UCA)在管理员账户的情况下执行代码执行。这只是在如果需要攻击管理员账户的情况下,否则的话另外两个步骤用普通账户就够了。
3.1基本代码执行
3.1.1滥用未经检查的文件类型:HTA和JS
McAfee主要拦截不在白名单中的类似于.bat,.com,.vbs(有很多这种类型的可执行文件类型后缀,凡此种种不一而足)后缀的可执行文件,然而另一种非常常见的方法是使用黑名单机制,在这么一个使用黑名单的情况下很可能会漏掉一些文件类型或文件扩展,因此就无法验证。
这恰恰是由McAfee来检测的。在这种特殊情况下不检查HTML程序(HTA),可以随意浪。从Wscript使用run方法。Shell对象可以启动在系统上的其他白名单应用以方便后期的攻击。恶意的hta文件可以感染到受害者的电子邮件或者是U盘(利用简单的社会工程学攻击),如果受害者打开了文件。代码开始执行,并进一步感染系统。
在分析过程中发现了另一个没有审核的文件类型,不可信的JScript文件执行也不验证,因此可以被攻击者利用。要启动另外一个程序,可以使用和上文中所说相同的代码。最常见的攻击场景是利用ActiveXObject脚本进行攻击。FileSystemObject是用来将一个可执行文件(病毒)写到硬盘后,利用wscript.shell启动可执行文件。但是,因为白名单的限制,所以这个文件不会被执行而是会被拦截下来。本章的第二部分讨论的技术就是用来实现完整的代码执行。这个技术需要具有运行白名单应用程序和对一些特定的参数修改的功能。这些都完全可以用JS或者HTA,此外,恶意软件在JS/HTA文件中进行操作是完全有可能的。
当然了,其他的一些没有过滤的文件也同样有可能存在任意命令执行。
3.1.2快捷方式
如果以上的技术必须以某种方式发送给受害者的话,可以通过一些不同的渠道来完成。例如通过E-mail,网络分享或者通过U盘粘贴上去。如果是用U盘的话有一个更好的方法,USB协议还支持一些其他的设备,比如USB键盘,USB鼠标或者是USB集线器。一个恶意的U盘可以将自己伪装为一个USB集线器(内部协议伪装,不是换包装啊各位!),然后将USB键盘和它连接起来。然后很快就可以通过它来使用键盘发送特定的按键,比如发送Windows键+R键可以打开运行对话框(Windows上基本的快捷键)。然后就可以通过U盘来。。。(嘿嘿嘿你懂得,反正就是干坏事辣),不过要实现这么猥琐的事情还是需要比较高的门槛,因为受害者需要插入U盘来执行你的文件。这种攻击不能够直接通过McAfee来预防。但是在这里提起来是因为这也是一种比较猥琐的绕过方法。
3.1.3 Pass The Hash(一种攻击方法名称,真不是我偷懒QAQ)
另一个比较常见的攻击场景是:攻击者已经进入了系统的内部网络。然后使用Pass The Hash的方法进一步攻克其他组件。如果内网主机的管理员账号密码相同,那么可以通过pass the hash远程登录到任意一台主机,操作简单、威力无穷。然后就可以发送命令在远程系统上执行辣~\(≧▽≦)/~。Metasploit中包含了对这种攻击有用的模块,当然了,系统中装了McAfee的可能不吊它。这种肮脏的py交易的内幕是:模块首先将所有命令写入到一个.bat后缀的可执行文件中,然后再执行它。因为.bat文件在白名单中是被禁止的,所以这种攻击也就没什么卵用了。即使如此,这在实际的攻击场景中这只是无谓的抗争终究要被被强行推倒滴。通过修改模块的一行代码实现直接调用所提供的命令。
在下一章我们将会给出一个执行恶意命令的完整执行代码。
3.1.2完整代码执行
典型的用例就是通过所有现有程序的白名单确定正确的操作以此来工具系统的安全,这种方法存在的问题是攻击者可能在白名单中任意加入程序。PowerShell和它的可执行文件”powershell.exe”被安装在所有的新系统中就是这样一个例子。如果系统默认将这种程序列入白名单的话,就可以由攻击者来执行。McAfee应用控制检查的流程是,如果攻击者试图启动PowerShell脚本(一种以.ps1为后缀的文件),只允许白名单内的脚本可执行。然而,道高一尺魔高一丈,这么严密的保护下还是有可能利用powershell.exe.比如通过以下命令来启动calc.exe是有可能的:
[Bash shell]纯文本查看复制代码
?
1
powershell.exe –nop –windows hidden –noni –commandcalc.exe
另一种方法是使用encodedCommand参数,使用此参数可以启动复杂的脚本。以下是PowerShell脚本编码的命令:
[Bash shell]纯文本查看复制代码
?
1
2
3$cmd = ‘calc.exe’
$bytes = [System.Text.Encoding]::Unicode.GetBytes($cmd)
[Convert]::ToBase64String($bytes)
Base64编码输出可以用来从PowerShell调用calc.exe.下面的是一个编码命令启动calc.exe的例子:
[Bash shell]纯文本查看复制代码
?
1
powershell.exe -enc YwBhAGwAYwAuAGUAeABlAA==
通过PowerShell启动已经在白名单中的程序不会很强大,然而,PowerShell会的姿势多着呢。他可以从Windows库中访问和调用一些公开的像CreateThread()或者VIrtualAlloc()之类的函数。结合功能分配额外的内存在当前进程中开启一个新的进程来存储shellcode.
上述技术可用于利用恶意参数启动PowerShell(见“代码执行”章),一个技术是否适合使用取决于具体的攻击方向,系统配置和实际情况。
PowerShell是一个默认在白名单中可以被攻击者滥用的一个例子,这同样说明白名单中很有可能有其他类似的可以被滥用程序存在。调试器是一个例子,因为它们可以在白名单进程开启的情况下写shellcode代码。其他的例子是像Python和Perl一样的脚本解释器,因为它们可以开始执行shellcode。在这两种情况下可以为完成PowerShell指定完整的参数。Python是使用C的 -c ,Perl是使用的 -e 参数去执行脚本中指定的参数。
请注意(敲黑板d=====( ̄▽ ̄*)b),这是非常有可能滴,这样的白名单应用的存在可以被攻击者滥用。