Le serveur de test resté allumé
Un développeur a ouvert un port pour tester une page, puis il est parti en vacances. Le port est resté ouvert trois mois, et le programme derrière n'a jamais été mis à jour.
Un port dont personne n'a besoin est une porte que personne ne surveille. La fermer ne coûte rien.
À la fin de cette leçon
Remarque
Je peux trouver ce qu'un serveur écoute, fermer ce qui est inutile et vérifier les mises à jour.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Port | une porte numérotée d'une machine, où un programme écoute | 22 |
| Écouter | attendre à un port que quelqu'un se connecte | |
| Bouclage | l'adresse 127.0.0.1, que seule la même machine peut atteindre | |
| Refus par défaut | refuser tout ce qu'aucune règle n'autorise | |
| Correctif | une mise à jour qui répare une faille connue | |
| Surface d'attaque | tout ce qu'un attaquant peut atteindre et essayer |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Ce qui écoute peut être attaqué
Chaque programme qui écoute à un port est une entrée possible. Moins il y en a, moins l'attaquant a d'essais.
Le premier travail est de regarder. Vous lancez deux petits serveurs web à vous depuis un dossier vide, l'un ouvert au réseau et l'autre seulement à cette machine.
Lister ce qui écoute maintenant
ss -ltnAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Créer un dossier vide à servir
mkdir -p site-videAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer un serveur ouvert au réseau sur 8088
(timeout 120 python3 -m http.server 8088 --bind 0.0.0.0 --directory site-vide >/dev/null 2>&1 &)Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer un serveur de bouclage sur 8089
(timeout 120 python3 -m http.server 8089 --bind 127.0.0.1 --directory site-vide >/dev/null 2>&1 &)Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Comparer les deux
ss -ltn | grep -E ':808[89]'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire la colonne Local Address
Le dernier Run a écrit deux lignes. L'une contient 0.0.0.0:8088 et l'autre 127.0.0.1:8089.
L'adresse 0.0.0.0 veut dire tous les réseaux où se trouve la machine. L'adresse 127.0.0.1 veut dire cette machine seule. Le second serveur ne peut pas être attaqué de l'extérieur, et il n'a besoin d'aucune règle de pare-feu.
Les deux serveurs s'arrêtent seuls au bout de deux minutes.
Une règle peut refuser un port
Parfois un programme doit écouter largement mais ne doit pas être atteint. Une règle de pare-feu sur la machine peut le refuser.
Vous ajoutez maintenant une règle pour le seul port 8088, dans une table à vous appelée entrainement. Votre terminal n'est pas touché, et rien n'est sauvegardé. Si un Run dit nft: command not found, installez-le avec sudo apt-get install -y nftables.
Refuser le port 8088 avec une règle
sudo nft 'add table inet entrainement; add chain inet entrainement garde { type filter hook input priority 0 ; policy accept ; }; add rule inet entrainement garde tcp dport 8088 reject with tcp reset'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Interroger maintenant le port 8088
curl -sS -m 3 http://127.0.0.1:8088/ 2>&1 | head -n 1Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Interroger le port 8089, que rien ne touche
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8089/Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ce que disent les deux réponses
Le premier curl a écrit curl: (7) Failed to connect to 127.0.0.1 port 8088, suivi d'une note sur le temps. La règle a refusé la connexion aussitôt. Le second a écrit 200 : le port 8089 répond toujours.
Un vrai pare-feu part dans l'autre sens. Sa politique est le refus par défaut, et une règle autorise chaque port nécessaire.
Exemple : refus par défaut pour un serveur web
| Port | Usage | Règle |
|---|---|---|
| 22 | SSH pour l'administrateur | Autoriser, depuis l'adresse du bureau seulement |
| 443 | Le site web | Autoriser, depuis partout |
| 8088 | Une page de test oubliée | Aucune règle, donc refusé |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Supprimer la table d'entraînement
sudo nft delete table inet entrainementAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Arrêter les deux serveurs jetables
pkill -f 'http.server 808'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Les correctifs ferment des failles déjà trouvées
La plupart des attaques utilisent une faille qui a déjà un correctif. Un serveur en retard sur ses mises à jour est facile à attaquer.
Vous pouvez regarder sans rien changer. Le mot -s veut dire simuler : la commande écrit ce qu'elle ferait et ne fait rien. Les nombres dépendent du jour, donc aucun n'est donné ici.
Une version plus récente d'openssl est-elle proposée ?
apt-cache policy openssl | head -n 3Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Combien de mises à jour seraient installées ?
sudo apt-get -s upgrade | grep -c '^Inst'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup de gens pensent qu'un port est sûr parce que personne ne sait qu'il existe. Les scanners essaient tous les ports en quelques minutes. Un port est sûr quand aucun programme n'y écoute, ou qu'une règle le refuse. Être inconnu n'est pas un contrôle.
Aller plus loin : un calendrier de correctifs
Lancez ls /etc/apt/apt.conf.d et cherchez un fichier dont le nom contient auto-upgrades. S'il existe, lisez-le avec cat. Il dit si la machine installe seule les mises à jour de sécurité.
Écrivez deux phrases. Une raison de laisser un serveur se mettre à jour seul. Une raison pour laquelle une école voudrait d'abord tester les mises à jour.