
Genera configurazioni di reindirizzamento Caddy da profili Cobalt Strike o Sliver C2.
CaddySmith è un piccolo script Python che legge un profilo C2 di Cobalt Strike o Sliver e genera una configurazione per il server web Caddy. Il Caddyfile generato trasforma un normale server Linux in un redirector: il traffico legittimo dei beacon viene inoltrato tramite proxy inverso al team server, mentre tutto il resto (scanner, bot di ricerca, sonde blu team, curl casuali) viene reindirizzato a un URL esca.
L'ho scritto perché Caddy è un server web molto più semplice da configurare rapidamente rispetto ad Apache: è un singolo binario statico, ha certificati Let's Encrypt automatici e non richiede il ballo di a2enmod.
Solo per engagement autorizzati. Si tratta di strumentazione offensiva di sicurezza. Eseguila solo su ambienti per i quali hai un'autorizzazione scritta per i test.
CaddySmith rileva automaticamente il formato dal contenuto del file:
set uri "/foo". Ogni URI di HTTP-GET / HTTP-POST diventa una route esatta con gli header client del profilo applicati.path /api* /static* /resources*) ed effettuando una corrispondenza parziale sul numero di build di Chrome presente nello User-Agent (che sopravvive alle riscritture dello UA specifiche per piattaforma di Sliver).Puoi anche forzare un parser specifico con --profile-type cobaltstrike o --profile-type sliver.
Dato un file di profilo, lo script estrae:
--server-name)set host_stage)Poi costruisce un Caddyfile che:
.env, /wp-admin, .php, ecc.)pip install)python3 caddysmith.py my.profile \
--backend https://teamserver.internal:443 \
--decoy https://www.example.com/ \
--server-name redirector.example.com \
--email [email protected] \
--forbid-http \
-o redirector.caddy
Scrive la configurazione generata in redirector.caddy e stampa un riepilogo di ciò che ha fatto su stderr.
Copia il file generato sul redirector ed esegui Caddy su di esso. È necessario il flag --adapter caddyfile perché Caddy di default usa la configurazione in JSON:
caddy run --config /etc/caddy/redirector.caddy --adapter caddyfile
Per ricaricare un'istanza in esecuzione con una configurazione aggiornata:
caddy reload --config /etc/caddy/redirector.caddy --adapter caddyfile
Se Caddy segnala problemi di formattazione, pulisci con:
caddy fmt --overwrite /etc/caddy/redirector.caddy
Metti il file in /etc/caddy/ e importalo dal tuo Caddyfile principale:
# /etc/caddy/Caddyfile
import /etc/caddy/redirector.caddy
Se hai passato --email (consigliato), il frammento generato contiene già il blocco delle opzioni globali, quindi il Caddyfile principale necessita solo della riga import. Se non lo hai fatto, aggiungi l'email manualmente in un blocco { } sopra l'import.
Poi convalida e ricarica:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Caddy fornirà automaticamente un certificato Let's Encrypt per il dominio specificato in --server-name fintanto che il record A punti al redirector.
Strict è ciò che di solito si vuole. Lax è utile quando stai debugando perché un vero beacon non si connette.
Supponiamo che tu abbia un profilo che imita un endpoint di Amazon e che desideri distribuirlo su redirector.0xtb.sh:
python3 caddysmith.py amazon.profile \
--backend https://10.1.1.10:443 \
--decoy https://www.amazon.com/ \
--server-name redirector.0xtb.sh \
--forbid-http \
--policy strict \
-o /etc/caddy/redirector.caddy
Il riepilogo mostra esattamente quali route sono state costruite, ad esempio:
Routes built: 2
- [profile-get] /broadcast
- [profile-post] /1/events/com.amazon.csm.csa.prod
Se rigeneri e non vedi nessuna route, probabilmente lo script non è riuscito a analizzare il tuo profilo: controlla gli avvisi su stderr.
Per una configurazione di impianto Sliver (JSON):
python3 caddysmith.py sliver-implant.json \
--backend https://10.1.1.10:443 \
--decoy https://www.amazon.com/ \
--server-name redirector.0xtb.sh \
--email [email protected] \
--forbid-http \
--policy strict \
-o /etc/caddy/redirector.caddy
Il riepilogo ti dirà che Sliver è stato rilevato e mostrerà la route con prefisso:
Profile type: sliver
Routes built: 1
- [sliver] /api /public /resources /services /static (prefix)
Poiché Sliver genera URI casualmente da combinazioni path × file × estensione, il matcher path generato utilizza glob di prefisso (path /api* /public* /resources* /services* /static*) anziché path esatti. Il matcher dello User-Agent utilizza una sottostringa del numero di build di Chrome (ad esempio 3921.146), che Sliver preserva nelle sue riscritture dello UA per piattaforma.
# HTTP semplice dovrebbe ricevere 403 (se hai usato --forbid-http)
curl -I http://redirector.0xtb.sh/
# Solo hostname dovrebbe reindirizzare all'esca
curl -kI https://redirector.0xtb.sh/
# Un UA cattivo dovrebbe anch'esso reindirizzare
curl -kI -A "curl/8.4.0" https://redirector.0xtb.sh/broadcast
# Una richiesta con UA corretto + percorso dovrebbe passare attraverso il proxy (200)
# In modalità strict devi anche inviare tutti gli header client del profilo.
set host_stage "true" (o non lo imposta affatto), lo script avviserà e salterà gli URI di staging. Aggiungi set host_stage "false"; al tuo profilo, oppure passa gli URI di staging esplicitamente tramite --extra-uri./api, /static, ecc. Le sonde degli scanner che usano questi prefissi (es. /api/.env) verranno inviate al team server anziché essere bloccate localmente — ma il trasporto HTTP di Sliver autentica tramite ID implant, quindi le richieste non autorizzate vengono respinte a livello C2. Il filtro UA continua comunque a tenere fuori la maggior parte degli scanner.--backend. Se hai bisogno di più team server, esegui lo script più volte e unisci manualmente.set uri "/path1 /path2"; funziona (path multipli su una riga), ma una formattazione insolita potrebbe far inceppare il parser. Controlla l'elenco delle route nel riepilogo per verificare.Il Malleable-Redirector basato su Apache è stato il punto di partenza per ciò che questo script genera: lo stesso modello a tre vie (URI del profilo / URI extra / URI lax), le stesse modalità di policy, la stessa struttura generale. CaddySmith si limita a tradurre l'output in sintassi Caddy invece di Apache .htaccess.
MIT
| Flag | Default | Cosa fa |
|---|
profile | (obbligatorio) | Percorso del file .profile |
--backend | https://teamserver.local:443 | Dove inoltrare il traffico corrispondente |
--decoy | https://www.example.com/ | Dove reindirizzare il traffico non corrispondente |
--server-name | c2.example.com | Nome di dominio del tuo redirector |
--policy | strict | strict, lax o none |
--profile-type | auto | Forza cobaltstrike o sliver (default: auto-rilevamento) |
--extra-uri PATH | — | URI extra da inoltrare (con controllo UA). Ripetibile. |
--lax-uri PATH | — | URI extra da inoltrare (senza controlli). Ripetibile. |
--allow-ua STRING | — | UA extra consentiti sulle route --extra-uri. Ripetibile. |
--forbid-http | off | Restituisce 403 su HTTP semplice |
--email EMAIL | — | Email per la registrazione Let's Encrypt e notifiche di rinnovo |
-o, --output FILE | stdout | Scrive la configurazione su file |
tls_insecure_skip_verify