iodine

51 views
Skip to first unread message

Laurent Caillette

unread,
Jul 28, 2018, 12:56:19 PM7/28/18
to tec...@googlegroups.com

"iodine"
est un tunnel DNS, c'est à dire qu'il encapsule un flux bidirectionnel à travers des requêtes-réponses DNS correctement formées. Son utilité principale est de fournir une connexion Internet à travers des pare-feux ou des portails captifs qui bloquent le trafic HTTP mais laissent passer les requêtes DNS.

"Iodine" est le nom anglais de l'iode, dont le numéro atomique est 53. 53 est le port UDP utilisé par les requêtes DNS.


== Passage des requêtes DNS

On choisit un point d'accès Wi-Fi et à ce moment-là on est redirigé vers un portail captif qui demande une forme d'authentification, ou de cliquer sur un bouton pour accepter des conditions d'utilisation qu'on n'a pas envie de lire. 

Si la commande suivante ne crache pas d'erreur, alors le point d'accès laisse inconditionnellement passer les requêtes DNS.

<<<
>>>

Une telle permissivité peut sembler bizarre, mais on la constate fréquemment. Peut-être que les administrateurs système ne maîtrisent pas trop UDP, ou que les portails captifs ont été programmés par des gens paresseux.

Après il y a un cas tout simple, où le routeur laisse passer n'importe quoi sur le port UDP 53. iodine est capable de détecter cette configuration pour économiser l'encapsulation du contenu dans des requêtes DNS.


== Prérequis pour utiliser iodine

- Un serveur Debian publiquement accessible depuis Internet, avec le port UDP 53 non-filtré.
- La main sur les enregistrements DNS.
- Une machine client avec Debian ou Ubuntu, éventuellement dans VirtualBox.

iodine est multiplateforme, toutefois la version MacOS n'est plus maintenue. Le ``brew install iodine`` échoue lamentablement et la reconstruction à partir des sources donne un exécutable qui plante au démarrage.


== Configuration DNS

On crée un enregistrement DNS de type A que le nom ``work.mycompany.com.`` soit résolu avec l'IP visible depuis Internet. Noter le point à la fin du nom de domaine.

On crée un enregistrement DNS de type NS qui délègue la résolution du nom ``iodine.mycompany.com.`` vers ``work.mycompany.com``. Noter le point à la fin du nom de domaine.

Après tout ce qu'un client iodine devra connaître, c'est le nom ``iodine.mycompany.com``.


== Serveur

L'installation de iodine se fait sans effort sur Debian :

<<<
sudo apt-get install iodined
>>>

Après pour démarrer le serveur iodine :

<<<
iodined -f -D -c -P [password] 172.16.0.4 iodine.mycompany.com
>>>

Qu'est-ce que ça signifie ?

``iodined`` est le démon comme signalé par le "d" à la fin.

``-f`` ("foreground") indique une exécution en avant-plan, c'est plus pratique pour voir les messages d'erreur.

``-D`` cause l'affichage d'informations de débogage (``-DD`` si on en veut plus).

``-c`` pour accepter des connexions à partir de n'importe quelle adresse IP.

``-P`` pour indiquer le mot de passe que devra fournir le client.

``[adresse-tunnel]`` un bloc d'adresses de sous-résau local non-utilisé.

``[nom-du-serveur]`` le nom pour lequel on a créé un enregistrement NS.

C'est bien de vérifier que tout est en ordre avec "Troubleshoot your iodine setup"
qui va vérifier les capacités du serveur.

Concernant le paramètre ``adresse-tunnel`` (``tunnel_ip`` dans la page man) il faut garder à l'esprit que c'est une plage d'adresses virtuelles non-routables sur Internet. On choisit une plage non-utilisée, typiquement `172.16.0.0/27` ou `10.11.0.0/24`. Le serveur et les clients se partagent des adresses de ce bloc jusqu'à épuisement. Ces adresses sont utilisées en interne par iodine pour son trafic DNS, on ne les utilise jamais à partir de la ligne de commande.


=== Démonisation

La version du pauvre :

<<<
nohup iodined -c -P [password] 172.16.0.4 iodine.mycompany.com &
>>>

Mais si on veut un vrai démon le mieux c'est avec SystemD. Il y a un fichier ``iodined.service`` créé à l'installation, il n'y a plus qu'à renseigner certains paramètres.

Dans le même ordre d'idée ça vaut sûrement le coup d'enfermer iodined dans un chroot (option ``-t``).


== Client

