我写了一个C2,CrowdStrike没发现

admin 2026-08-04 08:18:38 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文探讨了在2026年企业级EDR环境下自研C2的工程实践。核心观点是C2的本质是网络流量编排,Beacon需模仿人类行为实现无规律间歇外连以规避检测。文章详细介绍了绕过EDR的关键技术,包括使用直接系统调用绕过userlandhooking、通过睡眠混淆和内存加密规避内存扫描、利用DLL侧加载实现白加黑免杀,以及构建CDN-Lambda-APIGateway多层重定向链。文章强调免杀是工程问题而非玄学,关键在于让恶意软件的行为与正常软件无异。 综合评分: 90 文章分类: 红队,内网渗透,安全工具,实战经验,免杀


cover_image

我写了一个C2,CrowdStrike没发现

原创

SchneiderGrace SchneiderGrace

云影安全实验室

2026年7月27日 15:23 山西

在小说阅读器读本章

去阅读

红队工程师圈有个段子:EDR 厂商的年度 KPI 里有一条叫”检测到 Cobalt Strike 默认 Beacon 的次数”。我不确定这是不是真的,但我确定另一件事——2026 年,仍然有大量红队队员在用未修改的公共 C2 框架打靶场。他们相信 VPN 隧道和域前置就足够隐蔽,然后被蓝队的 SOC 分析师在 15 分钟内从床上叫起来。

这不是我编的。Casey Erdmann 在 Red Team Engineering 里有一句话我反复划线:“Malware is just software.” 恶意软件不过是软件。你把这句话反过来读也一样:你写的每一行代码,不管是 Python、Go 还是 Rust,在 EDR 眼里都是平等的——它只关心行为,不关心你的意图。

然而大多数人学 C2 开发的时候,盯着的是功能而不是指纹。今天我们就来拆开聊一聊:一个能活过 2026 年企业级 EDR 的自研 C2,从设计哲学到链路细节,到底长什么样。


一、你的 Beacon 长什么样?

大多数人对 C2 的认知停留在”客户端和服务端通过某个协议通信”。但 Erdmann 在书里反复强调一件事:C2 的本质是网络流量的编排。你选择什么协议、什么方向、什么节奏,决定了你的 implant 能不能活过第一轮 EDR 扫描。

我们来做一道选择题。以下哪种网络模式最容易触发 EDR 告警?

A. TCP Bind Shell,监听在 0.0.0.0:4444

B. HTTP GET 轮询,每隔 60 秒拉一次指令

C. HTTPS Beacon,随机 jitter 90-120 秒,User-Agent 伪装为 Chrome 120

答案是 A 和 B 都不太行,C 勉强及格。A 的问题是端口监听——任何主机防火墙和 EDR 的网络检测模块都会立刻标记一个非系统进程绑定在高位端口上。B 的问题在于周期性特征——每 60 秒精准一次的外连请求,连最基础的 NetFlow 分析都能把它从背景噪声里挑出来。

真正能活的 Beacon,它的通信模式要模仿人的行为。人在浏览器里访问网站是什么节奏?打开 Twitter,滚动 3 秒,停下来看 15 秒,然后点开一个链接,又是一段不规律的停顿。你的 Beacon 就该这样——无规律的间歇性外连,混合多个目标域名,在正常 HTTPS 流量里消失得无影

这叫”流量叙事”。蓝队在看流量图的时候,人眼的 pattern recognition 非常强。你要做的不是加密,而是让你的 Beacon 的流量”讲一个合理的故事”。


二、Go 写 implant,Python 写 server,别这么天真

Erdmann 在第三章带着读者用 Go 写了一个文件读写和加密的小程序,然后用 Python 搭建 C2 服务端。这个组合在教学上很合理——Go 编译出来是独立二进制,天然适合做 implant;Python 开发快,适合做服务端逻辑。但在真实对抗环境里,光是这样远远不够。我来补充几个 2026 年绕 EDR 的关键细节:

2.1 别用 os/exec,用 syscall

