Image de Jamie McLennan

Comment masquer vos ports avec Port Knocking

Beaucoup d'entre nous, en particulier les administrateurs système / réseau, laissent souvent le port ssh 22 ouvert pour un accès distant au système. Cela laisse une porte aux pirates pour essayer de se faufiler dans le système. Un utilisateur non légitime peut simplement forcer le système à se connecter au port ssh ouvert. Une façon de résoudre le problème dans le scénario ci-dessus consiste à masquer le port ssh (ou tout autre) à l'aide du mécanisme de transfert de port. Dans cet article, je vais vous montrer comment implémenter le porting à l'aide d'iptables.

iptables est un utilitaire qui permet aux administrateurs système de configurer les tables fournies par le pare-feu du noyau Linux.

Remarque: Si vous voulez les règles pour ipv6, vous pouvez utiliser ip6tables pour créer des règles pour le pare-feu. Les lecteurs intéressés peuvent également consulter nftables, qui est une version améliorée d’iptables et qui devrait la remplacer à l’avenir. Assurez-vous que iptables est installé sur votre système.

Deux systèmes utilisés:
Serveur 172.31.75.10 (Ubuntu)
Client: 172.31.72.153 (Kali Linux)

L'accès au port est un mécanisme permettant d'ouvrir un port fermé d'un système dans un pare-feu en tentant de se connecter à certains ports fermés prédéfinis. Prenons le cas d'un port ssh. Initialement, le port numéro 22 sera fermé et personne ne pourra établir de connexion avec ce dernier. Il y aura des règles de pare-feu spécifiant que ce n'est qu'après que certains ports, par exemple 8000, 8001 et 8002, seront frappés, que le port ssh sera ouvert. Les numéros de port spécifiés sont également fermés.

Pour ce tutoriel, nous allons suivre la séquence donnée: 5678, 5984 et 6357. Il est préférable que le choix des ports soit aussi obscur que possible. Nous en reparlerons plus tard dans le post. Initialement, la table est vide et peut être vérifiée avec la commande suivante.

$ sudo iptables -L

Avant de commencer, voyons l’état des ports ouverts avec nmap. Comme vous pouvez le voir sur l'image ci-dessous, l'analyse du serveur indique quatre ports ouverts, à savoir 22, 80, 443 et 8000. À la fin du tutoriel, le port numéro 22 ne sera pas affiché comme étant ouvert par le nmap. Un SimpleHTTPServer python est exécuté sur le numéro de port 8000.

Résultat de l'analyse du serveur avant la définition des règles dans le pare-feu

Conception logique du port frappant

Premièrement, nous voulons que notre pare-feu accepte tout le trafic qui n’est pas sujet au port. Cela inclura tout le trafic du serveur Web (pour les numéros de port 80, 443 et 8000).
Après cela, nous devons transférer le reste du trafic vers une nouvelle chaîne qui traitera les renversements de ports. Appelons cette chaîne WALL. Après cela, nous devons signaler les adresses IP qui tentent de se connecter au premier port légal. Nous aurons besoin d'une règle qui vérifiera si le deuxième résultat est sur le deuxième port légal. Si tel est le cas, nous activerons un autre indicateur qui indiquera que deux ports ont été frappés correctement. Si le deuxième coup est incorrect, nous lâchons le paquet et le drapeau est réinitialisé. De même, d'autres chaînes travailleront sur la même stratégie consistant à vérifier le drapeau approprié et à le transmettre s'il continue sur la bonne voie. En fin de compte, si une adresse IP frappe correctement les ports en séquence, le port ssh exposé est exposé. Il est préférable que le démon ssh ne soit exposé que pendant une brève période, ce qui permet à l'adresse IP de se connecter.
Logiquement, nous avons trois portes nécessitant chacune un coup pour permettre à une adresse IP d'être connectée au service en cours d'exécution. Cela signifie qu’une adresse IP requérante doit prendre quatre états différents:

  • Etat initial: toutes les adresses IP seront initialement dans cet état sauf si elles ont touché le premier port correctement. Dans notre cas, le port est 5678.
  • auth1 state: les adresses IP qui ont correctement touché le premier port seront marquées avec le à auth1.
  • auth2 state: Si une adresse IP est marquée avec auth2, cela signifie que l'adresse IP a correctement verrouillé le second port. Le prochain paquet à partir de cet état déterminera s'il faut définir l'indicateur sur initial ou sur auth3 pour l'adresse IP.
  • auth3 state: toutes les adresses IP marquées auth3 ont réussi à faire tomber les trois ports, dans le bon ordre. Toute adresse IP portant cet indicateur est autorisée à se connecter au port ssh.

Quatre chaînes différentes qui seront nécessaires sont les suivantes:

  • GATE1: Détermine si une adresse dans l'état initial doit être marquée comme «auth1».
  • GATE2: Détermine si une adresse dans l'état “auth1” doit être traitée pour “auth2” ou réinitialisée à l'état “initial”.
  • GATE3: Détermine si une adresse à l'état «aut2» doit être marquée «auth3» pour permettre une connexion SSH ou réinitialisée à l'état «initial».
  • PASSED: Cette chaîne ouvre le port pour la connexion SSH pour les clients légitimes.

Se salir les mains

Il est toujours utile de définir les règles par défaut dans une table vide sur «ACCEPTER» afin de conserver les connexions actuelles. Ensuite, nous devrions vider les règles de pare-feu existantes et redémarrer le pare-feu.

$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
$ sudo iptables -F

Tapez les commandes suivantes pour créer des chaînes supplémentaires que nous utiliserons:

