DNS Tunneling par la pratique

Bijour à vous …

Ben voilà, suite à l’un de mes précédents articles, où je mettais amusé à pomper de façon plutôt glorieuse un tuto en anglais sur le tunneling, je me suis amusé à exécuter le tuto pour « remplir mon temps libre » … et j’ai remarqué que l’idée était sympa, mais l’implémentation, ainsi que l’installation était « laborieuse », ainsi, j’ai tenté de voir pour une autre solution tout aussi sympa, toujours basé sur un tunnel DNS (bien sûr on peut faire du tunneling avec tout et n’importe quoi Icmp, Http, …).

Les outils :

  • un serveur dédié avec 2 ip (genre rps … comment je fait de la pub!!!) ou un dédié et un serveur dns (à part … on à vraiment besoin de 2 IPs distincts).
  • ce superbe script en perl
  • la puissance du script-kidies qui sommeil en vous

Sur le serveur :

On configure bind9 (un très bon tuto si le besoin ce fait sentir ;)) … pour ce faire, il suffit juste d’ajouter des lignes du genre (changez bien sûr votre ip et nom de domaine) :
[sourcecode language= »bash »]
tunnel          IN              NS              tun.domaine.org.
tun               IN              A                123.123.123.123
[/sourcecode]
Le tunnel DNS :
[sourcecode language= »bash »]
cd /opt
wget http://dev.splitbrain.org/download/snapshots/dnstunnel-latest.tgz
gunzip dnstunnel-latest.tgz | tar -xvf –
[/sourcecode]

Ensuite on config les différents fichiers :

/opt/dnstunnel/dnstunneld (pour ceux qui ont deux IP sur une même machine, il vous faut modifier le port d’écoute, pour les autres, ne faites rien), pour ce faire, cherchez la ligne :

LocalPort    => 53

et remplacez 53 par 1024, ensuite, il suffit d’utiliser ces deux règles d’iptables pour effectuer la redirection (changez les ip!!!!) :
[sourcecode language= »bash »]
iptables -t nat -A PREROUTING -p tcp -d 123.123.123.123 –dport 53 -j REDIRECT –to-ports 1024
ptables -t nat -A PREROUTING -p udp -d 123.123.123.123 –dport 53 -j REDIRECT –to-ports 1024
[/sourcecode]
Pourquoi faire ça ?? Comme mon serveur à deux ip et que bind écoute sur les deux ip, je ne peux pas lier le script sur le port 53 de ma machine, donc je redirige le traffic à destination de l’ip 123.123.123.123 et du port 53 au port 1024, comme ça, pas de problème 😉 et mon serveur DNS configuré sur l’autre ip fonctionne toujours 😉 (ok dites-le, c’est crade mais ça marche … comme windows ou pas … des fois ^^)

/opt/dnstunnel/dnstunneld.wrapper modifiez les 3 lignes comme ceci (pour ma config, donc changez encore une fois les ip/nom de domaine pour votre config) :
[sourcecode language= »bash »]DNSHOST= »tunnel.domaine.org »           # ici on donne le nom de notre NS
REPLYIP= »123.123.123.123″                                  # l’ip que l’on renvoi si quelqu’un fait une vrai requête DNS sur ce serveur
OPTIONS= »-i 127.0.0.1 -l 123.123.123.123″          # les options … changer l’ip par la votre 😉
[/sourcecode]
puis faire un sympatique :

ln -s /opt/dnstunnel/dnstunneld.init /etc/init.d/dnstunneld

installez ensuite les dépendances de perl et screen :

apt-get install screen libnet-dns-perl libmime-base32-perl

pour ceux qui n’ont pas debian passer par : perl -MCPAN -e shell et faire un install Net::DNS et install MIME::Base32
un coup de

/etc/init.d/dnstunneld start

permettra de lancer la bête. (il faudra peut-être créer l’utilisateur nobody ainsi que son groupe associé ;))

Sur le client :
On copie le fichier dnstunnelc dans /usr/bin (en gros crado …), on install ensuite les même dépendances perl que pour le serveur.

apt-get install libnet-dns-perl libmime-base32-perl

Ensuite, une simple commande SSH à balancer (changez bien sûr le nom de domaine et le login du compte ssh ;))

ssh -D 8080 -o ProxyCommand= »dnstunnelc -v sshdns.tunnel.domaine.org » votre-login@domaine.org

et paf ça fait des chocapics un tunnel dns, ensuite il suffit de configurer son client web (firefox, …) pour utiliser notre proxy sur le port 8080 et enjoy la connexion.

Bien sûr, vous devez être propriétaire de la borne wifi à laquelle vous vous connecter, ou vous devez avoir l’autorisation de son propriétaire (même si c’est public ?? ^^).

Si vous trouvez que c’est trop complexe … vous pouvez toujours regarder ici