你的 implant 需要执行命令对吧?直觉是 os/exec.Command("cmd", "/c", "whoami")。问题在于,这个调用链在 EDR 的 userland hooking 里属于”高优先级检测对象”——CreateProcessW、NtCreateProcess 这一串 Windows API 全部被 hook 了。

2026 年的做法是绕过这些 hook。你可以直接使用 Windows syscall,自己维护一张 syscall 表,用 syscall.SyscallN() 直接调用内核级函数。这样绕过了 ntdll.dll 上的 EDR hook,userland 层面的检测直接失效。

更进一步:你不需要每次都直接调用 NtCreateProcess。可以把命令注入到一个已有的可信进程里——比如利用 WMI 的 Win32_Process.Create 或者更优雅的 COM 对象劫持——让 Explorer.exe 或者 svchost.exe 来执行你的命令,EDR 看到的只是一个正常的系统行为。

2.2 Sleep 不是用来偷懒的,是用来藏身的

C2 Beacon 的 sleep 间隔是所有检测规则里被写得最多的特征之一。固定的 60 秒 sleep = 自首。你需要的不是 time.Sleep(60 * time.Second),而是:

1. Jitter(抖动):每次 sleep 的时间在 30%-50% 的范围内随机波动

2. Masking(掩蔽):sleep 期间不要空转,去读取注册表、遍历进程列表、检查更新——做一些看起来像正常程序的行为

3. Sleep Obfuscation:2026 年 EDR 已经进化到会扫描 sleep 状态下的内存了。你的 implant 在 sleep 期间应该把自己的 shellcode 区域加密(比如 XOR 或用 AES-NI 指令快速加解密),等 wake 的时候再解密回来。这样 EDR 做内存扫描的时候看到的就是一片无意义的字节,而非一个完整的 C2 payload。

2.3 签名?不需要。白加黑更好用。

很多人以为免杀的终极武器是拿到一个有效的代码签名证书。且不说成本,一个签了名的未知二进制在首次执行时仍然会触发 EDR 的云沙箱分析。

更实用的方法是用”白加黑”(DLL Side-Loading):找一个有合法签名的应用程序,利用它的 DLL 搜索顺序漏洞,把你的恶意 DLL 放在它旁边。比如找一个带有有效数字签名的老版本应用程序——它们会尝试加载某个特定 DLL,你只要把你的 implant 编译成同名 DLL 就行。EDR 看到的是”一个合法签名程序加载了一个 DLL”,而不是”一个未知程序被执行”。


三、HTTPS Beacon 还不够——C2 重定向链

Erdmann 用一整章(第十章)讲 C2 Redirector。他的方案是用 AWS Lambda 做无服务器重定向——这个思路非常漂亮,因为 Lambda 函数的 IP 是动态且可无限轮换的,蓝队即使封 IP 也封不完。

但我补充一个实战中的关键细节:重定向链的分层策略

你的 implant 不应该直接连你的 C2 server。正确的链路应该是:

Implant -> CDN (Cloudflare/Azure CDN) -> AWS Lambda -> AWS API Gateway -> Teamserver

CDN 层:提供真实业务域名的 TLS 证书,流量的 SNI 看起来是访问一个正常的网站

Lambda 层:做请求验证和过滤。只有携带正确 “Authorization” header(没错,伪装成 Bearer Token)的请求才会被转发,其余的直接返回 404

API Gateway 层:做速率限制,防止 blue team 的 scanner 大量请求分析你的后端

这样当蓝队拿到了你的 implant 样本、逆向出了 C2 地址之后,他们只能看到一个 CDN 域名。封掉这个域名?Edge 上发个请求,换一个新的 Lambda 函数,十分钟就重建好了。更狠的是用域前置(虽然 Cloudflare 和 AWS 2026 年的态度越来越紧,但总有新的 CDN 还没封),让你甚至不需要拥有域名。


四、EDR 真正的软肋:它在看什么?

聊完攻击面,我们来看看防守方的逻辑。理解 EDR 的检测管道,才知道怎么绕。EDR 的检测通常走三条路:

Userland Hooking