Le ``brew install iodine`` ne fonctionne pas sur High Sierra, donc on se rabat vers une Ubuntu 18 dans VirtualBox. C'est indispensable de déclarer une interface réseau de type "Bridged" ("pont") pour éviter que VirtualBox filtre le trafic UDP entrant. 

** Attention avec les interfaces de type "Bridged", leur adresse IP est attribuée par le DHCP du sous-réseau, donc le clampin à la table d'à côté peut se connecter à la machine virtuelle. Donc il faut impérativement interdire d'autres modes d'authentification que la clé publique pour SSH. **

Après on se connecte à iodined avec le client iodine :

<<<
sudo iodine -f -m 1174 -P [password] iodine.mycompany.com
>>>

``-m`` permet de sauter le calcul de la taille optimale des requêtes, mais il ne faut pas utiliser la première fois.

Une fois que tout a démarré sans message d'erreur, on vérifie que le tunnel existe (je répète, on n'a pas besoin des adresses supplémentaires genre `172.16.0.2`) :

<<<
$ ifconfig
dns0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1130
        inet 172.16.0.2  netmask 255.255.0.0  destination 172.16.0.2
        [...]
>>>

Maintenant il est temps de se connecter au serveur. Là on utilise l'IP ``adresse-tunnel`` qu'on a rentrée dans la ligne de commande. Sur le client (Guest VirtualBox) :

<<<
ping 172.16.0.4
>>>

La magie se fait : l'adresse `172.16.0.4` qui existe dans le sous-réseau du serveur apparaît magiquement du côté du client, alors que le seul lien se fait par les requêtes DNS. Les données passent en clair (même si elles ont une sale gueule une fois transformées en requête DNS) donc il faut rajouter une couche de chiffrement. SSH est là pour ça :

<<<
>>>

C'est l'équivalent d'un ``ssh some...@work.mycompany.com`` (nonobstant le contenu de ``.ssh/known_hosts``).

Mais si on veut faire transiter le trafic Web par le tunnel ? C'est le moment d'utiliser le transfert dynamique de port ("dynamic forwarding") transformant le client SSH en point d'entrée SOCKSv4, et le serveur en point de sortie. 

<<<
ssh -N -D 2223 some...@172.16.0.4
>>>

``-N`` évite d'avoir une console SSH interactive. 

Ensuite on dit à son navigateur d'utiliser `127.0.0.1:2223` comme proxy SOCKSv4 et ça fonctionne, comme on peut le vérifier avec
. Évidemment le débit en a pris un coup mais on n'a rien sans rien.


== Réutilisation en-dehors de la machine virtuelle

Si on veut utiliser le tunnel SSH en-dehors de la machine virtuelle hébergée ("guest") il faut un tunnel de plus. Considérant que la machine hébergeuse voit la machine hébergée avec l'adresse `192.168.100.104` (via une interface virtuelle "Host Only") :

<<<
# On VirtualBox Host
>>>

Et là un navigateur Web avec un proxy SOCKSv4 sur `127.0.0.1:2223` utilisera bien le tunnel qui ressort par iodined.


== Conclusion

iodine est un outil bien sympathique qu'on aura tout intérêt à laisser tourner sur un serveur de son infrastructure, pour les jours où plus rien d'autre ne fonctionne. 

Dans le même ordre d'idée on a des tunnels ICMP pour passer à travers des routeurs mal configurés, qui laissent passer le ping. Mais je n'ai pas testé.

En temps normal, si on veut juste dissimuler les sites sur lesquels on navigue (les noms de domaines sont visibles même avec du HTTPS), ou changer la zone géographique de son adresse IP, le plus simple c'est de faire tourner sur un serveur public un démon SSH écoutant sur le port 443 (ou avec une redirection du port 443 vers le port 22) vu qu'un point d'accès public ce n'est pas si dur à trouver. Comme tous les points d'accès publics autorisent le trafic sur sur ce port qui correspond à HTTPS et que le HTTPS n'est pas analysable, ça devrait passer. Après on utilise le transfert de port dynamique ouvrant un proxy SOCKSv4 et c'est la joie dans un navigateur Web correctement configuré.

Si le proxy SOCKS s'avère trop limité ce sera peut-être le moment de considérer une solution comme OpenVPN, qui est une bestiole complètement différente puisqu'au lieu de "rapprocher" une adresse IP (comme le fait un tunnel) il "téléporte" le client dans un autre réseau. Lors d'une "discussion précédente"
j'avais critiqué OpenVPN pour l'absence de client sachant désactiver la couche réseau en cas de coupure du VPN ("kill switch"). Maintenant "Tunnelblick" 
propose cette fonctionnalité. De plus OpenVPN fonctionne très bien avec de l'UDP (mieux qu'avec du TCP) donc si on le fait tourner sur le port UDP 53 il y a des chances pour que ça passe. Sinon ça veut dire que la correction des requêtes DNS est vérifié. Dans ce cas il n'y a plus que iodine pour nous sauver. Donc si on a une seule machine à utiliser comme point de sortie d'un tunnel ou VPN je suggère de réserver le précieux port UDP 53 pour iodine.


