C2concealer 是一个命令行工具,用于生成随机化的 C2 可塑配置文件,供 Cobalt Strike 使用。
git clone https://github.com/RedSiege/C2concealer.git
cd C2concealer
python3 -m venv .venv
source .venv/bin/activate
pip3 install -e .
请参阅 Docker 说明
用法:
$ C2concealer --hostname google.com --variant 3
标志:
(可选)
--hostname
用于 HTTP 客户端和服务端设置的主机名。默认值:无。
--variant
一个整数,定义要生成的 HTTP 客户端/服务端变体数量。
建议设为 1 到 5。最大值为 10。
root@kali:~# C2concealer --variant 1 --hostname google.com
[i] 正在搜索系统中的 c2lint 工具(Cobalt Strike 的一部分)。可能需要 10-20 秒。
[i] 在 /opt/cobaltstrike/c2lint 目录下找到了 c2lint。
选择一个 SSL 选项:
1. 自签名 SSL 证书(仅需输入一些详细信息)
2. Let's Encrypt SSL 证书(需要将相关域名的临时 A 记录指向本机)
3. 现有的密钥库
4. 不使用 SSL
[?] 请选择选项 [1/2/3/4]:
提示:请始终使用 SSL 证书。最好是 Let's Encrypt 或类似机构颁发的证书。 提示:HTTP 变体允许你为不同的 Beacon 选择不同的 HTTP 流量 IOC。建议值至少为 1。
我们仔细研究了 Cobalt Strike 文档,并为每个配置属性定义了合理的取值范围。有时这些数据只是某个范围内的随机整数,有时我们需要从 Python 字典中随机选取一个值。无论如何,我们首先定义了能够构成有效配置文件的数据,然后开始构建工具。
接着,我们将可塑配置文件的每个部分(或块)拆分成单独的 .py 文件,其中包含随机抽取每个属性适当值的逻辑,然后为该配置块输出格式化的字符串。我们将所有配置块拼接在一起,运行一些简单的一致性检查,然后通过 Cobalt Strike 的 linter(c2lint)对配置文件进行验证。生成的结果是一个应该可以在你的行动中使用的配置文件。我们始终建议在实际运行活动之前测试配置文件(包括进程注入和派生)。
如果你正在研究代码,建议从这两个文件开始:/C2concealer/__main__.py 和 /C2concealer/profile.py。阅读注释后,可以查看 /C2concealer/components 文件夹中的各个配置块生成器。
这一点至关重要。这是一个开源工具。安全厂商可以轻易地为它生成的配置文件编写签名。虽然运行工具能为构建 Cobalt Strike 可塑配置文件提供良好的起点,但建议深入以下领域,自定义用于填充生成配置文件的数据:
/C2concealer/data/
此外,你可以自定义整个配置生成过程中的各种属性。例如,在文件 /C2concealer/components/stageblock.py 中,你可以更改 PE 镜像大小值的取值范围(靠近第 73-74 行)。请仔细查看 components 目录中的所有不同文件。
如果你已经读到这里,那么我们知道你会充分利用这个工具。我们推荐将该工具视为:我们已经构建了自动生成这些配置文件的骨架代码。现在,你需要思考每个属性在行动中合理的取值,并更新数据源。
虽然我们已经涵盖了 Malleable C2 配置语言中许多可能的选项,但仍有许多选项我们没有设置。强烈建议查阅 Malleable Command and Control 文档 并修改你的配置文件。
以下选项未被设置,或由 C2concealer 静态设置,你应该考虑更改它们。
http-config 块| 缺失选项 | 说明 |
|---|---|
set block_useragents | 阻止非 Beacon 的 UA 模式 |
set allow_useragents | 允许特定 UA 模式(CS 4.3+) |
stage 块process-inject 块post-ex 块| 缺失选项 | 说明 |
|---|---|
set pipename | 用于 post-ex 任务的命名管道 |
dns-beacon 块| 缺失选项 | 说明 |
|---|---|
set ns_response | drop/idle/zero NS 处理。未设置时默认为 drop。 |
set dns_stager_prepend | 在暂存有效载荷前附加数据 |
| 缺失转换 | 说明 |
|---|---|
lznt1 | 压缩——未出现在任何编码链中 |
rc4 "key" | 加密——未出现在任何编码链中 |
xor "key" | XOR——未出现在任何编码链中 |
特别感谢 Raphael Mudge 不断改进可塑配置文件的功能集和相关文档。同时,非常感谢 @killswitch-GUI 开发的用于在 CS 团队服务器上自动生成 Let's Encrypt 证书的脚本。最后,两篇博客文章让工作变得轻松许多:@bluescreenofjeff 的文章(https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/)和 Joe Vest 的文章(https://posts.specterops.io/a-deep-dive-into-cobalt-strike-malleable-c2-6660e33b0e0b)。
版本 1.0
版本 1.1
| 缺失选项 | 说明 |
|---|
set allocator | 硬编码为 VirtualAlloc;缺少 HeapAlloc、MapViewOfFile 随机化 |
set magic_mz_x86 / magic_mz_x64 | MZ 头欺骗 |
set magic_pe | PE 标记欺骗 |
set rich_header | 编译器元数据欺骗 |
set module_x86 / module_x64 | 模块踩踏 |
set copy_pe_header | — |
set data_store_size | — |
set eaf_bypass | EAT 检查绕过 |
set syscall_method | 无/直接/间接(CS 4.8+) |
set rdll_loader | PrependLoader/StompLoader |
set rdll_use_syscalls | — |
set rdll_use_driploading | — |
set rdll_dripload_delay | — |
transform-obfuscate 块 | base64、lznt1、rc4、xor 选项完全缺失 |
transform-x86/x64 中的 append | 仅使用了 prepend 和 strrep |
| 缺失选项 | 说明 |
|---|
set allocator | 硬编码为 VirtualAllocEx;缺少 NtMapViewOfSection 随机化 |
set use_driploading | — |
set dripload_delay | — |
transform-x86/x64 中的 append | 仅使用了 prepend |
Execute: NtQueueApcThread | 未出现在 execute 块中 |
Execute: NtQueueApcThread-s | 未出现在 execute 块中 |
Execute: ObfSetThreadContext | 未出现在 execute 块中 |
Execute: SetThreadContext | 未出现在 execute 块中 |
| Execute 函数欺骗 | 不支持 module!function+0x## 语法 |
uri-append |
| 终止语句——未实现 |