最常见的手段。ntdll.dll里的关键函数(NtCreateThread、NtAllocateVirtualMemory、NtWriteVirtualMemory 等)被注入一个 JMP 指令,跳转到 EDR 的检测引擎。参数被检查后,如果”干净”,才继续执行真实的内核调用。 绕法:前面说的直接 syscall。或者更高级的做法——把 ntdll.dll 的一份干净副本从磁盘读进内存,覆盖掉被 hook 的版本。这叫”unhooking”。

ETW(Event Tracing for Windows)

微软自己提供的”官方 hook”,大量安全产品依赖 ETW 提供的事件数据。你调用了 .NET 的 Assembly.Load()?ETW 会记录。你用了 PowerShell?ETW 也有记录。 绕法:EtwEventWrite 的 patch。在你的 implant 启动的早期阶段(越早越好),用一小段 shellcode 把 EtwEventWrite 函数的开头改成 ret。从此之后你在这个进程里做的任何事都不会被 ETW 记录。注意:这也意味着你自己的 implant 也失去了 ETW 的可见性——这是双刃剑。

Kernel Callbacks

EDR 注册内核回调(PsSetCreateProcessNotifyRoutine、ObRegisterCallbacks 等)来感知进程创建、线程创建、句柄操作。这层在 kernel 里,你从 userland 绕不掉。 绕法:不是技术绕过,而是行为伪装。不要创建新进程(用进程注入代替),不要创建远程线程(考虑用 APC 注入),不要用 VirtualAllocEx 分配高权限内存(用 CreateFileMapping + 映射到目标进程)。每一步都看起来像一个正常程序在做一个合理的操作。


五、C2 全家桶选型终极对比

最后来一个 C2 框架的横向对比,帮你在不同场景下选对工具:

| 框架 | 协议 | 优势 | EDR 现状 | 适用场景 | | — | — | — | — | — | | Cobalt Strike | HTTP/HTTPS/DNS/SMB | 生态成熟、团队协作强 | 默认 Beacon 已被几乎所有 EDR 签名 | 需 Malleable C2 自定义 | | Sliver | HTTP/HTTPS/mTLS/WireGuard | 开源、多协议原生支持、多玩家模式 | 默认 implant 未被广泛签名,但行为特征已被注意 | 中小规模行动 | | Havoc | HTTP/HTTPS/SMB | C2 界新锐、界面好、Kernel 注入强大 | 知名度较低,默认 profile 尚未被重点检测 | 开源 + 现代 UI | | Metasploit | HTTP/HTTPS/TCP | 最好用的后渗透模块库 | 签名最全、检测规则最成熟 | 仅用于教学和靶场 | | 自研 C2 | 完全自定义 | 独一档的免杀能力 | 不存在签名 | 高级红队行动、APT 模拟 |

Erdmann 在这本书里给了你自研 C2 的完整基础——从 Python socket 编程到 Go 跨平台编译,从 HTTP 协议封装到数据库存储。剩下的事情是你的创造力和对 EDR 工作原理的理解。


六、结语

Malware is just software. EDR is just software too.

把这句话记住,你就不会把免杀当成玄学。它是一道工程题,不是一道魔法题。你的 implant 在内存里干了什么、在网络上发了什么、在磁盘上落了什么,这些东西 EDR 看得一清二楚——你只需要确保它们看起来和正常软件一模一样。

Casey Erdmann 在书的扉页写了一句 “This book is dedicated to you, the hacker.” 我想补充一句:在 2026 年做一个 hacker,不是会用工具,而是知道工具为什么工作——以及怎么让它们在你需要的时候,停止工作。

下次上红蓝对抗前,别急着打开 Cobalt Strike。问自己一个问题:我的 Beacon 在 EDR 眼里,长得像什么?


关注我们,获取更多红队技术深度内容。

参考资料:Casey Erdmann, Red Team Engineering: The Art of Building Offensive Tools and Infrastructure, No Starch Press, 2026.


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:云影安全实验室 SchneiderGrace SchneiderGrace《我写了一个C2,CrowdStrike没发现》

评论:0   参与:  0