
Gere configurações de redirecionador Caddy a partir de perfis do Cobalt Strike ou Sliver C2.
CaddySmith é um pequeno script em Python que lê um perfil C2 do Cobalt Strike ou Sliver e gera uma configuração do servidor web Caddy a partir dele. O Caddyfile gerado transforma uma máquina Linux comum em um redirecionador: o tráfego legítimo de beacons é proxy reverso para o team server, e qualquer outra coisa (scanners, bots de busca, sondagens da blue team, curl aleatório) é redirecionada para uma URL isca.
Escrevi isso porque o Caddy é um servidor web muito mais amigável para levantar rapidamente do que o Apache, binário estático único, certificados automáticos Let's Encrypt, sem a dança do a2enmod.
Somente engajamentos autorizados. Esta é uma ferramenta de segurança ofensiva. Execute-a apenas contra ambientes para os quais você tenha permissão por escrito para testar.
O CaddySmith detecta automaticamente o formato a partir do conteúdo do arquivo:
set uri "/foo". Cada URI HTTP-GET / HTTP-POST se torna sua própria rota de caminho exato com os cabeçalhos do cliente do perfil aplicados.path /api* /static* /resources*) e fazendo uma correspondência de substring no número de build do Chrome no UA (que sobrevive às reescritas de UA por plataforma do Sliver).Você também pode forçar um analisador específico com --profile-type cobaltstrike ou --profile-type sliver.
Dado um arquivo de perfil, o script extrai:
--server-name)set host_stage)Em seguida, ele constrói um Caddyfile que:
.env, /wp-admin, .php, etc.)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
Isso escreve a configuração gerada em redirector.caddy e exibe um resumo do que foi feito no stderr.
Copie o arquivo gerado para o redirecionador e execute o Caddy com ele. Você precisa da flag --adapter caddyfile porque o Caddy usa JSON como configuração padrão:
caddy run --config /etc/caddy/redirector.caddy --adapter caddyfile
Para recarregar uma instância em execução com uma configuração atualizada:
caddy reload --config /etc/caddy/redirector.caddy --adapter caddyfile
Se o Caddy avisar sobre inconsistências de formatação, corrija-as com:
caddy fmt --overwrite /etc/caddy/redirector.caddy
Coloque o arquivo em /etc/caddy/ e importe-o do seu Caddyfile principal:
# /etc/caddy/Caddyfile
import /etc/caddy/redirector.caddy
Se você passou --email (recomendado), o snippet gerado já contém o bloco de opções globais, então o Caddyfile principal só precisa da linha import. Se não passou, adicione o e-mail manualmente em um bloco { } acima do import.
Em seguida, valide e recarregue:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
O Caddy provisionará automaticamente um certificado Let's Encrypt para o domínio em --server-name desde que o registro A aponte para o redirecionador.
Strict é o que você normalmente quer. Lax é útil quando você está depurando por que um beacon real não está se conectando.
Digamos que você tenha um perfil que imita um endpoint da Amazon e queira implantá-lo em 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
O resumo mostra exatamente quais rotas foram construídas, ex.:
Routes built: 2
- [profile-get] /broadcast
- [profile-post] /1/events/com.amazon.csm.csa.prod
Se você regenerar e ver nenhuma rota, o provavelmente falhou ao analisar seu perfil — verifique os avisos no stderr.
Para uma configuração de implant do 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
O resumo informará que o Sliver foi detectado e mostrará a rota de prefixo:
Profile type: sliver
Routes built: 1
- [sliver] /api /public /resources /services /static (prefix)
Como o Sliver gera URIs aleatoriamente a partir de combinações de caminho × arquivo × extensão, o correspondente path gerado usa globs de prefixo (path /api* /public* /resources* /services* /static*) em vez de caminhos exatos. O correspondente de User-Agent usa uma substring do número de build do Chrome (ex.: 3921.146), que o Sliver preserva em suas reescritas de UA por plataforma.
# Plain HTTP should be 403'd (if you used --forbid-http)
curl -I http://redirector.0xtb.sh/
# Bare hostname should redirect to the decoy
curl -kI https://redirector.0xtb.sh/
# Bad UA should also redirect
curl -kI -A "curl/8.4.0" https://redirector.0xtb.sh/broadcast
# A request with the right UA + path should proxy through (200)
# You need to also send all the profile's client headers in strict mode.
set host_stage "true" (ou não definir isso), o script avisará e pulará as URIs de stager. Adicione set host_stage "false"; ao seu perfil, ou passe as URIs de stager explicitamente via --extra-uri./api, /static, etc. Sondas de scanner que por acaso usam esses prefixos (ex.: /api/.env) serão enviadas para o team server em vez de bloqueadas localmente — mas o próprio transporte HTTP do Sliver autentica via ID do implant, então requisições não autorizadas são rejeitadas na camada C2. A filtragem de UA ainda mantém a maioria dos scanners afastados.--backend. Se precisar de vários team servers, execute o script várias vezes e mescle manualmente.set uri "/path1 /path2"; funciona (vários caminhos em uma linha), mas formatações incomuns podem atrapalhar o analisador. Verifique a lista de rotas no resumo para confirmar.O Malleable-Redirector baseado em Apache foi o ponto de partida para o que este script gera, mesmo modelo de três trilhas de URI (URIs do perfil / URIs extras / URIs lax), mesmos modos de política, mesma estrutura geral. O CaddySmith apenas traduz a saída para a sintaxe do Caddy em vez do .htaccess do Apache.
MIT
| Flag | Padrão | O que faz |
|---|
profile | (obrigatório) | Caminho para o arquivo .profile |
--backend | https://teamserver.local:443 | Para onde o tráfego correspondido será proxy reverso |
--decoy | https://www.example.com/ | Para onde o tráfego não correspondido será redirecionado |
--server-name | c2.example.com | Nome de domínio do seu redirecionador |
--policy | strict | strict, lax ou none |
--profile-type | auto | Forçar cobaltstrike ou sliver (padrão: detecção automática) |
--extra-uri PATH | — | URI extra para proxy (com verificação de UA). Pode repetir. |
--lax-uri PATH | — | URI extra para proxy (sem verificações). Pode repetir. |
--allow-ua STRING | — | UA extra permitida nas rotas --extra-uri. Pode repetir. |
--forbid-http | off | Retornar 403 para HTTP simples |
--email EMAIL | — | E-mail para registro e notificações de renovação do Let's Encrypt |
-o, --output FILE | stdout | Escrever a configuração em um arquivo |
tls_insecure_skip_verify