Serrure Securisée

Pour les discussions concernant cette partie on pourra aller ici.

Principe

La serrure sécurisée devra nous permettre d'ouvrir à distance un accès à notre machine.
Le principe est d'envoyer un message précis à un port précis sur notre machine, qui lancera alors le démon ssh permettant la connexion sécurisée à distance.
Puis un autre message sur ce port permettra la fermeture de l'accès distant.
L'intérêt d'un tel dispositif et d'éviter à ce que l'accès distant soit ouvert en permanence, laissant ainsi le temps à un attaquant de le forcer.
Le message et le port d'écoute devront être variable mais prédictible, afin de nous permettre de les deviner. Une solution serait d'utiliser la date et/ou l'heure pour les calculer.

Problèmes

Le premier problème qui nous est venu à l'esprit est l'inutilité d'un port variable. En effet, il est relativement facile pour un attaquant de le trouver à l'aide d'un scanner de port (nmap). Pour contourner ce problème, le message à envoyer afin d'ouvrir l'accès distant sera également variable.
Un autre problème est la sensibilité à l'écoute réseau. Un attaquant pourrait récolter un maximum de port et message correspondant à un moment donné, et tenter de découvrir notre algorithme. Plusieurs solutions permettent de corriger ce problème : le chiffrement de la connexion (chiffrement par clé ou certificat par exemple), ou le changement régulier de l'algorithme de génération de port/message.

Implémentation

L'ensemble de la serrure sera implémenté en Python (serveur et client).

Fonctionnement

Le programme pyLock génère un nombre aléatoire dont nous connaissons l'algorithme. Cet algorithme renvoie un nouveau nombre toutes les 30 secondes
Ainsi, toutes les 30 secondes un port attendant une connexion TCP est donc ouvert pour un laps de temps de 30 secondes puis fermé. Et ainsi de suite.

De son côté, le client doit connaître l'algorithme de génération de port afin de pouvoir se connecter au bon port. Sinon il ne trouvera pas la serrure.
Une fois que le client a trouvé la serrure, il lui faut la bonne clé. Ici la clé est un nombre généré par un algorithme. Ce nombre change toutes les 30 secondes et est généré qu'au moment de la connexion du client. Ce nombre n'existe donc pas avant qu'un client arrive.
Ce nombre constituant la clé de la serrure est ensuite hashé à l'aide de l'algorithme SHA 224 de la librairie de Python.

Ce n'est qu'une fois que le client a trouvé la serrure avec la bonne clé que pyLock lancera le serveur SSH sur son port d'écoute habituel.
Le client peut alors se connecter au serveur SSH et effectuer les modifications voulues.
Pendant ce temps pyLock continue à ouvrir et fermer des ports toutes les 30 secondes.
Lorsque le client a terminé ces mises à jour. De la même manière il demande au programme pyLock de fermer le serveur SSH.

Vulnérabilités

Pour feinter ce système un pirate doit donc connaître l'algorithme de génération de port. Pour cela il peut étudier la manière dont s'ouvrent les différents ports aux différents moments. Ce qui peut s'avérer assez complexe et long.
Ou alors simplement utiliser nmap pour voir ou se trouve la serrure pendant le laps de temps p de 30 secondes.
Ensuite, le pirate devra connaître l'algorithme de génération de mot de passe hashé via SHA 224. Ceci s'avère beaucoup plus compliqué.

Solutions aux vulnérabilités

La conception de notre serrure sécurisée, fait qu'il est aisé de changer les algorithmes de génération de ports/mot de passe. Modifier une simple variable de cet algorithme à des répercussions importantes sur la série de nombre aléatoire.
C'est pour cette raison que le comportement de nos algorithmes de génération de nombres pseudo-aléatoires change toutes les heures et tout les jours. Donc, un pirate ne peut qu'étudier la suite de nombre générée sur un laps de temps d'une heure. Le lendemain à la même heure, la suite sera différente.

Exemple

Le serveur attend et change de port toutes les 30 secondes :

[root@localhost serrure]# python serrure.py
Création serveur sur port 1777
Lancement serveur
Destruction serveur
Création serveur sur port 1810
Lancement serveur

Un client arrive (il connait l'algorithme de génération de port et de mot de passe) :

[cedric@localhost serrure]$ python client.py
Tentative de connexion sur : ('127.0.0.1', 1810)
Envoie de open:5bce843dd76db8c939d5323dd3e54ec9

Le mot de passe est bon, le serveur ouvre SSH :

Connected by ('127.0.0.1', 52638)
Donnée reçu : open:5bce843dd76db8c939d5323dd3e54ec9
sh: /etc/init.d/ssh: ...
SSH lancé ...

Destruction serveur
Création serveur sur port 1834
Lancement serveur

Le client peut maintenant se connecter au port SSH qui vient d'être ouvert.
Pendant ce temps le serveur sécurisé continue de changer de port toutes les 30 secondes.

Le client demande la déconnexion :

[cedric@localhost serrure]$ python client.py
Tentative de connexion sur : ('127.0.0.1', 1834)
Envoie de clos:1113d7a76ffceca1bb350bfe145467c6

Le serveur ferme alors SSH :

Connected by ('127.0.0.1', 42391)
Donnée reçu : clos:1113d7a76ffceca1bb350bfe145467c6
sh: /etc/init.d/ssh: ...
SSH fermé ...
Destruction serveur
Création serveur sur port 1867
Lancement serveur

SSH est fermé et le serveur sécurisé tourne toujours.

Modification des règles du firewall

Ces 2 scripts servent à modifier les règles de firewall, afin d'ouvrir le port généré.
Ils s'appellent en fournissant le port à fermer (ou à ouvrir).
La serrure doit ensuite effacer les anciennes règles, et relancer le fichiers des nouvelles.

#!/bin/sh
#Ajoute l'ouverture en entree et en sortie vers le port aleatoire fourni en parametre

echo "iptables -A INPUT -p tcp -i eth0 --dport $1 -j ACCEPT">>/home/cdjs/pyLock/iptable
echo "iptables -A OUTPUT -p tcp -o eth0 --sport $1 -j ACCEPT">>/home/cdjs/pyLock/iptable
#!/bin/sh
#Efface les regles concernant le port fourni en parametre

cat /home/cdjs/pyLock/iptable | grep -v $1 > /home/cdjs/pyLock/tmp
cat /home/cdjs/pyLock/tmp > /home/cdjs/pyLock/iptable
rm -f /home/cdjs/pyLock/tmp
#!/bin/sh
#Reinitialise le firewall

iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

Historique

Version 0.1 (20/01/09 15:16)
Version 0.2 (21/01/09 17:37)
Version 0.3 (22/01/09 21:45)
Version 0.4 (05/02/09 11:45)

Date : 20/01/09 15:16

Dépendances

  • python 2.5

Release notes

  • première version.

Todo

  • amélioration : remplacer MD5 par SHA 224 ;
  • amélioration : corriger un bug au niveau de la génération de ports aléatoire.

Source

pyLock

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License