Knock Knock Neo – Installation de port-knocking sur une BOX
Le port-knocking est une technique assez méconnue des administrateurs serveurs, cependant, elle est l’une des meilleures afin d’établir des règles dynamiques de Firewall tout en étant extrêmement simple à mettre en place sur un serveur. Cette technique peut aussi servir à exécuter d’autres commandes et à démarrer des services, sans pour autant avoir un shell sous la main. Ce petit article va faire une brève description de ce qu’est le port-knocking, et ensuite, la mise en place de ce dernier sur une Ubuntu/Debian (la configuration ne change pas, seule l’installation change selon les distributions.)
1. Port-knockwa ?
Même si ce nom est assez barbare pour un français, son sens est devinable en deux secondes. Il veut littéralement signifier frapper sur les ports (…pour ouvrir la porte). En deux mots, c’est comme dans tous les films d’espionnage amateurs, on toc à la porte selon une certaine séquence afin que la personne étant derrière la porte sache que c’est vous pour venir l’ouvrir (voir le film Léon…).
Cette technique, passée à la moulinette informatique se traduit par la modification des règles de Firewall à la volée, suite à l’envoi par un client d’une séquence de paquets SYN sur différents ports de la BOX. Par exemple, la séquence de paquets SYN sur les ports 45324, 15432 et 23942 changera les règles d’Iptables afin d’accepter la réception de paquets sur le port 22 provenant de l’IP source (envoyant les paquets SYN). Nous ferons une autre séquence afin de refermer la porte derrière nous à la fin de notre session SSH.
2. L’intérêt du port-knocking
L’intérêt est simplement d’interagir avec le serveur sans passer par une connexion distante, ainsi, nous pouvons ouvrir un service, changer son état ou modifier les règles de son fonctionnement. Il est principalement utilisé par pour manipuler les Firewalls afin d’ouvrir des ports prétendus bloqués. Ceci permettant ainsi d’éviter les attaques sur certains services par des Botnets remuant un peu trop les logs, ou des attaques ciblés contre votre box se faisant à la main.
La chance de tomber par hasard sur la bonne combinaison pour un pirate est extrêmement petite (pour vous faire une petite idée) :
* 65535^2 = 4 294 836 225 possibilités * 65535^3 = 2.81462092 × 10^14 possibilités * 65535^4 = 1.84456182 × 10^19 possibilités * etc...
Autant vous dire que cette protection va limiter grandement le pirate dans ses tentatives d’attaque tellement les possibilités sont énormes, cependant, il existe quelques faiblesses matérielles et humaines à cette technique.
3. Faiblesses
Il existe deux principales faiblesses à cette technique de port-knocking. Tout d’abord, la possibilité pour un attaquant d’effectuer une attaque Man In The Middle (Monkey in the Middle pour les intimes) en local permettant ainsi de récupérer la séquence dans le flot de données en sniffant simplement la connexion.
Une seconde vulnérabilité est plus imputable à l’humain, ainsi, nous avons pas un random service intégré dans notre cerveau donc souvent, un pirate expérimenté pourra tenter de deviner les numéros de ports employés par l’administrateur, souvent des multiples ou une séquence facilement mémorisable. (sans parler de l’administrateur qui laisse par défaut la séquence contenue dans le fichier de configuration après installation ou la lecture d’un tutoriel…).
Nous pouvons aussi noter d’autres faiblesses où le pirate doit avec accès au client exécutant knockd, ainsi, si l’administrateur ne supprime pas ses logs de sessions sur le terminal, le pirate pourra avoir la suite des ports en faisant un petit $cat .bash_history
Après avoir vu les faiblesses, nous allons passer à l’installation et la configuration du serveur, puis ensuite, l’utilisation du système de port-knocking avec un client.
4. Installation et configuration
Vu que nous n’allons pas réinventer la roue, nous allons utiliser un logiciel déjà développé afin de mettre en place la solution de port-knocking, son nom : knockd. L’installation (sur une Débian) se fait facilement avec un petit :
* (# | sudo ) apt-get install knockd
Cela va installer proprement (et tant mieux…) le programme. Après, nous allons passer à la configuration de la chose, vous allez voir, c’est d’une simplicité détonante. Donc c’est parti, tapez dans votre shell (je sais, j’utilise nano et j’aime ça) :
* (# | sudo ) nano /etc/default/knockd
Hop, là dans ce fichier knockd nous allons configurer le demon afin qu’il sache sur quelle interface réseau écouter et s’il doit s’exécuter au démarrage de la machine. pour ce faire, il suffit simplement de mettre :
* START_KNOCKD=1 # Ainsi il démarrera au démarrage de la box * KNOCKD_OPTS="-i [votre interface (eth0, eth1 etc.)]"
(si vous ne savez par votre interface, faites un petit ifconfig et regardez…) Arrivé à ce point là, nous sommes déjà bien partis, le demon peut fonctionner, reste maintenant à éditer les règles, pour cela, go to :
* (# | sudo ) nano /etc/knockd.conf
Et éditez vos rêgles simplement en faisant :
* [Nom de la rêgle] * sequence = XXXXX, XXXX, XXXXX [séquence des ports] * seq_timeout = 5 [quant-est-ce que la séquence est "finie"] * command = /sbin/iptables (+règles) [commande à exec.] * tcpflags = syn
Par défaut, les ports de la séquence sont en TCP, mais on peut s’amuser pour compliquer encore l’affaire à alterner TCP et UDP en faisant : XXX:tcp, XXXXX:udp, XXXX:tcp, XXXXX:tcp… Ainsi, un fichier de configuration bien paramétré, ressemblera à quelque chose (comme cela – lien). (n’oubliez pas de droper les paquets par défaut sur Iptables… car sinon, cela ne sert à rien…) Ensuite, nous devons redémarrer knockd afin qu’il reprenne bien en compte les nouveaux paramètres, pour se faire, une simple commande suffit :
* (# | sudo ) /etc/init.d/knockd restart
Voilà, l’installation, et la configuration est finie, reste plus qu’à tester avec un client !
5. Utilisation d’un client
Il existe des clients pour tous les systèmes d’exploitation, et cela, c’est cool ! Ainsi, il suffit simplement d’exécuter le binaire client knockd comme ceci afin de réaliser le port-knocking :
* > knock (ip du serveur) (port):(tcp|udp) (port):(tcp|udp)...
Vous trouverez les binaires et sources des clients sur le site de knockd : http://www.zeroflux.org/projects/knock (il existe même un client pour Iphone!). Bref, libre à vous ensuite de vous amuser avec knockd, sur différentes box et à partir de différents clients.