$ sudo iptables -N WALL
$ sudo iptables -N KNOCK1
$ sudo iptables -N KNOCK2
$ sudo iptables -N KNOCK3
$ sudo iptables -N PASSED

Après avoir tapé ces commandes, nous avons un pare-feu ouvert que nous allons restreindre. Il devrait y avoir huit chaînes différentes dans le pare-feu. Vous pouvez les vérifier en tapant la commande suivante:

$ sudo iptables -L

Cela listera toutes les chaînes et les règles.
Comme nous en avons déjà parlé, nous devons gérer le trafic qui n’appartient pas à la partie frappant de port. Nous devons ajouter des règles pour cela dans la chaîne INPUT. Essayez les commandes suivantes:

$ sudo iptables -A INPUT -i lo -j ACCEPTER
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPTER
$ sudo iptables -A INPUT -p tcp --dport 8000 -j ACCEPTER

La première commande permettra à la machine d’accepter toutes les connexions de la machine locale, car différents services et applications doivent souvent communiquer entre eux. Les deuxième et troisième commandes permettent le trafic des ports (http et https) exécutant le serveur Web. La quatrième commande est parce que j'ai laissé le python SimpleHTTPServer en marche.
Toutes ces commandes permettent des connexions de base et nous pouvons maintenant transférer le trafic restant vers la chaîne WALL.

$ sudo iptables -A INPUT -j WALL

Configuration des trois chaînes KNOCK

$ sudo iptables -A KNOCK1 -p tcp --dport 5678 -m récent -nom AUTH1 --set -j DROP
$ sudo iptables -A KNOCK1 -j DROP
$ sudo iptables -A KNOCK2 -m récent --nom AUTH1 --remove
$ sudo iptables -A KNOCK2 -p tcp --dport 5984 -m récent -nom AUTH2 --set -j DROP
$ sudo iptables -A KNOCK2 -j KNOCK1
$ sudo iptables -A KNOCK3 -m recent --nom AUTH2 --remove
$ sudo iptables -A KNOCK3 -p tcp --dport 6357 -m récent -nom AUTH3 --set -j DROP
$ sudo iptables -A KNOCK3 -j KNOCK1

La chaîne passée

$ sudo iptables -A PASSED -m récent --nom AUTH3 - supprimer
$ sudo iptables -A PASSED -p tcp --dport 22 -j ACCEPTER
$ sudo iptables -A PASSÉ -j KNOCK1

Configuration de la chaîne WALL

$ sudo iptables -A WALL -m recent --rcheck --seconds 30 --name AUTH3 -j PASSED
$ sudo iptables -A WALL -m récent --rcheck --seconds 10 --nom AUTH2 -j KNOCK3
$ sudo iptables -A WALL -m récente --rcheck --seconds 10 --nom AUTH2 -j KNOCK2
$ sudo iptables -A WALL -j KNOCK1

Une fois que vous avez terminé avec toutes les commandes, votre liste iptables devrait ressembler à ceci:

Toutes les chaînes avec les règles complètes du pare-feu

J'ai le script de toutes les commandes et ai passé les numéros de port comme arguments de la ligne de commande. Cela me permet de changer le numéro de port sans changer le code. Vous pouvez trouver le script entier ici.

Il est maintenant temps de tester le pare-feu. Vous devez d’abord trouver un moyen de frapper correctement les ports. Pour cela, vous pouvez utiliser nmap, hping ou tout ce avec quoi vous êtes à l'aise. Avec nmap, vous pouvez faire quelque chose comme ça.

nmap -Pn --host_timeout 201 --max-retries 0 -p numéro_port sshServer

Vous pouvez simplement frapper les 3 ports avec cette ligne:

$ pour x sur 5678 5984 6357; ne nmap -Pn --host-timeout 201 --max-retries 0 -p $ x 172.31.75.10 && sleep 1; terminé
$ ssh [email protected]
Connexion réussie au port ssh fermé

Comme vous pouvez le voir sur l'image ci-dessus, vous pouvez vous connecter à un autre système à l'aide du service ssh.

Le choix des numéros de port est un aspect important pour la mise en œuvre du transfert de port. Souvent, les gens utilisent souvent des numéros de port prévisibles tels que 1111, 2222 et 3333; ou 1234, 2345, 3456. Une bonne quantité de temps et une bonne estimation permettent aux pirates informatiques de faire intrusion dans la première couche de défense. La plupart du temps, on constate que la séquence des numéros de ports augmente. Pour augmenter l'obscurité, vous pouvez sélectionner les numéros de port dans l'ordre suivant: 6547, 2385, 5875; ou quelque chose de similaire.

Autre utilisation de Port Knocking

Je laisse souvent mon système avec le serveur de fichiers HTTP de python ouvert. Cela me permet d’accéder à distance à mes fichiers depuis n’importe où. Une façon de s’assurer que personne d’autre n’a accès à mon contenu pour implémenter la détection de port dans le pare-feu de mon système. Une autre façon de procéder consiste à ajouter une couche d'authentification, comme celle-ci. Je recommanderai d'utiliser à la fois les mécanismes de sécurité augmentant la confidentialité de votre contenu.

Afin de rendre les règles de pare-feu persistantes, nous devons installer un autre package sur le serveur:

$ sudo apt-get install iptables-persistent
$ sudo service iptables-persistent start

Liens supplémentaires pour en savoir plus

  1. http://www.microhowto.info/howto/implement_port_knocking_using_iptables.html
  2. https://www.digitalocean.com/community/tutorials/how-to-use-port-knocking-toorhide-your-ssh-daon-from-attackers-on-ubuntu