引言:当防守方开始监控磁盘文件时,进攻方就“住”进了内存里。本期我们将深入现代攻防中最棘手的领域——无文件攻击(Fileless Attack)。作为网安工程师,你需要明白:如果恶意代码从不落地,传统的杀毒软件和文件完整性校验将全部失效。
一、什么是无文件攻击(Fileless)?
定义:恶意代码直接在内存中执行,不在硬盘上写入可执行文件(PE文件)。
核心逻辑:
-
载体:利用合法的、已签名的系统程序(如 PowerShell, WerFault.exe)作为“容器”。
-
载荷:Shellcode 或 DLL 直接注入容器。
-
结果:重启即失,取证困难。
|
攻击类型 |
存储介质 |
检测难度 |
典型案例 |
|---|---|---|---|
|
传统攻击 |
硬盘 (EXE/DLL) |
低 (Hash 可查) |
盗号木马 |
|
无文件攻击 |
内存 (RAM) |
高 (需内存取证) |
APT29, Powershell Empire |
二、核心技术剖析:如何让代码“凭空出现”
1. 反射型 DLL 注入 (Reflective DLL Injection)
这是红队的标配技术。
-
原理:普通 DLL 需要操作系统帮忙加载(
LoadLibrary),这会留下文件痕迹。而反射注入是自己写一段加载器(Reflective Loader),把 DLL 的数据复制到内存,手动修复 IAT 和重定位表,然后执行。 -
防御视角:由于绕过了
LoadLibrary,你在 Sysmon 的 Event ID 7 (Image Loaded) 中看不到这个 DLL 的加载记录。
2. 进程镂空 (Process Hollowing)
-
原理:
-
启动一个合法进程(如
svchost.exe),但挂起它 (CREATE_SUSPENDED)。 -
把该进程内存中的合法代码 挖掉(UnmapViewOfSection)。
-
将恶意代码 写入(WriteProcessMemory) 到该内存空间。
-
恢复线程执行。
-
-
表象:任务管理器里跑着
svchost.exe,但实际上是木马。
3. 模块踩踏 (Module Stomping)
-
原理:不创建新内存,而是覆盖一个已经被加载的合法模块(如
user32.dll的一部分)。 -
防御难点:内存扫描时看到的模块名依然是合法的
user32.dll。
三、防御实战:如何捕捉“看不见”的敌人
既然没有文件,我们就必须监控内存行为和进程血缘。
1. 检测异常的内存权限
核心指标:RWX(Read-Write-Execute)。
-
正常情况下,代码段应该是
R-X,数据段是RW-。 -
如果一段内存同时拥有 写 和 执行 权限,99% 是 Shellcode。
-
工具:使用 Process Hacker 或 Moneta(内存扫描工具)查看进程的 Memory Map。
2. 检测“孤儿”线程 (Orphaned Threads)
-
现象:
powershell.exe创建了一个线程,但该线程的起始地址不在powershell.exe或.NET的模块范围内,而是在一块私有的MEM_PRIVATE内存区域。 -
Sigma 规则逻辑:
-
检测线程起始地址位于
PAGE_EXECUTE_READWRITE区域。 -
检测线程没有关联的符号文件。
-
3. 针对 PowerShell 的无文件攻击防御
无文件攻击最常利用 PowerShell。
-
Script Block Logging:开启 PowerShell 脚本块日志(Event ID 4104)。即使代码在内存中解密执行,日志也会记录明文。
-
AMSI (Antimalware Scan Interface):确保 AMSI 已启用。虽然攻击者会尝试 Patch AMSI,但这本身又是一个检测点。
四、实战演练:使用 Volatility 进行内存取证
假设你抓取了一份可疑主机的内存镜像(memory.raw),如何证明存在无文件攻击?
步骤 1:查看异常进程
volatility -f memory.raw windows.pslist.PsList
-
疑点:发现一个
svchost.exe的父进程是winword.exe(Word文档启动了服务进程?)。
步骤 2:检测进程镂空 (HollowFind)
volatility -f memory.raw windows.hollowfind.HollowFind
-
输出:显示哪个进程的 Header 与实际内存内容不匹配。
步骤 3:提取 Malfind 可疑代码
volatility -f memory.raw windows.malfind.Malfind --dump
-
分析:如果导出的
.dmp文件包含MZ头(PE文件头),说明有代码注入。
五、高级防御策略:硬件与固件层
随着内存攻击的泛滥,防御也在升级:
-
LSASS 保护:启用 RunAsPPL,防止非特权进程读取 LSASS 内存(Credential Dumping 的核心)。
-
ACG (Arbitrary Code Guard):阻止进程内存变成可执行(阻止 RWX 生成)。
-
CET (Control-flow Enforcement Technology):Intel CPU 级别的影子栈保护,防止 ROP 攻击。
六、总结与下期预告
本期我们攻克了无文件攻击这一高地。请记住:在无文件攻击面前,你的日志(Event Logs)比你的杀软更有用。 监控内存权限变化和线程起始地址,是发现高级威胁的关键。
下期预告:
第五期:合法工具的武器化(Living off the Land, LotL)。我们将聚焦于攻击者如何滥用 CertUtil, BITSAdmin, MSBuild等系统自带工具来下载和执行代码。你将会学到如何区分“管理员在干活”和“黑客在干活”。
💡 防御者备忘录
下次当你看到
wscript.exe或cscript.exe启动了cmd.exe,请立即检查它们的命令行参数。如果参数是-ep bypass或-enc,请直接断网处置。

906

被折叠的 条评论
为什么被折叠?



