引言
无文件攻击已经存在多年。然而,它们在绕过杀毒软件和增加检测与响应难度方面仍然非常有效。
不仅如此,由于主要依赖可能随版本变化的文件哈希和 IoC,无文件攻击还使威胁情报分析变得更加困难。
在本文中,我们将探讨什么是无文件攻击,它们的组成部分,以及如何检测、调查并保护组织免受其害。
什么是无文件攻击?
无文件攻击是一种避免向磁盘写入文件的攻击类型。它们可能包含完全在内存中运行的恶意代码,利用合法的系统工具和进程来执行其有效载荷。
这并不意味着无文件攻击完全不写入文件。它们可能从带有宏的恶意文档或 .LNK 文件(桌面快捷方式)开始,但攻击的其余部分则变为无文件形式。
攻击者不是在目标系统上投放更多的可执行文件或脚本,而是直接将恶意代码注入到正在运行的进程中,或使用 PowerShell、Windows Management Instrumentation (WMI)、LOLBAS/LOLBINS 和注册表键等 Windows 内置工具来实现其目标。
为什么选择无文件攻击?
这些复杂的攻击特别危险,因为它们可以绕过传统的基于文件的安全解决方案,并在系统上留下最少的痕迹。
它们还可以绕过数字取证并且不留下非易失性痕迹。使用 KAPE 获取磁盘副本或收集工件可能无济于事。
此外,如果恶意软件不打算维持持久性(系统重启时自动运行),一旦重启系统,这个恶意软件可能就不会留下任何痕迹。这打破了事件响应和调查过程。
最后,无文件攻击有助于绕过白名单。依靠 Microsoft 的合法应用程序和受害者广泛使用的其他工具可以帮助绕过对执行未知或恶意可执行文件的任何限制。
同时,无文件攻击更容易实施,脚本更容易混淆,并在多个方面使攻击更加高效。即使是维持持久性也可以通过包含 PowerShell 脚本的注册表值轻松实现。
关于无文件攻击的误解
以下是你需要了解的关于无文件攻击的一些误解:
•“无文件攻击是新技术”
无文件攻击已经存在超过二十年了。2001 年的 Code Red 蠕虫就是早期无文件攻击的一个很好的例子,它在不向磁盘写入文件的情况下感染了数千个系统。
•“攻击完全是无文件的”
大多数无文件攻击在某个时点仍会与文件系统交互。它们通常结合使用无文件和基于文件的技术,使其成为混合威胁而不是纯粹的无文件操作。
如我们之前所说,比如写入带有宏的恶意文档或 .LNK 文件。
•“无文件攻击很罕见”
根据最近的安全报告,大约三分之一的攻击是无文件攻击或采用无文件技术。这使其成为当今网络环境中一个重要且常见的威胁。
•“传统杀毒软件可以阻止无文件攻击”
传统杀毒解决方案通常难以应对无文件攻击,因为它们主要依赖基于文件的检测方法。这就是为什么需要专门的基于行为的安全解决方案来有效防护无文件威胁,比如 EDR(终端检测响应)或类似的基于主机的入侵防御系统。
无文件攻击的组成部分和技术
1. 脚本引擎
PowerShell
PowerShell 是攻击者最常用的脚本语言之一。它提供了对大多数 Windows 功能的访问,内置于 Windows 中,并且可以直接在内存中加载 C# 模块(以及像 C++ 一样访问 Windows API)。
Microsoft 试图在 PowerShell 中提供不同的安全功能来限制攻击者的使用,如 AMSI、脚本日志记录等,但它仍然被当今的攻击组织广泛使用。
在这个简单的脚本中,攻击者下载了一个额外的 PowerShell 载荷并在内存中执行它(无需写入磁盘)。“iex” 指令是 “Invoke-Expression” 的简写/别名,用于执行代码。
“New-Object Net.WebClient” 是一个与 Microsoft .Net 类(本例中的 Net.WebClient)交互的 PowerShell 代码,用于创建一个基于代码的网络浏览器,通过 “DownloadString” 下载恶意软件。
APT 41 PowerShell C&C 通信,来源:https://threatmon.io[1]
这是 APT41 在 C&C 通信中使用 PowerShell 的另一个例子。
在这个脚本中,恶意软件向攻击者发送一些信息,包括公共 IP(来自 ip-api.com)、网络适配器信息、操作系统信息、防病毒软件信息和用户信息(whoami)。
因此,PowerShell 可以用作第一阶段的下载和执行脚本,也可以作为完整的恶意软件发送受害者信息并执行命令。
使用像 Invoke-Obfuscation[2] 或 AMSI.Fail[3] 这样的工具,攻击者可以绕过 PowerShell 的安全功能并绕过防病毒扫描。
VBScript 和 Javascript
另外两种常见的脚本语言是 Javascript 和 VBScript。这两种脚本语言可以在恶意软件的第一阶段与 COM Scriptlets 一起使用,甚至可以通过 wscript.exe 应用程序实现非完全无文件的方式。
这些语言不像 PowerShell 那样提供从命令行运行内联脚本的能力,但它们可以从 XML 文件或其他不常见类型的文件中执行。
此外,它们提供了执行应用程序(包括带有内联脚本的 PowerShell)的能力,或者使用 DotNetToJScript 在内存中加载完整的 C# 模块。
你可以在这里阅读更多关于 COM 对象在红队中的应用:
COM Objects P.1: The Hidden Backdoor in Your System[4]
恶意 JavaScript 代码示例:
这是一个下载和执行的 JavaScript 代码,它会下载一个额外的脚本。它不会将脚本保存到磁盘,而是使用 “eval” 命令直接在内存中执行。
2. LOLBAS/LOLBINS
Microsoft 有许多合法的应用程序可以被滥用来下载、解码和执行有效载荷,这些操作可以直接在内存中进行,也可以在磁盘上进行。
LOLBAS 项目[5]提供了一个可被滥用的各种应用程序的列表,包括它们可以被用来做什么,以及如何滥用它们。
’ fill=‘%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
LOLBAS 项目:https://lolbas-project.github.io[6]
你可以使用这些合法的应用程序在系统空闲时下载和执行恶意软件,比如使用 bitsadmin
这些 bitsadmin 命令创建了一个用于下载恶意软件有效载荷的新任务。它会在系统空闲时下载恶意软件,并使用 /SetNotifyCmdLine 在下载后执行恶意软件。
这种方法也可以用于下载编码的有效载荷,然后使用其他 LOLBIN 工具进行解码和执行。
另一个例子是 APT41 使用 ForFiles.exe 来执行命令提示符命令。
这个工具用于文件搜索和匹配,它能够在找到匹配项时执行应用程序(在这个例子中是 notepad.exe)在特定文件夹中(本例中是 system32)。
’ fill=‘%23FFFFFF’%3E%3Crect x=‘249’ y=‘126’ width=‘1’ height=‘1’%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
APT41 — 使用 ForFiles.exe 合法应用程序维持持久性 — 来自 https://threatmon.io[7]
你也可以在我们的文章中了解其他 LOLBIN:
COM Objects P.2: Your Stealthy Fileless Attack[8]
3. 内存注入
内存注入是无文件攻击中最常见的技术之一。它允许攻击者将其恶意软件及其行为伪装成受害者已在使用的合法工具。
攻击者可能会针对 chrome.exe 来伪装恶意通信,使其看起来像正常浏览,可以通过代码注入或甚至使用恶意扩展来实现。
他们还可以将代码注入到 svchost.exe(服务主机进程)中,将恶意软件伪装成服务。一些恶意软件甚至会专门创建自己的 svchost.exe 用于注入。这通常与一种称为进程空心化的已知内存注入技术一起使用。
进程空心化最早在 Stuxnet 恶意软件中引入,是一种专门用于运行恶意软件的技术,它通过执行合法应用程序来实现。其工作原理如下:
-
恶意软件以暂停模式打开一个进程
-
它用恶意软件替换内存空间中的合法应用程序代码
-
最后,它恢复进程的执行
完成这个过程后,合法应用程序不再存在于内存中;只剩下恶意软件,它是该进程空间中唯一执行的代码。
你可以在这里阅读我的完整 Stuxnet 分析报告:
Stuxnet 恶意软件分析报告[9]
内存注入可以通过注入到持续运行的进程或服务中来保持运行并避免被检测。这可能是 Tomcat.exe 或任何其他不间断运行的服务/应用程序。
4. 其他技术
攻击者可能使用其他脚本,如 bash 脚本、AppleScript、Python 或其他语言来维持持久性。
他们可能使用带有宏(VBA 脚本)的恶意文档进行初始访问,然后随时间推移转向更多可下载的有效载荷。
他们可能使用 WMI 和 RPC 协议在其他系统上远程执行恶意软件。
最后,他们可能仅使用 Active Directory 来维持持久性,同时使用其他应用程序,如用于 RDP 隧道的 ngrok 或用于持久性的 TeamViewer,以及用于数据窃取的 rclone 或 sftp。
无文件攻击检测与响应建议
要应对无文件攻击,你需要:
-
更多可见性: 你需要通过实施终端检测响应(EDR)或任何主机入侵防御系统(HIPS),如 sysmon 或 OpenEDR,来获得对终端和服务器的可见性
-
内存分析与监控: 能够看到主机活动很重要,但如果没有能力深入挖掘机器本身的原始数据,你可能会错过很多信息。 EDR 和 sysmon 可能被关闭或静音,你需要能够使用内存分析工具如 volatility,或使用 KAPE[10] 或 Kansa[11] 框架收集易失性和非易失性数据。 它们也可能有助于检测 EDR 无法看到的内存注入
-
PowerShell 日志记录与监控: PowerShell 是攻击者最常用的脚本语言。PowerShell 日志记录不是最佳解决方案,但它为检测恶意脚本提供了额外的防御层
-
启用 PowerShell 受限语言模式: 受限语言模式可以帮助防止使用某些 .Net 类、Win32 API 调用和其他可能的恶意脚本。 受限语言模式可以通过降级到 PowerShell V2、通过其他方式加载程序集或其他技术来绕过。因此,在实施受限语言模式时,确保遵循最佳实践
-
Active Directory 监控与加固: Active Directory 配置错误和缺乏监控不仅会为攻击者留下横向移动的开放门户,还会让他们在域内维持多年的持久性。确保在 Active Directory 上实施监控工具(如 Microsoft Defender for Identity),并使用红队服务主动测试其弱点
结论
无文件攻击已经存在多年。然而,它们在绕过防病毒软件和使检测与响应变得更困难方面仍然相当有效。
它们依赖于滥用 Microsoft 合法应用程序,利用不同的脚本语言和内存注入,在不接触磁盘的情况下从一个阶段移动到另一个阶段,从一个有效载荷移动到另一个有效载荷。
你不能 100% 依赖传统的防病毒产品,而是需要在终端和服务器上实施终端检测响应,监控 PowerShell 活动和 Active Directory 攻击。
参考资料
[1]
https://threatmon.io:_https://threatmon.io/_
[2]
Invoke-Obfuscation:_https://github.com/danielbohannon/Invoke-Obfuscation_
[3]
AMSI.Fail:_https://amsi.fail/_
[4]
COM Objects P.1: The Hidden Backdoor in Your System:_Medium
[5]
LOLBAS 项目:_LOLBAS
[6]
https://lolbas-project.github.io:_LOLBAS
[7]
https://threatmon.io:_https://threatmon.io/_
[8]
COM Objects P.2: Your Stealthy Fileless Attack:_Medium
[9]
Stuxnet 恶意软件分析报告:_Stuxnet Malware Analysis Paper- CodeProject
[10]
[11]