== Ressources

"DNS Tunneling with Iodine"

Henri Tremblay

unread,
Jul 29, 2018, 2:37:33 PM7/29/18
to tec...@googlegroups.com
Amusant comme concept. Ça donne quoi comme débit?

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "techos".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse techos+un...@googlegroups.com.
Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse tec...@googlegroups.com.
Visitez ce groupe à l'adresse https://groups.google.com/group/techos.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

Laurent Caillette

unread,
Jul 30, 2018, 9:53:48 AM7/30/18
to tec...@googlegroups.com
Salut Henri,

Le débit est tout pourrave, les mecs disent que c'est juste assez pour faire de l'IRC. Là j'ai fait une tentative à partir d'un McDo mais leur portail est bien fait, le client iodine échoue à se connecter.

Si t'aimes bien les tunnels, ça me fait penser, des mecs ont écrit un programme qui exfiltre des données en faisant clignoter la LED d'un routeur.

Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse techos+unsubscribe@googlegroups.com.

Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse tec...@googlegroups.com.
Visitez ce groupe à l'adresse https://groups.google.com/group/techos.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "techos".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse techos+unsubscribe@googlegroups.com.

Sylvain Rey

unread,
Jul 30, 2018, 10:20:08 AM7/30/18
to tec...@googlegroups.com
Hello

Ca serait très drôle que ça passe sur les compagnies aériennes qui demandent 5$ pour 10MB (même si la latence satellite + la latence DNS, ça risque d'être injouable au final).

++
Sylvain


Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse techos+un...@googlegroups.com.

Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse tec...@googlegroups.com.
Visitez ce groupe à l'adresse https://groups.google.com/group/techos.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "techos".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse techos+un...@googlegroups.com.

Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse tec...@googlegroups.com.
Visitez ce groupe à l'adresse https://groups.google.com/group/techos.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "techos".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse techos+un...@googlegroups.com.

Laurent BEDE

unread,
Jul 30, 2018, 10:23:51 AM7/30/18
to techos
Bon, comme je dirais à ma fille de 16 ans : ce n'est pas parce que c'est possible, que c'est légal et d'ailleurs, ce n'est pas parce que c'est légal, que c'est possible : ce qui est, beaucoup plus frustrant si on y réfléchit 2 minutes.


Sylvain Rey

unread,
Jul 30, 2018, 10:38:25 AM7/30/18
to tec...@googlegroups.com
En effet, je n'ai pas lu les conditions d'utilisations du Dreamliner AirFrance... mais je ne pense pas qu'elles parlent du port 53 :)

Mais imagine que tu trouves un lawyer qui montre que tu n'es pas en tort (on un a vu passer des choses plus grossières il me semble) : tu aurais une expérience web possible, légale... et extrêmement frustrante !

Stéphane Tsacas

unread,
Jul 31, 2018, 9:26:37 AM7/31/18
to tec...@googlegroups.com


Le lun. 30 juil. 2018 à 15:53, Laurent Caillette <laurent....@gmail.com> a écrit :
...
Si t'aimes bien les tunnels, ça me fait penser, des mecs ont écrit un programme qui exfiltre des données en faisant clignoter la LED d'un routeur.


25 bit/s avec la led du moniteur
150 bits/s avec 1 led du clavier
450 bit/s avec 2 leds
4 000 bits/s avec la led d'activité du disque dur

Sinon il y à ça aussi, dans le domaine de la lumière :
A unique infiltration
attack proposed in 2015 by
Shamir et al. demonstrated how to establish
a covert channel with a malware
over the air-gap using a standard allin-one
printer.36 In this case, a remote
beam of blue laser blinked information
in binary code; the laser was sent to the
target building (aimed at a room in the
building housing an all-in-one-printer)
from a distance greater than one kilometer
away. Malware located within the
air-gapped network utilized the scanner
sensors to receive the signals. The
malware could also send out signals by
turning the scanner lamp on and off to
encode binary data. The researchers
demonstrated how a drone with a laser
beam and camera positioned outside a
window could perform the transmission
and reception tasks successfully. 
--
stéphane tsacas

Reply all
Reply to author
Forward
0 new messages