Port Knocking ou la serrure TCP codée

user_icon admin | icon2 Securite | icon4 7/11/2007 1h5| Type doc: article| Type File: txt| icon3 2 Comments

Port Knocking ou la serrure TCP codée


1. Qu'est donc ?

Le port knocking est une technique permettant d'ouvrir un port TCP après une combinaison de connexions sur divers ports préalablement choisis. Cela permet par exemple d'ouvrir le port SSH à la demande.

Plusieurs mécanismes permettent de réaliser le port knocking. Le plus simple étant un programme à l'écoute de la pile TCP, qui après avoir recut les packets SYN sur les bons ports exécute une commande prédéfinie. L'autre technique peu se faire au moyen de quelques lignes 'iptables'.

2. Le daemon knockd

knockd est un daemon permettant de mettre en oeuvre cette technique simplement.

Celui-ci se base sur un unique fichier de configuration que nous allons voir immédiatement. Celui-ci se nomme /etc/knockd.conf

[options]
        logfile = /var/log/knockd.log
        Interface = eth1

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 9000,8000,7000
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

Dans cet exemple il nous faudra transmettre des packets SYN sur les ports 7000, 8000 et 9000 de l'interface eth1 pour ouvrir la connexion à SSH et sur les ports 9000, 8000 et 7000 pour la fermer. On constate aussi qu'il s'agit d'une commande iptables qui ouvre le port 22, mais cela aurait pu être le démarrage du daemon sshd.

Simple et efficace.

3. Knocking via iptables

Il s'agit de la méthode que je préfère car elle ne dépend pas d'un outil annexe. Je l'ai découverte sur le forum d'openwrt

#!/bin/sh

# Pour ouvrir le port verrouiller par cle
# nmap -PA100,200,300,400 -r -M1 @IP
# ou
# alias tl"="telnet @IP"
# tl 100,200,300,400


PORT_KNOCK="22"

/sbin/iptables -N INTO-PHASE2
/sbin/iptables -A INTO-PHASE2 -m recent --name PHASE1 --remove
/sbin/iptables -A INTO-PHASE2 -m recent --name PHASE2 --set
/sbin/iptables -A INTO-PHASE2 -j LOG --log-prefix "INTO PHASE2: "

/sbin/iptables -N INTO-PHASE3
/sbin/iptables -A INTO-PHASE3 -m recent --name PHASE2 --remove
/sbin/iptables -A INTO-PHASE3 -m recent --name PHASE3 --set
/sbin/iptables -A INTO-PHASE3 -j LOG --log-prefix "INTO PHASE3: "

/sbin/iptables -A INPUT -m recent --update --name PHASE1

/sbin/iptables -A INPUT -p tcp --dport 7000 -m recent --set --name PHASE1
/sbin/iptables -A INPUT -p tcp --dport 8000 -m recent --rcheck --name PHASE1 -j INTO-PHASE2
/sbin/iptables -A INPUT -p tcp --dport 9000 -m recent --rcheck --name PHASE2 -j INTO-PHASE3

/sbin/iptables -A INPUT -p tcp --dport $PORT_KNOCK -m recent --rcheck --seconds 5 --name PHASE3 -j ACCEPT

iptables -P INPUT DROP

# On conserve les connexions etablies
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

# on permet les connexions vers l'exterieur
iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT

En gros ça nous donne :

  • Connexion au port 7000 : enregistre l'@IP de l'emetteur dans la liste PHASE1

  • Connexion au port 8000 + @IP en PHASE1 : suppression @IP de la PHASE1 et enregistrement en PHASE2

  • Connexion au port 9000 + @IP en PHASE2 : suppression @IP de la PHASE2 et enregistrement en PHASE3 + ajoute la chaine ouvrant le SSH.

Propre et élégant :)

4. L'ouverture de la connexion

La transmission des fameux packets SYN peut se faire avec de nombreux outils, voilà déjà deux moyens simples d'y parvenir.

Une simple connexion telnet, disponible sur tous système, débute toujours par la transmission de ce type de packet.


alias syn='telnet @IP_Serveur'
syn 7000; syn 8000; syn 9000; ssh @IP_Serveur

Entre chaque telnet on peut faire un 'Ctrl C' pour accélérer l'envoi des packets.

On peut aussi réaliser cet envoi avec la commande 'nmap'.

nmap -PA7000,8000,9000 -r -M1 @IP

Commentaires:

user_iconulhume icon4 7/11/2007 - 9h6
Rigolo comme tout ton truc, va falloir que j'essaye :)
user_icondab icon4 7/11/2007 - 10h26
Disons que ça permet d'éviter les attaques par brute force sur ssh, toutefois un simple changement de port en filtre une bonne partie pour ne pas dire tout. J'ai simplement bien aimé la technique de mise en oeuvre avec iptables. Puissant cet 'iptables' non ?

Add_a_comment

Validator_logo
Catapulse v0.06
( 0.079919 s)