Labo 8 : IDS
Transcription
Labo 8 : IDS
INF4470 Fiabilité et sécurité informatique (Hiver 2010) 1/6 Travail pratique 8 : L'IDS Snort === DESCRIPTION GÉNÉRALE DE L'EXPÉRIMENTATION === Un des objectifs principaux de ce laboratoire est d'observer les avantages d'un système de détection d'intrusion comparativement à un coupe-feu. Par contre, cette puissance a un coût... Dans ce laboratoire, vous configurerez votre poste pour qu'il surveille le réseau auquel il appartient. Vous aurez deux types de trafic à surveiller : 1) pour vérifier certaines de vos règles, vous pourrez vous-même générer du trafic sur votre réseau. Entre autres, à l'aide du serveur OpenSA dans le laboratoire vous pouvez maintenant générer du trafic HTTP. Vous pouvez également ouvrir une session telnet (mot de passe « laboinfo ») sur votre routeur en entrant « telnet @IpDeVotreRouteur » dans une fenêtre de commande. Ou encore, démarrer « Windows Messenger » normalement. 2) De plus, vous pouvez utiliser les attaques que vous avez effectuées lors du laboratoire 1 : Teardrop, Ping of Death, TCP/SYN Flooding(portscan), IP Spoofing et Land. === FONCTIONNEMENT DE SNORT === Snort est fourni avec une base de règles permettant de détecter un bon nombre d'attaques ou d'événements anormaux, mais il est possible d'écrire ses propres règles en suivant une syntaxe précise. Les règles de Snort peuvent « agir » sur le trafic (comme le fait IPTables) en rejetant certains paquets. Mais nous nous contenterons d'expérimenter les règles de type « alert » ayant pour effet de journaliser les événements dans un fichier ET d'émettre un message d'alerte. Après avoir configuré Snort, vous écrirez vos propre règles de « surveillance ». Pour simplifier l'analyse des sorties produites par Snort, nous n'utiliserons que les règles que nous écrirons. CONFIGURATIONS DE SNORT Snort est un logiciel offrant beaucoup de possibilités, et ces possibilités se traduisent en un systèmes de configuration très complet... nous nous en tiendrons au minimum dans ce laboratoire. D'abord, éditons le fichier C:\Snort\etc\snort.conf (les lignes débutant par '#' sont des commentaires) à l'aide de WordPad : 1)Vérifiez que les lignes précisant les variables HOME_NET et EXTERNAL_NET contiennent la valeur « any » (ces variables servent à simplifier l'écriture des règles, mais pour une première expérience avec Snort, mieux vaut utiliser des adresses explicites) : var HOME_NET any var EXTERNAL_NET any 2)Nous écrirons nos règles dans le fichier C:\Snort\rules\inf4470.rules, c'est pourquoi nous devons nous assurer que le chemin menant au fichier de règles est bien C:\Snort\rules et que notre fichier inf4470.rules est bien chargé dans Snort : var RULE_PATH C:\Snort\rules include $RULE_PATH\inf4470.rules INF4470 Fiabilité et sécurité informatique (Hiver 2010) 2/6 3)Pour limiter les alertes et les évènements journalisés par Snort, commentez (mettez un '#' au début de la ligne) TOUTES les lignes qui provoquent l'inclusion d'autres règles, comme ceci : #include $RULE_PATH\?.rules SYNTAXE DES RÈGLES DE SNORT Tout d'abord, il faut créer notre fichier de règles : 1) Ouvrez « NotePad » 2) Sauvegarder ce fichier comme C:\Snort\rules\inf4470.rules Maintenant, voyons les bases de la syntaxe de Snort pour l'écriture de règles (les exemples de cette section n'ont pas à être testés...) : 1) Une règle s'écrit sur une ligne. 2) Une règle comprend deux sections logiques : l'en-tête et les options. 3) L'en-tête comprend : l'action, le protocole, les adresses IP source et destination [+netmasks] et les ports source et destination. 4) Les options sont : les messages d'alerte, et les parties du paquet à être inspectées pour déterminer si l'action doitêtre prise. À l'instar des éléments constituant l'en-tête, les options sont optionnelles ! SAUF l'option sid qui identifie la règle 5) Une règle a la forme : en-tête (options) a) L'en-tête a la forme : action protocole IPsource portSource -> IPdestination portDestination b)Il y a deux types d'options : celles avec contenu et celles sans. Une option avec contenu s'écrit comme suit : nom_de_l_option:contenu; Une option sans contenu s'écrit plutôt : nom_de_l_option; Voici un exemple de règle avec contenu émettant une alerte : alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg:"mountd access"; sid:9000000;) Regardons maintenant les différents champs de l'en-tête des règles : 1) Actions : on se limitera à utiliser les alertes, mais voici quand même la liste complète des actions possibles : alert (envoi d'une alerte et log), log, pass, activate (alert et autre règle), dynamic (déclenché par une règle activate), drop (iptables drop et log), reject (iptables drop, log et messages d'erreur envoyé), sdrop (iptables drop). 2) Protocoles : les protocoles possibles sont TCP, UDP, ICMP et IP. D'autres sont en développement. 3) Adresses IP : les masques de sous-réseaux peuvent être exprimés sous la forme /X, où X représente le nombre de bits du masque (exemple : 10.0.6.0/24). Le mot clé "any" peut-être utilisé pour désigner toutes les adresses IP INF4470 Fiabilité et sécurité informatique (Hiver 2010) 3/6 possibles. Un ensemble d'adresses peut-être spécifié entre crochets et séparés par des virgules. Le symbole « ! », désignant la négation, peut également être utilisé (par exemple : !10.0.6.0 veut dire toutes les adresses IP sauf 10.0.6.0). alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg:"external mountd access"; sid:9000001;) alert tcp ![192.168.1.0/24, 10.1.1.0/24] any -> [192.168.1.0/24,10.1.1.0/24] 111 (content:"|00 01 86 a5|"; msg:"external mountd access"; sid:9000002;) 4) Ports : en plus de pouvoir spécifier explicitement un port, ou d'utiliser le mot clé « any », on peut spécifier des intervalles en séparant les valeurs de début et de fin par deux-points. début:fin Mais si on omet la valeur de début ou de fin, les limites des ports (1 et 65535) sont appliquées. :max (est l'équivalent de 1:max) et min: (est l'équivalent de min:65535) Exemples de règles : alert tcp any :1024 -> 192.168.1.0/24 1024:8000 (content:"|00 01 86 a5|"; msg:"external mountd access"; sid:9000003;) alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 !6000:6010 (content:"|00 01 86 a5|"; msg:"external mountd access"; sid:9000004;) 5) Opérateurs directionnel : bien qu'on utilisera uniquement l'opérateur « -> » signifiant que la source du trafic est à gauche et que la destination est à droite, il existe également un opérateur bidirectionnel « <> » permettant d'écrire deux règles à la fois dans lesquelles source et destination sont interverties. log tcp !192.168.1.0/24 any <> 192.168.1.0/24 23 Il y a quatre catégories d'options : meta-data, payload, non-payload et post-detection. Regardons maintenant différentes options disponibles pour chacune de ces catégories : meta-data --------1) msg : message à utiliser pour décrire l'événement. msg:"message"; 2) sid : identifiant de la règle. sid:nombre_entier; 3) Les autres options de la catégorie meta-data sont : reference, rev, classtype, priority. payload ------1) content : contenu recherché dans les données d'un, ou d'un ensemble, de segments. Ce contenu peut-être décrit en texte (entre " "; '\' est le caractère d'échappement pour ':' ';' '\' '"') ou en hexadécimal (entre | |). On peut rechercher de multiples contenus, et on peut utiliser la négation '!'. INF4470 Fiabilité et sécurité informatique (Hiver 2010) alert tcp any any -> any 80 (content: !"GET"; sid:9000005;) 4/6 2) nocase : la donnée dans l'option « content » ne sera pas sensible à la casse. alert tcp any any -> any any (content:"root"; nocase; sid:9000006;) 3) depth (recherche dans les n premiers octets de données), offset (recherche après les n premiers octets de données), distance (nombre d'octets minimum entre deux motifs) et within (nombre d'octets maximum entre deux motifs) : permettent de préciser l'endroit ou l'on recherche un motif dans les donnés (utilisé avec l'option « content »). alert tcp any any -> any any (content:"root"; offset:4; depth:20; sid:9000007;) alert tcp any any -> any any (content:"Bad"; content:"passwords"; distance:1; sid:9000008;) alert tcp any any -> any any (content:"Bad"; content:"passwords"; within:10; sid:9000009;) 4) Les autres options de la catégorie payload sont : rawbytes, uricontent, isdataat, pcre, byte_test, byte_jump, ftpbounce. non-payload ----------Pour le protocole IP : 1) fragoffset : valeur à comparer au contenu de l'offset dans l'en-tête IP. alert ip any any -> any any (msg:"First Fragment"; fragoffset:0; sid:9000010;) 2) fragbits : on peut utiliser les symboles 'M', 'D' et 'R' pour vérifier si ces bits contiennent 1. ('*' = au moins un des bits, '!' = vérifier si ces bits contiennent 0) alert ip any any -> any any (msg:"First Fragment of serie"; fragbits:M; fragoffset:0; sid:9000011;) 3) dsize : vérifie la taille des données d'un paquet. dsize:300<>400; 4) Il est également possible d'utiliser les options : ttl, tos, id et ipopts. 5) ip_proto : vérifie la valeur du champ « protocol » dans l'en-tête IP. alert ip any any -> any any (ip_proto:igmp; sid:9000012;) 6) sameip : vérifie si les adresses IP source et destination sont la même. alert ip any any -> any any (sampeip; sid:9000013;) Pour le protocole TCP : 1) flags : vérifie si certains bits de l'en-tête TCP sont initialisés. Les valeurs admissible sont : F(FIN), S(SYN), R(RST), P(PSH), A(ACK), U(URG), INF4470 Fiabilité et sécurité informatique (Hiver 2010) 1(reserved bit 1), 2(reserved bit 2) et 0(No TCP flags) 5/6 Comme pour les bits de fragmentation, on a aussi les symboles '*' et '!'. alert tcp any any -> any any (flags:SF; sid:9000014;) 2) Les options suivantes sont également disponible : flow, flowbits, seq, ack, window. Des options existe également pour les protocoles ICMP et RPC... post-detection -------------1) logto : pour journaliser dans différents fichiers logto:"filename"; 2) session (avec printable ou all) : permet de suivre toute une session log tcp any any <> any 23 (session:printable; sid:9000015;) 3) On peut aussi configurer à l'aide des options de « post-detection » les actions que snort peut prendre avec : resp, react et tag. Finalement, on peut utiliser des seuils (threshold : alerte après x événements) et des limites (limit : alerte les x premières fois). Le suivi peut être fait par l'adresse IP source ou l'adresse IP destination (track : by_src OU by_dst). Le nombre d'événements est décrit par l'attribut « count » et les intervalles de temps par « seconds ». Voici des exemples : alert tcp any 23 -> any any (msg:"3 accès tenet refusé en 5 minute !"; content:"Bad"; content:"passwords"; threshold: type threshold, track by_dst, count 3 , seconds 300 ; sid:9000016;) === MANIPULATIONS === Pour démarrer Snort, utiliser la commande suivante dans une fenêtre de commande (DOS) où le répertoire courant est « C:\Snort\bin » : snort -A full -c ..\etc\snort.conf -l ..\log -i 2 -v Snort est alors démarré en mode « verbose », ce qui fait que tout le trafic analysé sera affiché dans la fenêtre de commande. Mais pour pouvoir consulter les alertes et les paquets journalisés, il faut d'abord arrêter Snort. Pour arrêter Snort faite 'ctrl+c'. Suite à l'arrêt de Snort, vous pourrez consulter les alertes émises par Snort dans le fichier C:\Snort\log\alert.ids à l'aide de WordPad. De plus, le trafic journalisé par Snort se trouve dans le fichier snort.log.? (trouvez le bon fichier snort.log.? à l'aide de la date de dernière modification). Ce fichier contient des données dans le format « pcap ». Le contenu du fichier snort.log.? peut donc être consulté dans WireShark. INF4470 Fiabilité et sécurité informatique (Hiver 2010) 6/6 === QUESTION === 1- À quoi sert la règle suivante si on remplace ADRESSE_RÉSEAU par l'adresse de votre réseau : alert tcp ADRESSE_RÉSEAU 23 -> !ADRESSE_RÉSEAU any (content:"Bad"; content:"passwords"; sid:9000020;) 2- Et à quoi sert cette règle : alert tcp any any -> any 80 (content: !"GET"; sid:9000021;) 3- Rédigez une règle détectant UNIQUEMENT (ou le plus précisément possible) les utilisations de « Windows Messenger » sur votre réseau. 4- Rédigez une règle pour détecter l'attaque « Land » que nous avons vue dans le premier laboratoire. 5- Supposons que les termes « installation » et « software » soient synonymes de danger pour vous lorsqu'ils se trouvent dans les données d'un paquet. Rédigez une règle qui déclenche une alerte lorsque ces termes sont détectés conjointement dans les données d'un segment TCP, dans cet ordre(d'abord « installation » et ensuite « software »), et séparés par 50 caractères ou moins. (Vous pouvez tester votre règle avec le serveur Web mis à votre disposition...) Mais qu'est ce qu'y arrive lorsque les données sont chiffrés par SSL ? 6- Proposez deux façons de détecter le « Ping Of Death » dont une des machines de votre réseau est victime en ce moment (et non les « Ping of Death » en général), sans toutefois alerter d'un « ping » légitime échangé entre vous et votre voisin. 7- Êtes-vous capable de concevoir une règle pour détecter un « portscan »(ou une inondation de TCP/SYN) comme celui dont une des machines de votre réseau est victime actuellement. Si oui, comment (donnez la règle) ? Si non, pourquoi ? === À REMETTRE === Vos réponses aux 7 questions.