Ce travail de laboratoire est à faire en équipes de 2 personnes
ATTENTION : Commencez par créer un Fork de ce repo et travaillez sur votre fork.
Clonez le repo sur votre machine. Vous pouvez répondre aux questions en modifiant directement votre clone du README.md ou avec un fichier pdf que vous pourrez uploader sur votre fork.
Le rendu consiste simplement à répondre à toutes les questions clairement identifiées dans le text avec la mention "Question" et à les accompagner avec des captures. Le rendu doit se faire par une "pull request". Envoyer également le hash du dernier commit et votre username GitHub par email au professeur et à l'assistant
Démarrage de l'environnement virtuel
Communication avec les conteneurs
Configuration de la machine IDS et installation de Snort
Ce travail devra être rendu au plus tard, le 29 avril 2021 à 23h59.
Dans ce travail de laboratoire, vous allez explorer un système de détection contre les intrusions (IDS) dont l'utilisation es très répandue grâce au fait qu'il est gratuit et open source. Il s'appelle Snort. Il existe des versions de Snort pour Linux et pour Windows.
Un IDS peut "écouter" tout le traffic de la partie du réseau où il est installé. Sur la base d'une liste de règles, il déclenche des actions sur des paquets qui correspondent à la description de la règle.
Un exemple de règle pourrait être, en langage commun : "donner une alerte pour tous les paquets envoyés par le port http à un serveur web dans le réseau, qui contiennent le string 'cmd.exe'". En on peut trouver des règles très similaires dans les règles par défaut de Snort. Elles permettent de détecter, par exemple, si un attaquant essaie d'éxecuter un shell de commandes sur un serveur Web tournant sur Windows. On verra plus tard à quoi ressemblent ces règles.
Snort est un IDS très puissant. Il est gratuit pour l'utilisation personnelle et en entreprise, où il est très utilisé aussi pour la simple raison qu'il est l'un des systèmes IDS des plus efficaces.
Snort peut être exécuté comme un logiciel indépendant sur une machine ou comme un service qui tourne après chaque démarrage. Si vous voulez qu'il protège votre réseau, fonctionnant comme un IPS, il faudra l'installer "in-line" avec votre connexion Internet.
Par exemple, pour une petite entreprise avec un accès Internet avec un modem simple et un switch interconnectant une dizaine d'ordinateurs de bureau, il faudra utiliser une nouvelle machine éxecutant Snort et placée entre le modem et le switch.
Vous avez besoin de votre ordinateur avec Docker et docker-compose. Vous trouverez tous les fichiers nécessaires pour générer l'environnement pour virtualiser ce labo dans le projet que vous avez cloné.
Ce laboratoire utilise docker-compose, un outil pour la gestion d'applications utilisant multiples conteneurs. Il va se charger de créer un réseaux virtuel lan
, la machine IDS et une machine "Client". Le réseau LAN interconnecte les deux machines (voir schéma ci-dessous).
Nous allons commencer par lancer docker-compose. Il suffit de taper la commande suivante dans le répertoire racine du labo, celui qui contient le fichier docker-compose.yml. Optionnelement vous pouvez lancer le script up.sh qui se trouve dans le répertoire scripts, ainsi que d'autres scripts utiles pour vous :
docker-compose up --detach
Le téléchargement et génération des images prend peu de temps.
Les images utilisées pour les conteneurs sont basées sur l'image officielle Kali. Le fichier Dockerfile que vous avez téléchargé contient les informations nécessaires pour la génération de l'image de base. docker-compose.yml l'utilise comme un modèle pour générer les conteneurs. Vous pouvez vérifier que les deux conteneurs sont crées et qu'ils fonctionnent à l'aide de la commande suivante.
docker ps
Afin de simplifier vos manipulations, les conteneurs ont été configurées avec les noms suivants :
- IDS
- Client
Pour accéder au terminal de l’une des machines, il suffit de taper :
docker exec -it <nom_de_la_machine> /bin/bash
Par exemple, pour ouvrir un terminal sur votre IDS :
docker exec -it IDS /bin/bash
Optionnelement, vous pouvez utiliser les scripts openids.sh et openclient.sh pour contacter les conteneurs.
Vous pouvez bien évidemment lancer des terminaux avec les deux machines en même temps ou même lancer plusieurs terminaux sur la même machine. Il est en fait conseillé pour ce laboratoire de garder au moins deux terminaux ouverts sur la machine IDS en tout moment.
Dans un terminal de votre machine Client, taper les commandes suivantes :
ip route del default
ip route add default via 192.168.1.2
Ceci configure la machine IDS comme la passerelle par défaut pour la machine Client.
Pour permettre à votre machine Client de contacter l'Internet à travers la machine IDS, il faut juste une petite règle NAT :
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Cette commande iptables
définit une règle dans le tableau NAT qui permet la redirection de ports et donc, l'accès à l'Internet pour la machine Client.
On va maintenant installer Snort sur le conteneur IDS.
La manière la plus simple c'est d'installer Snort en ligne de commandes. Il suffit d'utiliser la commande suivante :
apt install snort
Ceci télécharge et installe la version la plus récente de Snort.
Il est possible que vers la fin de l'installation, on vous demande de fournir deux informations :
- Le nom de l'interface sur laquelle snort doit surveiller - il faudra répondre
eth0
- L'adresse de votre réseau HOME. Il s'agit du réseau que vous voulez protéger. Cela sert à configurer certaines variables pour Snort. Vous pouvez répondre
192.168.1.0/24
.
Une fois installé, vous pouvez lancer Snort comme un simple "sniffer". Pourtant, ceci capture tous les paquets, ce qui peut produire des fichiers de capture énormes si vous demandez de les journaliser. Il est beaucoup plus efficace d'utiliser des règles pour définir quel type de trafic est intéressant et laisser Snort ignorer le reste.
Snort se comporte de différentes manières en fonction des options que vous passez en ligne de commande au démarrage. Vous pouvez voir la grande liste d'options avec la commande suivante :
snort --help
On va commencer par observer tout simplement les entêtes des paquets IP utilisant la commande :
snort -v -i eth0
ATTENTION : le choix de l'interface devient important si vous avez une machine avec plusieurs interfaces réseau. Dans notre cas, vous pouvez ignorer entièrement l'option -i eth0
et cela devrait quand-même fonctionner correctement.
Snort s'éxecute donc et montre sur l'écran tous les entêtes des paquets IP qui traversent l'interface eth0. Cette interface reçoit tout le trafic en provenance de la machine "Client" puisque nous avons configuré le IDS comme la passerelle par défaut.
Pour arrêter Snort, il suffit d'utiliser CTRL-C
(attention : il peut arriver de temps à autres que Snort ne réponde pas correctement au signal d'arrêt. Dans ce cas-là, il faudra utiliser kill
depuis un deuxième terminal pour arrêter le process).
Pour enregistrer seulement les alertes et pas tout le trafic, on execute Snort en mode IDS. Il faudra donc spécifier un fichier contenant des règles.
Il faut noter que /etc/snort/snort.config
contient déjà des références aux fichiers de règles disponibles avec l'installation par défaut. Si on veut tester Snort avec des règles simples, on peut créer un fichier de config personnalisé (par exemple mysnort.conf
) et importer un seul fichier de règles utilisant la directive "include".
Les fichiers de règles sont normalement stockes dans le répertoire /etc/snort/rules/
, mais en fait un fichier de config et les fichiers de règles peuvent se trouver dans n'importe quel répertoire de la machine.
Par exemple, créez un fichier de config mysnort.conf
dans le repertoire /etc/snort
avec le contenu suivant :
include /etc/snort/rules/icmp2.rules
Ensuite, créez le fichier de règles icmp2.rules
dans le repertoire /etc/snort/rules/
et rajoutez dans ce fichier le contenu suivant :
alert icmp any any -> any any (msg:"ICMP Packet"; sid:4000001; rev:3;)
On peut maintenant éxecuter la commande :
snort -c /etc/snort/mysnort.conf
Vous pouvez maintenant faire quelques pings depuis votre "Client" et regarder les résultas dans le fichier d'alertes contenu dans le repertoire /var/log/snort/
.
Snort permet l'écriture de règles qui décrivent des tentatives de exploitation de vulnérabilités bien connues. Les règles Snort prennent en charge à la fois, l'analyse de protocoles et la recherche et identification de contenu.
Il y a deux principes de base à respecter :
- Une règle doit être entièrement contenue dans une seule ligne
- Les règles sont divisées en deux sections logiques : (1) l'entête et (2) les options.
L'entête de la règle contient l'action de la règle, le protocole, les adresses source et destination, et les ports source et destination.
L'option contient des messages d'alerte et de l'information concernant les parties du paquet dont le contenu doit être analysé. Par exemple:
alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";)
Cette règle décrit une alerte générée quand Snort trouve un paquet avec tous les attributs suivants :
- C'est un paquet TCP
- Emis depuis n'importe quelle adresse et depuis n'importe quel port
- A destination du réseau identifié par l'adresse 192.168.1.0/24 sur le port 111
Le text jusqu'au premier parenthèse est l'entête de la règle.
alert tcp any any -> 192.168.1.0/24 111
Les parties entre parenthèses sont les options de la règle:
(content:"|00 01 86 a5|"; msg: "mountd access";)
Les options peuvent apparaître une ou plusieurs fois. Par exemple :
alert tcp any any -> any 21 (content:"site exec"; content:"%"; msg:"site
exec buffer overflow attempt";)
La clé "content" apparait deux fois parce que les deux strings qui doivent être détectés n'apparaissent pas concaténés dans le paquet mais a des endroits différents. Pour que la règle soit déclenchée, il faut que le paquet contienne les deux strings "site exec" et "%".
Les éléments dans les options d'une règle sont traités comme un AND logique. La liste complète de règles sont traitées comme une succession de OR.
alert tcp any any -> any any (msg:"My Name!"; content:"Skon"; sid:1000001; rev:1;)
L'entête contient l'information qui décrit le "qui", le "où" et le "quoi" du paquet. Ça décrit aussi ce qui doit arriver quand un paquet correspond à tous les contenus dans la règle.
Le premier champ dans le règle c'est l'action. L'action dit à Snort ce qui doit être fait quand il trouve un paquet qui correspond à la règle. Il y a six actions :
- alert - générer une alerte et écrire le paquet dans le journal
- log - écrire le paquet dans le journal
- pass - ignorer le paquet
- drop - bloquer le paquet et l'ajouter au journal
- reject - bloquer le paquet, l'ajouter au journal et envoyer un
TCP reset
si le protocole est TCP ou unICMP port unreachable
si le protocole est UDP - sdrop - bloquer le paquet sans écriture dans le journal
Le champ suivant c'est le protocole. Il y a trois protocoles IP qui peuvent être analysés par Snort : TCP, UDP et ICMP.
La section suivante traite les adresses IP et les numéros de port. Le mot any
peut être utilisé pour définir "n'import quelle adresse". On peut utiliser l'adresse d'une seule machine ou un block avec la notation CIDR.
Un opérateur de négation peut être appliqué aux adresses IP. Cet opérateur indique à Snort d'identifier toutes les adresses IP sauf celle indiquée. L'opérateur de négation est le !
.
Par exemple, la règle du premier exemple peut être modifiée pour alerter pour le trafic dont l'origine est à l'extérieur du réseau :
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111
(content: "|00 01 86 a5|"; msg: "external mountd access";)
Les ports peuvent être spécifiés de différentes manières, y-compris any
, une définition numérique unique, une plage de ports ou une négation.
Les plages de ports utilisent l'opérateur :
, qui peut être utilisé de différentes manières aussi :
log udp any any -> 192.168.1.0/24 1:1024
Journaliser le traffic UDP venant d'un port compris entre 1 et 1024.
--
log tcp any any -> 192.168.1.0/24 :6000
Journaliser le traffic TCP venant d'un port plus bas ou égal à 6000.
--
log tcp any :1024 -> 192.168.1.0/24 500:
Journaliser le traffic TCP venant d'un port privilégié (bien connu) plus grand ou égal à 500 mais jusqu'au port 1024.
L'opérateur de direction ->
indique l'orientation ou la "direction" du trafique.
Il y a aussi un opérateur bidirectionnel, indiqué avec le symbole <>
, utile pour analyser les deux côtés de la conversation. Par exemple un échange telnet :
log 192.168.1.0/24 any <> 192.168.1.0/24 23
Si Snort détecte un paquet qui correspond à une règle, il envoie un message d'alerte ou il journalise le message. Les alertes peuvent être envoyées au syslog, journalisées dans un fichier text d'alertes ou affichées directement à l'écran.
Le système envoie les alertes vers le syslog et il peut en option envoyer les paquets "offensifs" vers une structure de repertoires.
Les alertes sont journalisées via syslog dans le fichier /var/log/snort/alerts
. Toute alerte se trouvant dans ce fichier aura son paquet correspondant dans le même repertoire, mais sous le fichier snort.log.xxxxxxxxxx
où xxxxxxxxxx
est l'heure Unix du commencement du journal.
Avec la règle suivante :
alert tcp any any -> 192.168.1.0/24 111
(content:"|00 01 86 a5|"; msg: "mountd access";)
un message d'alerte est envoyé à syslog avec l'information "mountd access". Ce message est enregistré dans /var/log/snort/alerts
et le vrai paquet responsable de l'alerte se trouvera dans un fichier dont le nom sera /var/log/snort/snort.log.xxxxxxxxxx
.
Les fichiers log sont des fichiers binaires enregistrés en format pcap. Vous pouvez les ouvrir avec Wireshark ou les diriger directement sur la console avec la commande suivante :
tcpdump -r /var/log/snort/snort.log.xxxxxxxxxx
Vous pouvez aussi utiliser des captures Wireshark ou des fichiers snort.log.xxxxxxxxx comme source d'analyse por Snort.
Réaliser des captures d'écran des exercices suivants et les ajouter à vos réponses.
Essayer de répondre à ces questions en quelques mots, en réalisant des recherches sur Internet quand nécessaire :
Question 1: Qu'est ce que signifie les "preprocesseurs" dans le contexte de Snort ?
Réponse :
Question 2: Pourquoi êtes vous confronté au WARNING suivant "No preprocessors configured for policy 0"
lorsque vous exécutez la commande snort
avec un fichier de règles ou de configuration "fait-maison" ?
Réponse :
--
Considérer la règle simple suivante:
alert tcp any any -> any any (msg:"Mon nom!"; content:"Rubinstein"; sid:4000015; rev:1;)
Question 3: Qu'est-ce qu'elle fait la règle et comment ça fonctionne ?
Réponse :
Utiliser nano pour créer un fichier myrules.rules
sur votre répertoire home (/root
). Rajouter une règle comme celle montrée avant mais avec votre text, phrase ou mot clé que vous aimeriez détecter. Lancer Snort avec la commande suivante :
sudo snort -c myrules.rules -i eth0
Question 4: Que voyez-vous quand le logiciel est lancé ? Qu'est-ce que tous ces messages affichés veulent dire ?
Réponse :
Aller à un site web contenant dans son text la phrase ou le mot clé que vous avez choisi (il faudra chercher un peu pour trouver un site en http... Si vous n'y arrivez pas, vous pouvez utiliser http://neverssl.com et modifier votre votre règle pour détecter un morceau de text contenu dans le site).
Question 5: Que voyez-vous sur votre terminal quand vous chargez le site depuis la machine Client? (vous pouvez utiliser wget pour lancer la requête http ou le navigateur Web lynx - il suffit de taper lynx neverssl.com
. Le navigateur lynx est un navigateur basé sur text, sans interface graphique)
Réponse :
Arrêter Snort avec CTRL-C
.
Question 6: Que voyez-vous quand vous arrêtez snort ? Décrivez en détail toutes les informations qu'il vous fournit.
Réponse :
Aller au répertoire /var/log/snort. Ouvrir le fichier alert
. Vérifier qu'il y ait des alertes pour votre text choisi.
Question 7: A quoi ressemble l'alerte ? Qu'est-ce que chaque élément de l'alerte veut dire ? Décrivez-la en détail !
Réponse :
--
Ecrire une règle qui journalise (sans alerter) un message à chaque fois que Wikipedia est visité SPECIFIQUEMENT DEPUIS VOTRE MACHINE CLIENT. Ne pas utiliser une règle qui détecte un string ou du contenu**.
Question 8: Quelle est votre règle ? Où le message a-t'il été journalisé ? Qu'est-ce qui a été journalisé ?
Réponse :
--
Ecrire une règle qui alerte à chaque fois que votre machine IDS reçoit un ping depuis une autre machine (la seule autre machine que vous avez à disposition c'est la machine Client). Assurez-vous que ça n'alerte pas quand c'est vous qui envoyez le ping depuis l'IDS vers un autre système !
Question 9: Quelle est votre règle ?
Réponse :
Question 10: Comment avez-vous fait pour que ça identifie seulement les pings entrants ?
Réponse :
Question 11: Où le message a-t-il été journalisé ?
Réponse :
**Question 12: Qu'est-ce qui a été journalisé ? (vous pouvez lire les fichiers log utilisant la commande tshark -r nom_fichier_log
**
Réponse :
--
Faites le nécessaire pour que les pings soient détectés dans les deux sens.
Question 13: Qu'est-ce que vous avez fait pour détecter maintenant le trafic dans les deux sens ?
Réponse :
--
Essayer d'écrire une règle qui Alerte qu'une tentative de session SSH a été faite depuis la machine Client sur l'IDS.
Question 14: Quelle est votre règle ? Montrer la règle et expliquer en détail comment elle fonctionne.
Réponse :
Question 15: Montrer le message enregistré dans le fichier d'alertes.
Réponse :
--
Depuis l'IDS, servez-vous de l'outil tshark
pour capturer du trafic dans un fichier. tshark
est une version en ligne de commandes de Wireshark
, sans interface graphique.
Pour lancer une capture dans un fichier, utiliser la commande suivante :
tshark -w nom_fichier.pcap
Générez du trafic depuis le deuxième terminal qui corresponde à l'une des règles que vous avez ajoutées à votre fichier de configuration personnel. Arrêtez la capture avec Ctrl-C
.
Question 16: Quelle est l'option de Snort qui permet d'analyser un fichier pcap ou un fichier log ?
Réponse :
Utiliser l'option correcte de Snort pour analyser le fichier de capture Wireshark que vous venez de générer.
Question 17: Quelle est le comportement de Snort avec un fichier de capture ? Y-a-t'il une différence par rapport à l'analyse en temps réel ?
Réponse :
Question 18: Est-ce que des alertes sont aussi enregistrées dans le fichier d'alertes?
Réponse :
--
Faire des recherches à propos des outils fragroute
et fragrouter
.
Question 19: A quoi servent ces deux outils ?
Réponse :
Question 20: Quel est le principe de fonctionnement ?
Réponse :
Question 21: Qu'est-ce que le Frag3 Preprocessor
? A quoi ça sert et comment ça fonctionne ?
Réponse :
L'utilisation des outils Fragroute
et Fragrouter
nécessite une infrastructure un peu plus complexe. On va donc utiliser autre chose pour essayer de contourner la détection.
L'outil nmap propose une option qui fragmente les messages afin d'essayer de contourner la détection des IDS. Générez une règle qui détecte un SYN scan sur le port 22 de votre IDS.
Question 22: A quoi ressemble la règle que vous avez configurée ?
Réponse :
Ensuite, servez-vous du logiciel nmap pour lancer un SYN scan sur le port 22 depuis la machine Client :
nmap -sS -p 22 192.168.1.2
Vérifiez que votre règle fonctionne correctement pour détecter cette tentative.
Ensuite, modifiez votre commande nmap pour fragmenter l'attaque :
nmap -sS -f -p 22 --send-eth 192.168.1.2
Question 23: Quel est le résultat de votre tentative ?
Réponse :
Modifier le fichier myrules.rules
pour que snort utiliser le Frag3 Preprocessor
et refaire la tentative.
Question 24: Quel est le résultat ?
Réponse :
Question 25: A quoi sert le SSL/TLS Preprocessor
?
Réponse :
Question 26: A quoi sert le Sensitive Data Preprocessor
?
Réponse :
Question 27: Donnez-nous vos conclusions et votre opinion à propos de snort
Réponse :
Pour nettoyer votre système et effacer les fichiers générés par Docker, vous pouvez exécuter le script cleanup.sh. ATTENTION : l'effet de cette commande est irréversible*.
This guide draws heavily on http://cs.mvnu.edu/twiki/bin/view/Main/CisLab82014