Que fait Construction d'infrastructure de redirecteur C2 ?
Utilisation autorisée uniquement : Cette compétence est destinée uniquement aux engagements de red-team autorisés, aux exercices d'adversaire simulé et à la recherche défensive. L'infrastructure de command-and-control (C2) est à double usage ; déployer des redirecteurs pour contrôler des logiciels malveillants sur des systèmes que vous n'êtes pas explicitement autorisé à tester est illégal. Opérez uniquement dans le cadre d'un périmètre convenu avec un document de règles d'engagement signé, et décommissionnez l'infrastructure à la fin de l'engagement.
Aperçu
Un redirecteur C2 est un hôte intermédiaire situé entre les implants des victimes et le véritable serveur de commande. Les beacons se connectent au domaine/IP public du redirecteur ; ce dernier inspecte chaque requête et soit transmet le trafic C2 légitime au serveur de commande masqué, soit redirige tout le reste (scanners, analystes blue-team, sandboxes) vers un site leurre bénin. Cela protège le serveur de commande de la découverte, du blocage et de l'attribution, et permet aux opérateurs de faire pivoter la périphérie publique sans reconstruire le backend. La technique correspond à la technique T1090.002 (Proxy : Proxy externe) de MITRE ATT&CK — les adversaires acheminent le C2 via un nœud intermédiaire pour masquer l'origine réelle.
Les redirecteurs existent en deux types. Les tuyaux passifs (socat, iptables NAT) transfèrent aveuglément un port et offrent une séparation mais aucun filtrage. Les redirecteurs intelligents/à filtrage (nginx proxy_pass, Apache mod_rewrite avec [P], ou des outils spécialisés comme RedWarden) analysent les requêtes HTTP et ne transfèrent que le trafic correspondant au profil Malleable C2 de l'implant — URI, User-Agent, en-têtes corrects — tout en redirigeant tout le reste via un 302 vers un site web réel. La logique de filtrage est dérivée directement du profil de trafic du framework C2, les deux doivent donc rester parfaitement synchronisés. Des outils tels que cs2modrewrite automatisent la génération de règles Apache/nginx à partir d'un profil Malleable C2 de Cobalt Strike.
Cette compétence couvre la construction de redirecteurs passifs et à filtrage avec nginx et Apache, la dérivation de règles de filtrage à partir d'un profil Malleable, l'ajout d'une couche TLS avec Let's Encrypt, et l'application de contrôles OPSEC (domaines catégorisés, domain fronting/CDN fronting, validation d'en-têtes, filtrage géographique/User-Agent) pour une infrastructure résiliente et à faible attribution.
Quand l'utiliser
- Mettre en place un C2 de red-team qui doit survivre au triage de la blue-team et aux demandes de blocage de domaine.
- Séparer un serveur de commande masqué de tout hôte exposé à Internet pendant un engagement.
- Filtrer le trafic des implants afin que seules les requêtes correspondant au profil atteignent le backend, en détournant les scanners.
- Ajouter la terminaison TLS, la catégorisation de domaine et le CDN/domain fronting à un écouteur HTTP(S).
- Enseigner aux défenseurs comment le C2 via proxy externe (T1090.002) est construit afin qu'ils puissent le détecter.
Prérequis
- Une ou plusieurs instances VPS cloud jetables (la périphérie du redirecteur) et un hôte serveur de commande distinct et protégé par pare-feu.
- Un domaine enregistré avec DNS contrôlable, de préférence ancien et catégorisé.
- Accès root sur l'hôte du redirecteur. Installez le serveur web et les outils TLS :
# Redirecteur Debian/Ubuntu sudo apt update sudo apt install -y nginx apache2 socat certbot python3-certbot-nginx git # Activer les modules proxy Apache si vous utilisez un redirecteur mod_rewrite sudo a2enmod rewrite proxy proxy_http ssl headers - Le profil Malleable C2 du framework C2 (profil
.profilede Cobalt Strike, profil HTTP de Sliver/Havoc) définissant les URI, User-Agent et en-têtes. cs2modrewritepour générer automatiquement les règles à partir d'un profil Cobalt Strike :git clone https://github.com/threatexpress/cs2modrewrite- Protégez le serveur de commande par pare-feu afin qu'il n'accepte que l'adresse IP source du redirecteur sur le port C2.
Objectifs
- Déployer un redirecteur de type tuyau passif (socat/iptables) pour une séparation rapide des ports.
- Déployer un redirecteur nginx en proxy inverse filtrant, basé sur un profil Malleable.
- Déployer un redirecteur Apache
mod_rewriteavec proxy[P]et repli vers un site leurre via302. - Générer automatiquement les règles du redirecteur à partir d'un profil Cobalt Strike avec
cs2modrewrite. - Terminer la TLS avec Let's Encrypt et durcir la périphérie publique.
- Appliquer l'OPSEC : validation des en-têtes/User-Agent, filtrage géographique, diversion vers un leurre et rotation de l'infrastructure.
Cartographie MITRE ATT&CK
| ID de technique | Nom officiel | Pertinence |
|---|---|---|
| T1090.002 | Proxy : Proxy externe | Le redirecteur est un intermédiaire externe qui proxyifie le C2 pour masquer le serveur de commande |
| T1090.004 | Proxy : Domain Fronting | Le CDN fronting achemine le trafic des beacons via un domaine de confiance de haute réputation |
| T1071.001 | Protocole de couche applicative : Protocoles web | Le C2 est tunnelisé via HTTP/HTTPS façonné par le profil Malleable |
| T1573.002 | Canal chiffré : Cryptographie asymétrique | La terminaison TLS au niveau du redirecteur chiffre le canal des beacons |
| T1583.006 | Acquérir une infrastructure : Services web | Des périphéries VPS/CDN jetables sont acquises pour un C2 résilient |
Workflow
1. Isolez et protégez le serveur de commande par pare-feu
Placez le serveur de commande sur un hôte privé. Limitez son port C2 à l'adresse IP du redirecteur uniquement.
# Sur le serveur de commande : seul le redirecteur (203.0.113.10) peut accéder au port 443/tcp
sudo ufw default deny incoming
sudo ufw allow from 203.0.113.10 to any port 443 proto tcp
sudo ufw allow OpenSSH
sudo ufw enable
2. Redirecteur tuyau passif (socat / iptables)
Pour une séparation rapide sans filtrage, transférez le port C2 vers le serveur de commande.
# socat : transfert avant-plan du port 443 vers le serveur de commande
socat TCP4-LISTEN:443,fork,reuseaddr TCP4:10.0.0.2:443
# Ou iptables DNAT (persistant)
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 10.0.0.2:443
iptables -t nat -A POSTROUTING -p tcp -d 10.0.0.2 --dport 443 -j MASQUERADE
3. Redirecteur nginx en proxy inverse filtrant
Ne proxyifiez que les requêtes dont l'URI correspond au profil Malleable ; envoyez tout le reste vers un leurre via un 302. Remplacez l'expression régulière de location et le User-Agent par les valeurs de votre profil.
# /etc/nginx/sites-available/redirector.conf
server {
listen 443 ssl;
server_name cdn.example.com;
ssl_certificate /etc/letsencrypt/live/cdn.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cdn.example.com/privkey.pem;
# Proxy UNIQUEMENT les URI C2 correspondant au profil vers le serveur de commande masqué
location ~ ^/(api/v2/jobs|cm/[a-z0-9]+|push) {
# Exiger le User-Agent exact de l'implant
if ($http_user_agent != "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36") {
return 302 https://www.legitimate-decoy.com/;
}
proxy_pass https://10.0.0.2;
proxy_ssl_verify off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
# Tout le reste -> site leurre bénin
location / {
return 302 https://www.legitimate-decoy.com/;
}
}
sudo ln -s /etc/nginx/sites-available/redirector.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
4. Redirecteur Apache mod_rewrite
Le drapeau [P] d'Apache proxyifie les requêtes correspondantes vers le serveur de commande ; les requêtes non correspondantes reçoivent une redirection 302. C'est le format que produit cs2modrewrite.
# /etc/apache2/sites-available/redirector.conf (à l'intérieur de <VirtualHost *:443>)
RewriteEngine On
SSLProxyEngine On
# Exiger le User-Agent de l'implant
RewriteCond %{HTTP_USER_AGENT} "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" [NC]
# Correspondre aux URI C2 valides (GET/POST/stager) du profil Malleable
RewriteCond %{REQUEST_URI} ^/(api/v2/jobs|cm/[a-z0-9]+|push)/?$
# Proxyfier vers le serveur de commande masqué, en préservant l'URI
RewriteRule ^.*$ https://10.0.0.2%{REQUEST_URI} [P,L]
# Tout le reste -> site leurre
RewriteRule ^.*$ https://www.legitimate-decoy.com/ [R=302,L]
sudo a2ensite redirector && sudo apache2ctl configtest && sudo systemctl reload apache2
5. Générer des règles à partir d'un profil Malleable
Laissez cs2modrewrite construire les règles Apache ou nginx directement à partir de votre profil Cobalt Strike pour que le filtre corresponde exactement au trafic des beacons.
cd cs2modrewrite
# Règles Apache mod_rewrite
python3 cs2modrewrite.py -i havex.profile -c https://10.0.0.2 \
-r https://www.legitimate-decoy.com -o /etc/apache2/redirect.rules
# Configuration nginx
python3 cs2nginx.py -i havex.profile -c https://10.0.0.2 \
-r https://www.legitimate-decoy.com -H cdn.example.com > /etc/nginx/sites-available/c2.conf
6. Terminer la TLS avec Let's Encrypt
Émettez un certificat valide afin que le HTTPS des beacons ne génère pas d'avertissements TLS et que la périphérie semble légitime.
sudo certbot --nginx -d cdn.example.com --agree-tos -m [email protected] --redirect
# Vérifier le renouvellement automatique
sudo certbot renew --dry-run
7. Appliquer les contrôles OPSEC
Ajoutez des couches défensives contre l'analyse de la blue-team : validez les en-têtes, limitez géographiquement au pays cible, détournez les sandboxes et faites pivoter les périphéries. Envisagez le CDN/domain fronting (T1090.004) là où c'est pris en charge.
# Exemple : bloquer les zones géographiques non ciblées au niveau du pare-feu avec ipset/GeoIP,
# exiger un en-tête d'authentification personnalisé dans le profil, et faire pivoter le domaine/IP
# du redirecteur selon un calendrier. Vérifiez que le redirecteur ne transfère que le trafic correspondant :
curl -k https://cdn.example.com/ # attendu : 302 vers site leurre
curl -k -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
https://cdn.example.com/api/v2/jobs # attendu : réponse proxyfiée
Outils et ressources
| Outil | Objectif | Source |
|---|---|---|
| nginx | Redirecteur proxy inverse filtrant | https://nginx.org/ |
| Apache mod_rewrite | Proxy [P] + redirecteur leurre 302 | https://httpd.apache.org/docs/current/mod/mod_rewrite.html |
| cs2modrewrite | Générer des règles Apache/nginx à partir d'un profil CS | https://github.com/threatexpress/cs2modrewrite |
| RedWarden | Proxy inverse C2 filtrant compatible Malleable | https://github.com/mgeeky/RedWarden |
| redi | Redirecteur nginx + Let's Encrypt automatisé pour CS | https://github.com/taherio/redi |
| socat | Transfert TCP tuyau passif | http://www.dest-unreach.org/socat/ |
| Let's Encrypt / certbot | Certificats TLS gratuits | https://certbot.eff.org/ |
| ired.team | Référence sur l'infrastructure red-team | https://www.ired.team/offensive-security/red-team-infrastructure |
Critères de validation
- Le serveur de commande est protégé par pare-feu pour n'accepter que l'adresse IP source du redirecteur sur le port C2.
- Le redirecteur est déployé (tuyau passif et/ou proxy inverse filtrant).
- Les règles de filtrage sont dérivées du profil Malleable C2 réel (URI + User-Agent + en-têtes).
- Les requêtes non correspondantes retournent un
302vers un site leurre bénin (vérifié avec curl). - Les requêtes de beacons correspondantes sont proxyfiées vers le serveur de commande masqué (vérifié avec curl).
- Un certificat TLS valide est émis et le renouvellement automatique est confirmé.
- Les contrôles OPSEC sont appliqués (validation UA/en-têtes, géofencing, diversion vers leurre).
- La catégorisation de domaine / le CDN fronting sont envisagés le cas échéant.
- Le plan de rotation et de décommissionnement de l'infrastructure est documenté.
- Toute l'activité est confinée au périmètre d'engagement autorisé.