0x01 从一次“消失的”攻击说起

在我参与的一次真实渗透测试中,我的任务是攻破一家金融公司的内部网络。目标明确:获取到他们的客户数据库。然而,面临的一个大问题是他们使用了最新的EDR(终端检测与响应)技术。为了对付这些防护措施,我需要确保我的恶意载荷能够成功执行而不被检测到。这次行动也让我更深入地研究了免杀技术。
这篇文章是我对免杀技术的全面总结,旨在帮助其他安全研究人员理解并掌握这一领域的技能。请注意,本文仅供授权安全测试使用。
0x02 免杀技术背后的魔法
说到免杀技术,首先要了解恶意软件是如何被检测到的。传统的杀毒软件主要通过签名识别和行为监测来发现恶意代码,而现代的EDR系统则结合了机器学习模型和行为分析。为了绕过这些检测机制,免杀技术的目标就是让我们的载荷看起来尽可能“正常”。
技术分解
代码混淆:通过重命名变量、函数,甚至是重新组织代码结构,使得静态分析难以识别。
加壳技术:使用自定义的可执行文件壳来隐藏恶意代码的真实内容。壳程序运行后解密并运行隐藏在其中的恶意代码。
内存加载:直接将恶意代码加载到内存中而不落地于磁盘,许多杀毒软件对内存中的代码检测较弱。
实战思路
有一次我尝试通过内存加载技术来绕过目标的EDR系统。我的想法是利用Go语言的强大功能,编写一个自定义加载器,将恶意代码直接注入到目标进程的内存空间中。这样可以有效避免磁盘上的检测。
0x03 环境搭建与准备工作
在进行任何免杀测试之前,你需要一个可靠的实验环境来验证你的技术。以下是我常用的实验环境:
环境清单
- 虚拟机:我通常使用VirtualBox或VMware来创建多个虚拟机,以模拟目标网络环境。
- 目标系统:Windows 10或Windows Server,安装最新的EDR软件例如CrowdStrike或Carbon Black。
- 开发环境:安装Go语言开发包(go1.17+),以及Visual Studio Code作为IDE。
实验步骤
- 安装EDR软件:确保其正常运行并能够检测常见的恶意行为。
- 准备Go开发环境:确保能够编写、编译Go程序。
- 网络配置:设置虚拟机的网络,使其能够相互访问,模拟企业内网环境。
0x04 Payload构造的艺术
接下来,我会展示如何使用Go语言构造一个免杀的内存加载器。我们需要编写一个简单的加载器,将恶意代码加载到内存并执行。以下是完整的实现步骤。
POC实现
<pre><code class="language-go">package main
import ( "fmt" "os/exec" "unsafe" "syscall" )
// 这是一个简单的示例,展示如何将shellcode注入到内存并执行。 // 这段代码仅供学习研究使用。
func main() { // Shellcode示例,通常是一个反弹shell shellcode := []byte{0xfc, 0x48, 0x83, 0xe4, 0xf0, 0xe8, 0x00, 0x00, 0x00, 0x00}
// 分配内存空间 addr, err := syscall.Mmap(-1, 0, len(shellcode), syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC, syscall.MAP_ANON|syscall.MAP_PRIVATE) if err != nil { fmt.Println("Memory allocation failed:", err) return }
// 将shellcode写入内存 copy(addr, shellcode)

// 定义一个函数指针指向shellcode funcPtr := (uintptr)(unsafe.Pointer(&addr[0]))
// 使用syscall调用 _, _, err = syscall.Syscall(funcPtr, 0, 0, 0, 0) if err != 0 { fmt.Println("Syscall execution failed:", err) return }
fmt.Println("Shellcode executed successfully") }</code></pre>
构造的技巧
- 使用syscall package:直接操控系统内存和执行权限。
- 避免使用显著的API:如CreateProcess等容易被检测到的API调用。
- 内存操作:分配执行权限的内存空间,并直接操作内存地址。
0x05 对抗EDR的初步测试
在完成载荷构造后,下一步就是测试其对抗能力。这里提供一些测试的思路和经验:
测试步骤
- 执行载荷:在安装有EDR的目标虚拟机上运行我们的Go程序。
- 观察EDR响应:查看EDR是否识别到我们的行为。
- 日志分析:检查系统事件日志,寻找是否有异常记录。
对抗经验

有一次,我发现某个EDR能够检测到基于syscall的内存加载行为。通过仔细分析,我发现该EDR主要针对特定API调用进行了行为分析。因此,我尝试使用更深层次的系统调用来替代易被检测的API,从而成功绕过了检测。
0x06 个人经验与总结
在免杀技术的领域,没有一种方法是万能的。攻击者与防御者之间的博弈是不断演进的。在实战中,我的一些经验总结如下:
经验分享
- 不断尝试:新的技术不断涌现,保持对新工具和新方法的学习。
- 了解防御者视角:理解EDR的工作原理,才能更好地绕过它。
- 测试与改进:每次构造载荷后,都需要在严格的环境下测试,找出可能的检测点,并优化代码。

在这次金融公司渗透的案例中,成功的关键在于无声无息地进行攻击,而免杀技术正是实现这一目标的利器。希望这篇文章能为你提供一些实用的思路和灵感。记住,安全测试需要合法授权,所有技术都应在授权的环境下使用。