Les systèmes de détection d’intrusions
I. Introduction
II. Les différents types d’attaques
II-A. Anatomie d’une attaque
- Probe : consiste en la collecte d’informations par le biais d’outils comme whois, Arin, DNS lookup. La collecte d’informations sur le système cible peut s’effectuer de plusieurs manières, par exemple un scan de ports grâce au programme Nmap pour déterminer la version des logiciels utilisés, ou encore un scan de vulnérabilités à l’aide du programme Nessus.
Pour les serveurs web, il existe un outil nommé Nikto qui permet de rechercher les failles connues ou les problèmes de sécurité. Des outils comme firewalk, hping ou SNMP Walk permettent quant à eux de découvrir la nature d’un réseau ;
- Penetrate : utilisation des informations récoltées pour pénétrer un réseau. Des techniques comme le brute force ou les attaques par dictionnaires peuvent être utilisées pour outrepasser les protections par mot de passe. Une autre possibilité pour s’infiltrer dans un système est d’utiliser des failles applicatives que nous verrons ci-après ;
- Persist : création d’un compte avec des droits de super utilisateur pour pouvoir se réinfiltrer ultérieurement. Une autre technique consiste à installer une application de contrôle à distance capable de résister à un reboot (ex. : un cheval de Troie) ;
- Propagate : cette étape consiste à observer ce qui est accessible et disponible sur le réseau local ;
- Paralyze : cette étape peut consister en plusieurs actions. Le pirate peut utiliser le serveur pour mener une attaque sur une autre machine, détruire des données ou encore endommager le système d’exploitation dans le but de planter le serveur.
Après ces cinq étapes, le pirate peut éventuellement tenter d’effacer ses traces, bien que cela ne soit rarement utile. En effet, les administrateurs réseau sont souvent surchargés de logs à analyser. De plus, il est très difficile de supprimer entièrement des traces.
II-B. Les attaques réseau
II-B-1. Les techniques de scan
- le scan simple : aussi appelé le scan connect(), il consiste à établir une connexion TCP complète sur une suite de ports. S’il arrive à se connecter, le port est ouvert ; sinon, il est fermé. Cette méthode de scan est très facilement détectable ;
- le scan furtif : aussi appelé scan SYN, il s’agit d’une amélioration du scan simple. Ce scan essaie également de se connecter sur des ports donnés, mais il n’établit pas complètement la connexion : pas de commande ACK (acquittement) après avoir reçu l’accord de se connecter. Grâce à ceci, la méthode est bien plus furtive que le scan normal ;
- les scans XMAS, NULL et FIN : se basent sur des détails de la RFC du protocole TCP pour déterminer si un port est fermé ou non en fonction de la réaction à certaines requêtes. Ces scans sont moins fiables que le scan SYN, mais ils sont un peu plus furtifs. La différence entre ces trois types de scan se situe au niveau des flags TCP utilisés lors de la requête ;
- le scan à l’aveugle : s’effectue via une machine intermédiaire et avec du spoofing (voir plus bas). Le système attaqué pense que le scan est réalisé par la machine intermédiaire et non par le pirate ;
- le scans passif : est la méthode la plus furtive. Consiste à analyser les champs d’en-tête des paquets (TTL, ToS, MSS…) et à les comparer avec une base de signatures qui pourra déterminer les applications qui ont envoyé ces paquets.
Remarque : l’utilitaire incontournable pour réaliser des scans de ports se nomme Nmap.
II-B-2. IP Spoofing
- Source routing : technique consistant à placer le chemin de routage directement dans le paquet IP. Cette technique ne fonctionne plus de nos jours, les routeurs rejetant cette option.
- Reroutage : cette technique consiste à envoyer des paquets RIP aux routeurs afin de modifier les tables de routage. Les paquets avec l’adresse spoofée seront ainsi envoyés aux routeurs contrôlés par le pirate et les réponses pourront être également reçues par celui-ci.
II-B-3. ARP Spoofing (ou ARP Redirect)
II-B-4. DNS Spoofing
- DNS Cache Poisoning : les serveurs DNS possèdent un cache permettant de garder pendant un certain temps la correspondance entre un nom de machine et son adresse IP. Le DNS Cache Poisoning consiste à corrompre ce cache avec de fausses informations. Ces fausses informations sont envoyées lors d’une réponse d’un serveur DNS contrôlé par le pirate à un autre serveur DNS, lors de la demande de l’adresse IP d’un domaine (ex. : www.ledomaine.com). Le cache du serveur ayant demandé les informations est alors corrompu ;
- DNS ID Spoofing : pour communiquer avec une machine, il faut son adresse IP. On peut toutefois avoir son nom, et grâce au protocole DNS, nous pouvons obtenir son adresse IP. Lors d’une requête pour obtenir l’adresse IP à partir d’un nom, un numéro d’identification est placé dans la trame afin que le client et le serveur puissent identifier la requête. L’attaque consiste ici à récupérer ce numéro d’identification (en sniffant le réseau) lors de la communication entre un client et un serveur DNS, puis envoyer des réponses falsifiées au client avant que le serveur DNS lui réponde.
Remarque : une attaque que nous allons voir ci-après, le Déni de Service, peut aider à ralentir le trafic du serveur DNS et ainsi permettre de répondre avant lui.
II-B-5. Fragments attacks
- Fragments overlapping : quand un message est émis sur un réseau, il est fragmenté en plusieurs paquets IP. Afin de pouvoir reconstruire le message, chaque paquet possède un offset. Le but de l’attaque est de réaliser une demande de connexion et de faire chevaucher des paquets en spécifiant des offsets incorrects. La plupart des filtres analysant les paquets indépendamment, ils ne détectent pas l’attaque. Cependant, lors de la défragmentation, la demande de connexion est bien valide et l’attaque a lieu ;
- Tiny fragments : le but de l’attaque est de fragmenter une demande de connexion sur deux paquets IP : le premier paquet de taille minimum (68 octets selon la RFC du protocole IP) ne contient que l’adresse et le port de destination. Le deuxième paquet contient la demande effective de connexion TCP. Le premier paquet est accepté par les filtres puisqu’il ne contient rien de suspect. Quand le deuxième paquet arrive, certains filtres ne le vérifient pas, pensant que si le premier paquet est inoffensif, le deuxième l’est aussi. Mais lors de la défragmentation sur le système d’exploitation, la connexion s’établit !
De nos jours, une grande majorité des firewalls(2) sont capables de détecter et stopper ce type d’attaques.
II-B-6. TCP Session Hijacking
II-C. Les attaques applicatives
II-C-1. Les problèmes de configuration
II-C-2. Les bogues
II-C-3. Les buffer overflows
II-C-4. Les scripts
II-C-5. Les injections SQL
II-C-6. Man in the middle
II-D. Le Déni de service
- SYN Flooding : exploite la connexion en trois phases de TCP (Three Way Handshake :
SYN/SYN-ACK/ACK). Le principe est de laisser un grand nombre de connexions TCP en attente. Le pirate envoie de nombreuses demandes de connexion (SYN), reçoit les SYN-ACK, mais ne répond jamais avec ACK. Les connexions en cours occupent des ressources mémoire, ce qui va entraîner une saturation et l’effondrement du système ;
- UDP Flooding : le trafic UDP est prioritaire sur TCP. Le but est donc d’envoyer un grand nombre de paquets UDP, ce qui va occuper toute la bande passante et ainsi rendre indisponibles toutes les connexions TCP.
Exemple : faire une requête chargen (port 19/service de génération de caractères) à une machine en spoofant l’adresse et le port source, pour rediriger vers echo (port 7/service qui répète la chaîne de caractères reçue) d’une autre machine ;
- Packet Fragment : utilise une mauvaise gestion de la défragmentation au niveau ICMP.
Exemple : ping of death. La quantité de données est supérieure à la taille maximum d’un paquet IP. Remarque : pour rappel, nous avons vu que les techniques d’attaque se basant sur la fragmentation des paquets peuvent aussi être utilisées pour outrepasser un filtre IP ;
- Smurfling : le pirate fait des requêtes ICMP ECHO à des adresses de broadcast en spoofant l’adresse source (en indiquant l’adresse de la machine cible). Cette machine cible va recevoir un nombre énorme de réponses, car toutes les machines vont lui répondre, et ainsi utiliser toute sa bande passante ;
- Déni de service distribué : le but est ici de reproduire une attaque normale à grande échelle. Pour ce faire, le pirate va tenter de se rendre maître d’un nombre important de machines. Grâce à des failles (buffer overflows, failles RPC(4)…) il va pouvoir prendre le contrôle de machines à distance et ainsi pouvoir les commander à sa guise.
Une fois ceci effectué, il ne reste plus qu’à donner l’ordre d’attaquer à toutes les machines en même temps, de manière à ce que l’attaque soit reproduite à des milliers d’exemplaires. Ainsi, une simple attaque comme un SYN Flooding pourra rendre une machine ou un réseau totalement inaccessible.
II-E. Actuellement
III. Détection d’attaques : les IDS
III-A. Les différents types d’IDS
III-A-1. Les systèmes de détection d’intrusions (IDS)
- Faux positif : une alerte provenant d’un IDS, mais qui ne correspond pas à une attaque réelle.
- Faux négatif : une intrusion réelle qui n’a pas été détectée par l’IDS
III-A-2. Les systèmes de détection d’intrusions « réseau » (NIDS)
III-A-3. Les systèmes de détection d’intrusions de type hôte (HIDS)
III-A-4. Les systèmes de détection d’intrusions « hybrides »
III-A-5. Les systèmes de prévention d’intrusions (IPS)
- host-based memory and process protection :surveille l’exécution des processus et les tue s’ils ont l’air dangereux (buffer overflow). Cette technologie est utilisée dans les KIPS (Kernel Intrusion Prevention System) que nous décrivons un peu plus loin ;
- session interception / session sniping : termine une session TCP avec la commande TCP Reset : « RST ». Ceci est utilisé dans les NIPS (Network Intrusion Prevention System) ;
- gateway intrusion detection : si un système NIPS est placé en tant que routeur, il bloque le trafic ; sinon il envoie des messages à d’autres routeurs pour modifier leur liste d’accès.
Un IPS possède de nombreux inconvénients. Le premier est qu’il bloque toute activité qui lui semble suspecte. Or, il est impossible d’assurer une fiabilité à 100 % dans l’identification des attaques. Un IPS peut donc malencontreusement bloquer du trafic inoffensif ! Par exemple, un IPS peut détecter une tentative de déni de service alors qu’il s’agit simplement d’une période chargée en trafic. Les faux positifs sont donc très dangereux pour les IPS. Le deuxième inconvénient est qu’un pirate peut utiliser sa fonctionnalité de blocage pour mettre hors service un système. Prenons l’exemple d’un individu mal intentionné qui attaque un système protégé par un IPS, tout en spoofant son adresse IP. Si l’adresse IP spoofée est celle d’un nœud important du réseau (routeur, service Web…), les conséquences seront catastrophiques. Pour pallier ce problème, de nombreux IPS disposent des « white lists », c’est-à-dire des listes d’adresses réseau qu’il ne faut en aucun cas bloquer. Et enfin, le troisième inconvénient et non le moindre : un IPS est peu discret. En effet, à chaque blocage d’attaque, il montre sa présence. Cela peut paraître anodin, mais si un pirate remarque la présence d’un IPS, il tentera de trouver une faille dans celui-ci afin de réitérer son attaque… mais cette fois en passant inaperçu. Voilà pourquoi les IDS passifs sont souvent préférés aux IPS. Cependant, il est intéressant de noter que plusieurs IDS (ex. : Snort, RealSecure, Dragon…) ont été dotés d’une fonctionnalité de réaction automatique à certains types d’attaques.
III-A-6. Les systèmes de prévention d’intrusions « kernel » (KIDS/KIPS)
III-A-7. Les firewalls
- les systèmes à filtrage de paquets sans état : analysent les paquets les uns après les autres, de manière totalement indépendante ;
- les systèmes à maintien d’état (stateful) : vérifient que les paquets appartiennent à une session régulière. Ce type de firewall possède une table d’états où est stocké un suivi de chaque connexion établie, ce qui permet au firewall de prendre des décisions adaptées à la situation.
Ces firewalls peuvent cependant être outrepassés en faisant croire que les paquets appartiennent à une session déjà établie ;
- les firewalls de type proxy : le firewall s’intercale dans la session et analyse l’information afin de vérifier que les échanges protocolaires sont conformes aux normes.
III-A-8. Les technologies complémentaires
III-B. Les méthodes de détection
III-B-1. L’approche par scénario (misuse detection)
III-B-2. L’approche comportementale (Anomaly Detection)
- peu fiable : tout changement dans les habitudes de l’utilisateur provoque une alerte ;
- nécessite une période de non-fonctionnement pour mettre en œuvre les mécanismes d’autoapprentissage : si un pirate attaque pendant ce moment, ses actions seront assimilées à un profil utilisateur, et donc passeront inaperçues lorsque le système de détection sera complètement mis en place ;
- l’établissement du profil doit être souple afin qu’il n’y ait pas trop de fausses alertes : le pirate peut discrètement intervenir pour modifier le profil de l’utilisateur afin d’obtenir après plusieurs jours ou semaines, un profil qui lui permettra de mettre en place son attaque sans qu’elle ne soit détectée.
Plusieurs approches peuvent être utilisées pour la méthode de détection comportementale : Approche probabiliste Des probabilités sont établies permettant de représenter une utilisation courante d’une application ou d’un protocole. Toute activité ne respectant pas le modèle probabiliste provoquera la génération d’une alerte. Exemple : Avec le protocole HTTP, il y a une probabilité de 0.9 qu’une commande GET soit faite après une connexion sur le port 80. Il y a ensuite une probabilité de 0.8 que la réponse à cette commande GET soit « HTTP/1.1 200 OK ». Approche statistique Le but est de quantifier les paramètres liés à l’utilisateur : taux d’occupation de la mémoire, utilisation des processeurs, valeur de la charge réseau, nombre d’accès à l’Intranet par jour, vitesse de frappe au clavier, sites les plus visités… Cette méthode est très difficile à mettre en place. Elle n’est actuellement présente que dans le domaine de la recherche, où les chercheurs utilisent des réseaux neuronaux et le data mining pour tenter d’avoir des résultats convaincants. Autres méthodes D’autres méthodes existent, mais ne sont pas encore répandues. Parmi celles-ci, nous pouvons noter :
- l’utilisation de l’immunologie, c’est-à-dire construire un modèle de comportement normal des services ;
- la présentation d’une activité habituelle sous forme de graphe.
III-B-3. Les méthodes répandues
- Pattern Matching algorithmes de recherche de motifs (ex. : Boyer-Moore), algorithmes de comptage, algorithmes génétiques ;
- Analyse Protocolaire conformité aux RFC ;
- Détection d’anomalies méthodes heuristiques ;
- Analyse statistique modèles statistiques ;
- Analyse probabiliste réseaux bayésiens ;
- Autres analyses comportementales réseaux de neurones, systèmes experts + data mining, immunologie, graphes…
Il est bien sûr impossible de détailler chacun des algorithmes mis en œuvre dans les IDS. Nous avons cependant dédié le chapitre 6 aux algorithmes de pattern matching.
III-C. Principes généraux et installation technique
III-C-1. Déploiement d’un NIDS
- les systèmes et les applications doivent être mises à jour régulièrement (patches de sécurité) ;
- les systèmes utilisant Internet doivent être dans un réseau isolé (DMZ(5)) ;
- chaque utilisateur doit être averti de l’importance de la sécurité de ses mots de passe ;
- les fonctionnalités des services qui ne sont pas utilisées doivent être désactivées.
Lors du déploiement d’un IDS, il faut le configurer correctement : par exemple, si le réseau est sous Windows, les règles destinées à Unix ne sont pas nécessaires. Il faut donc faire une configuration en fonction de l’OS, des applications et du matériel utilisés. L’emplacement du senseur(6) est très important :

- À l’emplacement B, seul le trafic entre les systèmes de la DMZ et Internet est analysé. Le trafic entre le réseau interne et Internet n’est pas analysé. Pour cela, il faudra également placer un senseur au point A.
- À l’emplacement C, le trafic entre Internet et le réseau interne ou la DMZ est analysé. Par contre, le trafic entre le réseau interne et la DMZ est invisible.
Il est impensable de vouloir analyser tout le trafic d’un réseau. Il faut donc donner la priorité aux systèmes à risque : ceux qui offrent des services accessibles par Internet (HTTP, FTP…). De plus, il est souvent préférable de placer le senseur après le firewall du côté interne. Ainsi, seuls les flux acceptés par le firewall sont analysés, ce qui réduit fortement la charge de la sonde IDS. Lors de l’installation d’un NIDS, le choix matériel a également une grande importance. Puisqu’une sonde NIDS doit être capable d’analyser le trafic réseau quel que soit le destinataire, elle devra recevoir elle-même tous les paquets. Pour cela, le NIDS devra jouer le rôle d’un sniffer(7), mais le matériel réseau pose parfois problème :
- un switch simple (commutateur) : en utilisant un tel équipement, la conversation avec l’IDS est impossible du fait de la nature d’un switch : il commute les paquets directement au destinataire. Il est dès lors impossible d’installer une sonde qui analysera le trafic global ;
- un hub (concentrateur) => la conversation avec l’IDS est possible, car les hubs répètent les paquets en les émettant à toutes les machines connectées. Cependant, les hubs sont peu fiables et sont donc à éviter ;
- il existe des switches professionnels qui copient le trafic et l’envoie sur un port spécifié (où sera placé le NIDS) : SPAN port (Switch Port Analyzer). Attention : pour ce port, il faudra utiliser une connexion rapide (ex. : Gigabits) capable d’analyser entièrement le trafic provenant ou à destination des différents sous réseaux.
Un autre problème doit être pris en considération : lorsque les flux sont cryptés (ex. : par SSL, c’est le cas pour les VPN(8)), il est impossible pour l’IDS de décrypter ces flux. Il faut dans ce cas utiliser un proxy SSL comme illustré ci-dessous.

Nous savons donc maintenant que l’emplacement des sondes et le matériel réseau utilisés sont très importants. Cependant, un autre point ne doit pas être oublié : la sécurisation du senseur et des logs d’alerte. En effet, si la sonde elle-même ou si les alertes qu’elles génèrent ne sont pas sécurisées, un pirate pourrait très bien rendre l’IDS complètement inefficace. Pour sécuriser les sondes et les fichiers d’alertes, il est par exemple possible de mettre en place un réseau de management très contrôlé, avec son propre firewall. Ce système sera primordial pour la sécurité du réseau et plusieurs mesures devront être prises pour assurer son fonctionnement :
- le système d’exploitation du senseur devra tenu à jour ;
- un système d’authentification robuste (ex. : PKI) pourra être mis en place pour renforcer la sécurité ;
- tous les mots de passe devront être changés régulièrement ;
- il est également possible d’utiliser deux interfaces réseaux pour le senseur : la première pour générer les alertes et contrôler le trafic, et la deuxième, complètement invisible, en tant que point de monitoring. Ce genre d’interface est communément appelée stealth interface.
III-C-2. Problèmes techniques
- capture de la trame par l’interface en mode promiscuité (promiscous mode) ;
- analyse de la trame et filtrage éventuel en bas niveau ;
- détection de la présence de fragments ou non et passage éventuel à un moteur de reconstruction ;
- transfert de la trame vers le système d’exploitation ;
- filtrage éventuel ;
- applications de divers préprocesseurs en fonction du type de requête afin de contrer des techniques d’évasion d’attaques (voir plus loin) ;
- passage vers le moteur d’analyse (protocole, pattern matching, statistique…).
Pour améliorer les performances de l’IDS, il peut donc être judicieux de répartir les charges. Par exemple, il est envisageable de séparer les flux à analyser en fonction du protocole de niveau 4 : une sonde pour l’analyse des flux Web, une autre pour l’analyse des flux FTP et une analyse des requêtes SQL. Un autre problème est la corrélation des informations provenant de plusieurs types de sondes. Voici les actions à réaliser pour regrouper ces informations :
- agrégation : rassembler les informations des différentes sondes ;
- fusion : fusionner en supprimant les doublons (même attaque détectée par plusieurs sondes) ;
- corrélation : définir un motif commun, c’est-à-dire interpréter une suite d’événements et les résumer.
Une corrélation intéressante serait de ne garder que les alertes qui concernent une faille probable du système. Pour cela il faut utiliser un scanner de vulnérabilités par exemple, ou ne pas afficher les alertes concernant IIS si on possède Apache, ce qui entraînera moins de faux positifs. Néanmoins, l’utilisation d’un scanner de vulnérabilités n’est pas parfaite, car il est difficile d’échanger des informations entre un scanner de vulnérabilités et un IDS. Cependant, depuis peu, des consoles de corrélation entre IDS et scanners de vulnérabilités sont proposées (ex. : Nevo de Tenable Network Security). Enfin, un dernier problème est qu’il n’y a aucune interopérabilité entre les différents IDS du marché, mis à part la possibilité d’exporter les informations dans des formats standard. Pourtant, des normes ont été établies, comme nous allons le voir.
III-C-3. Complémentarité des IDS
III-D. Normalisation
- générateur d’événements (boîte E) : envoie des événements à la boîte A ;
- analyseur d’événements (boîte A) : produit des alertes ;
- base de données événementielle (boîte D) ;
- système de réponse (boîte R) : réponse en temps réel face aux attaques.
Ce comité a aussi défini un langage de description des intrusions (CISL – Common Intrusion Specification Language) qui utilise des expressions verbales (ex. : « ouvrir session », « effacer objet »…). Cependant, ce langage n’a jamais été utilisé, mais il a inspiré d’autres comités. L’IDWG (Intrusion Detection Working Group) a effectué la plupart des travaux dans le domaine de la standardisation des IDS : norme IDMEF (Intrusion Detection Message Exchange Format) : définit le format des messages échangés dans un IDS ; protocole IDXP (Intrusion Detection eXchange Protocol) : procédures de transport entre les entités de l’IDS. Selon l’IDWG, un IDS est ensemble de plusieurs senseurs, analyseurs et managers :

C’est un schéma théorique, rarement implémenté de cette façon dans les IDS. La norme IDMEF préconise une représentation en XML des messages où dans chaque message, on retrouve l’ID de l’analyseur, le type d’alerte, l’emplacement (le nœud réseau), le jour et l’heure, l’adresse, la classification de l’attaque…
III-E. Techniques antiIDS
- attaque par déni de service : rendre l’IDS inopérant en le saturant ;
- attaque par insertion : le pirate, pour éviter d’être repéré, injecte des paquets de leurres qui seront ignorés par le système d’exploitation de la cible, mais pris en compte par l’IDS : l’IDS ne détecte rien d’anormal, alors que sur le système cible, l’attaque a bien lieu puisque les paquets superflus sont ignorés ;
- attaque par évasion : il s’agit de la technique inverse à l’attaque par insertion. Ici, des données superflues sont ignorées par l’IDS, mais prises en compte par le système d’exploitation. Nous détaillons un peu plus loin quelques techniques d’évasion Web.
III-E-1. Détecter un IDS
- le pirate génère une série de pings vers l’adresse à tester, puis il mesure et note les temps de réponse ;
- le pirate sature ensuite le réseau en broadcast(9) dans le but de ralentir l’IDS, qui recevra tous les paquets. Enfin, le pirate réémet la même série de pings en mesurant les nouveaux temps de réponse. S’ils sont bien plus élevés que les premiers temps obtenus, il est fort possible que la machine soit en mode promiscous ;
exploiter les mécanismes de réponses actives : les IPS réagissent à certaines attaques (fermer session, bloquer port…), mais en faisant cela, ils laissent souvent des empreintes (header des paquets) permettant d’identifier le type d’IPS ; observation des requêtes DNS : Les IDS génèrent souvent des requêtes DNS lors des alertes. En observant le DNS primaire lors de fausses attaques, on peut détecter qu’il y a un IDS.
III-E-2. Déni de services contre un IDS
III-E-3. Techniques d’insertion
- l’IDS les estime inoffensives ;
- la cible ne les décode pas ;
Voici quelques méthodes permettant d’utiliser des techniques d’insertion : – en utilisant la fragmentation IP qui est gérée de manière différente selon l’OS lors de cas anormaux (ex. : recouvrement de paquets) : soit les fragments anciens sont favorisés, soit les nouveaux le sont. Par exemple, il est donc possible que les IDS favorisent les anciens paquets alors que le système d’exploitation utilisé favorise les nouveaux. Pour utiliser le recouvrement de fragments (fragmentation overlap), il faut modifier artificiellement les champs « longueur » et « décalage » (offset) des fragments IP ; – en utilisant l’écrasement de fragments (fragmentation overwrite) : même principe que précédemment, mais des fragments entiers sont remplacés, et non seulement des parties de paquets ; – en utilisant le timeout de fragmentation : les systèmes conservent en général les fragments pendant 60 secondes pour le réassemblage ; mais les IDS les gardent souvent moins longtemps. On peut donc espacer les fragments dans le temps pour ne pas se faire repérer par l’IDS tout en réalisant une attaque complète sur le système d’exploitation ; – découpage de sessions TCP (session splicing) : la requête TCP est divisée en paquets, tout en modifiant le numéro de séquence pour créer des recouvrements : même principe qu’avec la fragmentation IP + possibilité de timeout (Apache Linux : 5 min dans tampon, IIS : 10 min). L’un des outils pour réaliser ce genre d’attaques se nomme fragroute ; – insérer un faux paquet avec checksum erroné : certains IDS ne verront pas l’attaque, car peu d’IDS vérifient le checksum. Le système, par contre, rejettera le paquet erroné. Attention : de nos jours, les routeurs rejettent souvent les paquets erronés ; il faut donc utiliser un autre champ que le checksum, par exemple le TTL.
III-E-4. Techniques d’évasion
III-F. Critères de tests d’un IDS
- Méthodes et capacités de détection : estimer le taux de faux positifs et la qualité d’information fournie par l’IDS ;
- Rapidité : tester l’IDS en condition de charge élevée. Il est important de tester cela de manière réaliste, et non pas en utilisant des générateurs de paquets ;
- Ouverture : il faut que l’IDS permette de modifier les signatures afin d’éviter certains faux positifs, mais aussi d’ajouter de nouvelles signatures spécifiques à l’environnement ;
- Résistance aux techniques d’évasion : utiliser des outils tels que Whisker, Nikto, Babelweb, Fragroute ou Mendax pour observer le comportement de l’IDS ;
- Architecture logicielle : pour les grandes entreprises, il est intéressant de pouvoir séparer les fonctions d’administration ;
- Exploitabilité des données : il faut disposer d’outils permettant de retrouver et analyser facilement les événements suspects, car le volume généré par les IDS est important. Afin de centraliser les données, il peut être intéressant de disposer de consoles de reporting ou de tableaux de bord.
- Ergonomie : on retrouve différents types d’interfaces dans les IDS. Tout d’abord, les interfaces graphiques qui sont adaptées aux particuliers ou aux PME. Ensuite, les interfaces de type Web ou encore les interfaces en ligne de commandes réservées aux spécialistes. Dans tous les cas, l’interface doit offrir de nombreuses fonctionnalités.
D’autres critères, comme la réactivité de l’éditeur (mises à jour des signatures, correctifs…), ou le prix (solution libre ou non) rentrent en jeu. Pour évaluer un IDS, il est intéressant de pondérer chacun de ces critères selon l’importance qu’on leur attribue, et donner une note à l’IDS pour chaque critère.
IV. Mise en œuvre d’IDS
IV-A. NIDS / NIPS : Snort
IV-A-1. Description
IV-A-2. Installation
- libpcap (http://www.tcpdump.org) : offre des fonctions de sniffer
- PCRE (http://www.pcre.org) : permet d’utiliser des expressions régulières de type Perl
La compilation de ces bibliothèques se fait très aisément : ./configure, make, make install. 3. Ouvrir un terminal, décompresser ensuite l’archive de Snort et se placer dans le répertoire des sources décompressées. 4. Configurer la compilation de Snort afin d’activer plusieurs fonctionnalités : ./configure [options]. Deux options nous ont semblé intéressantes :
- –with-mysql=DIR : activer le support de MySQL. Ainsi Snort enregistrera les alertes dans une base de données accessible par d’autres applications (ex. : BASE, décrite plus loin). MySQL n’est bien sûr pas l’unique SGBD supporté.
PostgreSQL ou Oracle peuvent également être utilisés avec les options -withpostgresql et –with-oracle.
- –enable-flexresp : activer les réponses flexibles en cas de tentatives de connexion hostile. Pour activer cette option, la bibliothèque libnet (http://www.packetfactory.net/libnet) est nécessaire.
5. Compiler les sources : make. 6. Installer Snort : make install en mode root. 7. Pour que Snort puisse fonctionner en mode détection/prévention d’intrusions, il est nécessaire de lui fournir des fichiers de règles. Le site de Snort propose deux types de règles : les règles officielles et les règles créées par la communauté. Certaines règles officielles ne sont disponibles que pour les utilisateurs enregistrés, tandis que les règles communautaires sont disponibles à tous et mises à jour régulièrement. Il est cependant important de noter que les règles proposées par la communauté n’ont pas été forcément testées par l’équipe officielle de Snort. Après téléchargement, l’archive des règles doit être décompressée. Il est conseillé de placer le répertoire rules dans le dossier de Snort. Nous pouvons remarquer que les règles consistent en de simples fichiers textes, et qu’un fichier un peu spécial est présent : snort.conf. Ce dernier va nous permettre de configurer Snort.
IV-A-3. Configuration
- la variable HOME_NET permet de spécifier quels réseaux ou quelles interfaces seront surveillés par Snort. La valeur any signale à Snort de surveiller tout le trafic ;
- si le réseau à surveiller possède des serveurs DNS, SMTP, FTP, etc., il est possible de spécifier les adresses IP de ces serveurs via les variables DNS_SERVERS, SMTP_SERVERS… Si le réseau ne possède pas un type spécifique de serveur, il est conseillé de commenter (avec le caractère #) la ligne concernée, afin d’optimiser le traitement de Snort. En effet, il est inutile d’analyser du trafic HTTP si aucun serveur Web n’est disponible ;
- certains ports de services peuvent être configurés via des variables telles que HTTP_PORTS ou ORACLE_PORTS.
- la variable RULE_PATH est très importante. Elle permet de spécifier le répertoire où sont stockés les fichiers de règles de Snort.
- les directives include permettent d’inclure des fichiers de règles. Ici encore, il est conseillé de n’inclure que les règles nécessaires en fonction des services disponibles sur le réseau.
IV-A-4. Exécution
- -A : générer des alertes. Activé par défaut avec l’option -c
- -c <emplacement de snort.conf> : lancer Snort avec des fichiers de règles.
- -l <répertoire de log> : spécifier le répertoire où les logs d’alertes seront stockés (défaut : /var/log/snort)
- -v : mode verbose. Permet d’afficher les paquets capturés
- -T : mode test. Permet de tester la configuration de Snort
Avant de lancer Snort en mode NIDS, il est préférable de tester si le programme arrive à récupérer les paquets qui circulent sur le réseau. Pour cela, nous pouvons par exemple lancer Snort en simple mode Sniffer : snort -v. Si aucun paquet n’est capturé et affiché, il est probable que Snort n’écoute pas sur la bonne interface. L’option -i permet de spécifier une autre interface. Lançons maintenant Snort en mode NIDS. Pour cela, nous lui précisons l’emplacement du fichier de configuration avec l’option -c : snort -c /opt/snort/rules/snort.conf Toutes les alertes détectées sont ainsi stockées dans le fichier /var/log/snort/alert. Pour chaque alerte, Snort donne une priorité, une description, les flags des paquets et éventuellement des adresses sur Internet où se trouvent de plus amples informations sur la tentative d’intrusion. Exemple :
[**] [1:1384:8] MISC UPnP malformed advertisement [**] [Classification: Misc Attack] [Priority: 2] 03/25-17:34:49.251861 192.168.0.1:1900 -
>
239.255.255.250:1900 UDP TTL:1 TOS:0x0 ID:37277 IpLen:20 DgmLen:437 Len: 409 [Xref =>
http://www.microsoft.com/technet/security/bulletin/MS01-
059.mspx][Xref =>
http://cve.mitre.org/cgibin/ cvename.cgi?name=2001-0877][Xref =>
http://cve.mitre.org/cgi-bin/cvename.cgi?name=2001-
0876][Xref =>
http://www.securityfocus.com/bid/3723]
IV-A-5. Création de nouvelles règles
action protocole adresse1 port1 direction adresse2 port2 |
Le champ action peut prendre les valeurs suivantes :
- alert : générer une alerte + logger le paquet
- log : logger le paquet
- pass : ignorer le paquet
- activate : activer une règle dynamique
- dynamic : définir une règle dynamique, qui est passive tant qu’elle n’est pas activée par une autre règle
- drop : demander à iptables(10) de bloquer le paquet, puis le logger
- reject : demander à iptables de bloquer le paquet, puis le logger, et envoyer une commande TCP RST (reset) ou une réponse ICMP Host unreachable
- sdrop : demander à iptables de bloquer le paquet. Ce dernier n’est pas loggé.
Le champ protocole spécifie le protocole pour lequel la règle s’applique. Les valeurs possibles sont : tcp, udp, icmp ou ip. Les champs adresse1 et adresse2 indiquent l’adresse IP source et destination du paquet. Le mot-clé any permet de spécifier une adresse quelconque. Les adresses doivent être numériques, les adresses symboliques ne sont pas acceptées. Les champs port1 / port2 spécifient les numéros de port utilisés par la source et la destination. Le mot-clé any permet de spécifier un port quelconque. Des noms de services peuvent être utilisés : tcp, telnet… De même des plages de ports peuvent être spécifiées avec le caractère « : ». Le champ direction spécifie l’orientation du paquet. Cet opérateur peut prendre deux valeurs : -> : adresse1 vers adresse2 <> : de adresse1 vers adresse2, ou de adresse2 à adresse1 Notons qu’il n’y a pas d’opérateur <- . La partie Options des règles contient différentes options, séparées par un point-virgule, qui vont permettre de préciser des critères de détection. Pour chaque option, le format est nomOption : valeur1[, valeur2…] Voici les options importantes :
- msg : spécifier le message qui sera affiché dans le log et dans l’alerte
- reference : faire référence à un site expliquant l’attaque détectée
- classtype : définir la classe de l’attaque (troyen, shellcode…)
- priority : définir la sévérité de l’attaque
- content : spécifier une chaîne de caractères qui doit être présente dans le paquet pour déclencher l’action de la règle
- rawbytes : spécifier une suite d’octets qui doit être présente dans le paquet pour déclencher l’action de la règle
- uricontent : identique à content, mais est adapté au format normalisé des URI (ex. : hexadécimal accepté)
- pcre : utiliser une expression régulière compatible Perl pour spécifier le contenu du paquet
- ttl : spécifier la valeur du TTL du paquet
- flags : spécifier la présence d’un flag TCP dans le paquet (ex. : SYN, FIN…)
- fragbits : vérifier la présence de certains bits IP (more fragments, don’t fragment ou bit réservé)
- session : extraire toutes les informations de la session TCP à laquelle le paquet suspect appartient
- resp : activer une réponse flexible (flexresp) afin de bloquer l’attaque. Il est ainsi possible d’envoyer une commande TCP ou ICMP précise. Cette option nécessite l’activation du mode flexresp lors de la compilation de Snort.
- limit : limiter le nombre d’actions pendant un intervalle de temps pour le même événement.
Exemple de règle :
alert tcp any any -
>
$HTTP_SERVERS $HTTP_PORTS (msg:"
WEBATTACKS
/bin/ls command attempt"
;
uricontent:
"
/bin/ls"
;
nocase; classtype:web-application-attack;)
Cette règle permet de générer une alerte quand un paquet provient d’un couple (adresse:port) quelconque, est à destination des serveurs HTTP définis dans snort.conf, et contient la chaîne « /bin/ls » dans l’URI. Le message de l’alerte sera « WEB-ATTACKS /bin/ls command attempt ». Cette attaque sera classée dans la classe web-application-attack (priorité medium par défaut). Il est bien sûr impossible d’être exhaustif ici pour décrire le format des règles Snort. Le manuel utilisateur disponible sur le site officiel indique comment utiliser aux mieux le langage des signatures de Snort.
IV-A-6. La console BASE
- un SGBD installé, par exemple MySQL
- Snort compilé avec le support de ce SGBD
- un serveur HTTP, par exemple Apache
- l’interpréteur PHP avec les supports pour le SGBD choisi, la bibliothèque GD et les sockets.
- La bibliothèque ADODB : http://adodb.sourceforge.net
Nous ne détaillerons pas ici l’installation de chaque dépendance. La documentation livrée avec les sources de BASE (disponibles sur http://secureideas.sourceforge.net) fournit les informations nécessaires. Notons cependant que l’archive des sources de Snort dispose également d’un dossier schemas contenant le code SQL pour créer la structure de la base de données pour différents SGBD. Le fichier doc/README.database donne toutes les indications pour créer le schéma de la base de données. Afin que Snort enregistre les alertes dans la base de données, il ne faut pas oublier de modifier le fichier snort.conf et rajouter une ligne output database avec les informations pour se connecter à la base de données. Exemple :
output database: log, mysql, user=snortusr password=pwd
dbname=snort host=localhost
Après configuration et installation de BASE ainsi que de toutes ses dépendances, nous pouvons y accéder avec un navigateur internet. Si tout se passe bien, un écran similaire à l’illustration suivante est obtenu :

IV-B. NIDS : Bro
IV-B-1. Description
- un langage de script propre à Bro permettant d’écrire les règles de détection et d’action ;
- l’utilisation des expressions régulières pour exprimer les motifs des signatures ;
- la possibilité d’exécuter des programmes tiers après détection d’intrusion permet de réaliser de nombreux types d’actions ;
- une compatibilité avec les règles de Snort, grâce à un convertisseur nommé snort2bro ;
- la possibilité d’utiliser GnuPG (Gnu Privacy Gard) pour crypter et signer les rapports d’alertes. Cela permet d’empêcher l’espionnage ou la falsification des logs par un pirate ;
- l’envoi d’un rapport périodique des alertes par mail.
L’architecture de Bro est définie en trois couches principales :
- le module Packet Capture : chargé d’écouter le trafic en mode sniffer et de transmettre tous les paquets à la couche supérieure ;
- le module Event Engine : classe les flux par protocole, crée une table d’états pour les connexions, contrôle l’intégrité (checksum), réassemble les fragments et analyse les flux. Ce module génère des événements qu’il transmet à la troisième couche ;
- le module Policy Layer : utilise les scripts écrits dans le langage de Bro pour traiter les événements.
IV-B-2. Installation
IV-B-3. Configuration
IV-B-4. Exécution
- alarm.XXX : les attaques détectées
- conn.XXX : un résumé des connexions établies
- ftp.XXX : des informations concernant le trafic FTP suspect
- HTTP.XXX : des informations concernant le trafic HTTP suspect
- info.XXX : des informations générales
- notice.XXX : un suivi des événements lancés
IV-B-5. Création de nouvelles règles
- conditions d’en-tête : elles permettent de spécifier le protocole, les ports et les adresses source et de destination ;
- conditions de contenu : elles sont exprimées sous forme d’expressions régulières pour reconnaître le contenu de certains types de requêtes ;
- conditions de dépendance : elles permettent d’exprimer des dépendances entre les signatures. Par exemple, une signature ne doit être détectée que si une autre signature l’a été ;
- conditions de contexte : elles permettent de rajouter l’exécution de certaines fonctions, écrites avec le langage de script de Bro, qui complémenteront les autres conditions.
Comme nous pouvons le voir, les conditions de détection de signatures sont très évoluées. Cependant, ce n’est pas le cas des actions, c’est-à-dire les opérations à réaliser quand une signature est détectée. Il n’existe pour l’instant qu’une seule action possible : event. Celle-ci va permettre de décrire l’éventuelle attaque qui a été détectée. Enfin, rappelons l’existence de snort2bro qui permet de convertir des règles écrites pour Snort dans le format de Bro. Ainsi, un utilisateur préférant la syntaxe de Snort ou utilisant ces deux NIDS, pourra très facilement réutiliser ses règles Snort avec Bro.
IV-C. Comparatif Snort & Bro
+ grande communauté => de nouvelles règles sont très régulièrement proposées par |
le CERT, SANS ou l’équipe de Snort |
+ grande communauté => de nombreux plugins, frontends, consoles de management… |
+ mise en œuvre basique rapide |
+ projet maintenu par une société : très bonne réactivité et produit adapté aux entreprises |
+ de nombreux livres et documentations existants |
+ fichiers d’alertes facilement analysables par un humain |
+ fichiers d’alertes très complets (header des paquets, lien vers description de |
l’attaque…) |
– fichiers d’alertes difficiles à parser de manière automatisée |
– configuration essentiellement par édition de fichiers texte |
– de nombreuses fonctionnalités sont payantes |
Bro :
+ possibilité d’utiliser des règles Snort en les convertissant avec l’utilitaire snort2bro |
+ forte customisation, qui rend l’IDS très difficile à détecter par un pirate |
+ langage de script puissant et adapté à la détection d’intrusion |
+ de nombreuses fonctionnalités prévues pour la version 1.0 |
+ cryptage et signature électronique des rapports |
+ rapport périodique résumant les alertes |
+ configuration très simple grâce à un script interactif |
+ fichiers d’alertes très faciles à parser de manière automatisée |
– projet maintenu par des chercheurs : réactivité moyenne et produit peu adapté aux entreprises |
– fichiers d’alertes difficilement analysables par un humain en format brut |
– peu d’informations dans les rapports d’alertes |
– documentation incomplète empêchant d’utiliser pleinement les nombreuses fonctionnalités |
– aucune GUI actuellement disponible |
– pas de support natif pour enregistrer les alertes dans une base de données |
En analysant ces tableaux de fonctionnalités, nous pouvons remarquer que Bro est loin d’être un projet amateur, car il possède des options très intéressantes. Mais pour devenir un grand NIDS respecté par les entreprises, il devra favoriser le développement de ses méthodes de détection ainsi que simplifier l’accès à l’application par une documentation complétée et des interfaces facilitant la gestion et l’analyse des logs. Quant à Snort, il a fait ses preuves. Mais la version Open-Source est encore réservée à une certaine élite. Bien évidemment, la version commerciale n’a sûrement pas les mêmes faiblesses.
IV-D. NIPS : SnortSam
IV-E. NIPS : Snort-Inline
IV-F. HIDS : OSSEC
IV-F-1. Description
IV-F-2. Installation
IV-F-3. Configuration
- Global : contient les paramètres d’alertes par email ;
- Rules : indique les différents fichiers contenant les règles de détection ;
- Syscheck : spécifie les répertoires à scanner et les fichiers à ignorer ;
- Rootcheck : contient les paramètres de détection des rootkits. Les fichiers contenant les signatures doivent être spécifiés ;
- Active-response : active/désactive la réponse active ;
- Alerts : spécifie le niveau d’alerte pour avertir par email l’administrateur ;
- Localfiles : contient tous les fichiers de logs à vérifier (une entrée par fichier).
IV-F-4. Création de nouvelles règles
<
group name="
syslog,attacks
"
>
...<
rule id="
1608
"
level="
14
"
timeframe="
120
"
>
<
if_matched_regex>
^sshd[\d+
]:
\.+
Corrupted check by bytes on<
/if_matched_regex>
<
regex>
^sshd[\d+
]:
fatal: Local: crc32 compensation attack<
/regex>
<
description>
SSH CRC-32 Compensation attack<
/description>
<
cve>
2001-0144<
/cve>
<
info>
http://www.securityfocus.com/bid/2347/info/<
/info>
<
/rule>
...<
/group>
Cette règle est caractérisée par un identifiant unique (chaque règle possède un identifiant propre), un niveau de sécurité allant de 0 à 16 (ici 14) et une fréquence d’apparition (timeframe). Cette fréquence d’apparition permet de déclencher une règle uniquement si une règle précédente a déjà été levée. La règle précédente est spécifiée à l’aide de la baliseif_matched_regex. Cette dernière option de répétition est bien sur optionnelle. Plusieurs options de concordance sont possibles. Ici regex spécifie qu’il s’agit d’une expression régulière à trouver dans la chaîne. Toutefois, il existe l’option match qui spécifie une sous-chaîne à trouver dans la chaîne. La balise description permet de donner une courte description de la règle ; cve la date de découverte de la faille et enfin info permet de spécifier une information supplémentaire sur la règle, par exemple l’URL qui référence l’exploit connu. Plus d’informations sont disponibles dans la documentation sur le site officiel d’OSSEC.
IV-G. HIDS : SamHain
IV-G-1. Description
IV-G-2. Installation
./configure --enable-network=server --enable-xml-log --
with-database=mysql --prefix=/usr/local/yule
make
make install
Le serveur (se nommant yule) va ici être installé dans /usr/local/yule. Effectuons à présent l’installation du client :
./configure --prefix=/usr/local/samhain --enable-xml-log -
-enable-network=client \
--with-datafile=
REQ_FROM_SERVER/var/lib/samhain/samhain_file \
--with-config-file=REQ_FROM_SERVER/etc/samhainrc \
--with-logserver=server.yourdomain.com
make
La variable REQ_FROM_SERVER indique que ce fichier doit être récupéré du serveur. Logserver spécifie l’adresse où se trouve le serveur regroupant toutes les alertes, c’est-à-dire l’adresse à laquelle le client samhain enverra les alertes. Cette installation n’est toutefois pas terminée, puisqu’avant d’effectuer la dernière phase, il faut configurer le client pour qu’il puisse s’authentifier au niveau du serveur. Générons une clé aléatoire sur le serveur :
yule -P $SHPW
|
sed s%
HOSTNAME
%
client.yourdomain.com%
>>
/etc/yulerc
Indiquons cette clé à notre client :
./samhain_setpwd samhain new $SHPW
Cette opération a pour but de créer un nouveau binaire se nommant samhain_new, qui nous permettra de nous connecter avec le serveur. Terminons l’installation avec ces lignes :
mv samhain.new samhain make install
&
&
make install-boot samhain -t init
IV-G-3. Configuration
[Log]
ExportSeverity=warn
IV-H. HIDS : RkHunter
IV-H-1. Description
IV-H-2. Installation
/usr/local/bin/rkhunter -c -sk
Voici un exemple de résultat :
Networking * Check: frequently used backdoors Port 2001: Scalper Rootkit [ OK ] Port 2006: CB Rootkit [ OK ] Port 2128: MRK [ OK ] Port 14856: Optic Kit (Tux) [ OK ] Port 47107: T0rn Rootkit [ OK ] Port 60922: zaRwT.KiT [ OK ] * Interfaces Scanning
for
promiscuous interfaces [ OK ] Security advisories * Check: Groups and Accounts Searchingfor
/etc/passwd... [ Found ] Checking users with UID '0' (root)... [ OK ] * Check: SSH Searchingfor
sshd_config... * Check: Events and Logging Searchfor
syslog configuration... [ OK ] Checkingfor
running syslog slave... [ OK ] Checkingfor
logging to remote system... [ OK (no remote logging) ] ------------------ Scan results -------------------- MD5 MD5 compared: 0 Incorrect MD5 checksums: 0 File scan Scanned files: 342 Possible infected files: 0 Application scan Vulnerable applications: 0 Scanning took 62 seconds
IV-I. Comparatif HIDS

Tirons quelques conclusions de ce tableau comparatif. D’une part, nous remarquons immédiatement la déficience du logiciel Rkhunter. Ceci est normal, Rkhunter est uniquement un analyseur système pour vérifier la présence de rootkits. Mais nous avons jugé important de le placer dans ce comparatif de par ses fonctionnalités d’alerte qui se rapprochent, voire équivalent, celles d’autres HIDS. Les deux systèmes Ossec et Samhain sont fort proches. Ils possèdent tous les deux la possibilité d’être mis en place de manière locale ou bien via une architecture client/serveur. Chacun d’entre eux analyse le système pour vérifier la non-présence de rootkits, inspecte les fichiers de logs pour y détecter des activités anormales, et permet d’avertir l’administrateur via des emails ou en journalisant les alertes. En dehors de cela, nous remarquerons la maigre supériorité de Samhain sur OSSEC. Toutefois, cette supériorité est à tempérer. En effet, durant nos tests, l’installation de Samhain nous a posé quelques problèmes, et la configuration n’a pas été des plus simples. À l’inverse, le système OSSEC est doté d’un installeur qui prend les choses en main et nous demande uniquement les paramètres de configuration. Ainsi, malgré un nombre de fonctionnalités important, Samhain n’est peut-être pas aussi mature qu’il le laisse paraître.
IV-J. IDS Hybride : Prelude

De plus, cette console permet de générer des graphiques statistiques rassemblant des informations importantes sur les cibles visées et permettant de voir rapidement quelles sont les alertes les plus fréquentes. L’illustration suivante est un exemple des possibilités de la console de Prelude.

IV-K. KIDS : LIDS
V. Tests de détection d’attaques
V-A. Exploit phpBB

Aucun des deux IDS ne s’est montré capable de détecter correctement cet exploit. En effet, les signatures par défaut de Snort ne détectent pas l’attaque en elle-même, mais l’accès au fichier concerné. Néanmoins, il est impensable de générer une alerte pour chaque accès au fichier viewtopic.php sur un serveur disposant d’un forum phpBB.
V-B. Scan TCP SYN

Conclusion : Ce genre de scan passait inaperçu il y a quelques années, mais il est facilement détectable de nos jours.
V-C. Scan TCP Connect

Conclusion : Cette méthode de scan est la plus facile à mettre en œuvre, mais c’est également la moins discrète.
V-D. Scan Null

Conclusion : Ici, Snort se montre plus performant que Bro, qui ne voit rien d’anormal lors du scan.
V-E. Remarques sur les scans
V-F. Exploit : Overflow HTTP d’Oracle 9i (win32)

Screenshot de l’attaque :

Conclusion : Snort dispose par défaut de la signature pour cette attaque, permettant de la détecter très facilement.
V-G. Remarques sur les exploits Oracle 9i
VI. Algorithmique : le Pattern Matching
VI-A. Introduction
- x = x0x1…xm-1 : le motif à rechercher, de longueur m
- y = y0y1…yn-1: le texte sur lequel aura lieu la recherche, de longueur n
- x[i] et y[i] : le ime caractère de x ou y, équivalent à xi et yi
La plupart des algorithmes de pattern matching utilisent une fenêtre glissante de taille m. Cette fenêtre représente la position de l’éventuelle occurrence du motif. En d’autres termes, elle englobe les caractères du texte qui vont être comparés avec le motif pour la tentative en cours. Cette fenêtre est décalée à chaque non-correspondance (mismatch) et la procédure de comparaison reprend au début de la fenêtre.

Deux catégories de pattern matching peuvent être distinguées :
- avec motifs fixes et texte variant : c’est le cas des NIDS avec texte fixe ;
- motifs variants : correspond à une recherche dans un dictionnaire
Dans tous les cas, l’efficacité d’un algorithme de pattern matching dépend du nombre de comparaisons de caractères nécessaires pour rechercher le motif. Lors du choix et de l’implémentation d’un algorithme de pattern matching, plusieurs considérations doivent être prises en compte : a) Le type de pattern matching : recherche multi ou simple motif, motifs statiques ou dynamiques… b) Sensibilité à la casse : dans le cas d’une recherche insensible à la casse, les caractères du motif et du texte seront par exemple convertis en majuscules. c) La taille des motifs : certains algorithmes ont des performances réduites pour les motifs de grande taille. d) La taille de l’alphabet : la plupart des algorithmes fonctionnent facilement si les caractères sont stockés sur un octet, mais dans le cas du codage Unicode, certaines adaptations devront être apportées. e) Le risque d’attaques de l’algorithme : des pirates peuvent éventuellement utiliser les propriétés et le comportement de l’algorithme pour réduire les performances du programme. Il est donc nécessaire, surtout dans le cas des IDS, d’évaluer les conséquences de telles attaques. f) La fréquence des recherches et la taille des textes de recherche : ces deux aspects peuvent influencer les performances, et l’algorithme devra être adapté aux types de recherches réalisés.
VI-B. Algorithme naïf (Brute Force Algorithm)
Procédure Recherche_Naïve (x, y)
:
i:
= 0 j:
= 0 tantque i<
m et j<
n faire si y[j] = x[i] alors // Caractère identique:
i:
= i+
1 // on continue dans la même fenêtre j:
= j+
1 // sinon j:
= j - i+
1 // Décalage de la fenêtre i:
= 0 // Le motif est reparcouru finsi fintantque si i = m alors Occurrence de x trouvée à la position j - m sinon Pas d'occurrence finsi
Dans le pire des cas, cet algorithme fait (n – m + 1) m comparaisons, ce qui correspond à une complexité temps de O(mn). Ce cas correspond par exemple à la recherche de am-1b dans an puisque à chaque tentative, l’algorithme parcourt tout le motif, pour se rendre compte que le dernier caractère (b) n’est pas identique.
VI-C. L’algorithme de Morris – Pratt

x[i] et y[j+i], avec 0<i<m. Dès lors :
- x[0..i-1] = y[j..j+i-1] : les i-1 caractères précédemment comparés sont identiques.Notons u cette sous-chaîne.
- x[i] ≠ y[j+i]

Lorsqu’un décalage de la fenêtre de comparaison a lieu, il ne faut pas oublier qu’un préfixe v du motif peut correspondre à un suffixe de la portion u du texte. Ce préfixe v est appelé un bord de u. Définition : Soit u un mot quelconque non vide, un bord de u est un mot distinct de u qui est à la fois préfixe et suffixe de u.

Notation : Soit mpNext[i] la longueur du plus long bord de x[0..i-1], pour 0 < i ≤ m. mpNext[0] = -1 mpNext[i] = | Bord maximal (x[0..i-1]) | Après un décalage, les comparaisons peuvent reprendre entre x[mpNext[i]] et y[j+i] sans risquer d’oublier une occurrence de x dans y, et tout en évitant de faire un retour en arrière dans le texte. La table mpNext peut être construite en espace et temps O(m). Cette table doit être construite avant la phase de recherche.
Procédure PrétraitementMP (x, m, mpNext[] ) i
:
= 0 j:
= mpNext[0]:
= -1 tantque (i<
m) faire // Parcours du motif tantque ((j>
-1) et (x[i] ≠ x[j])) faire j:
= mpNext[j]; fintantque j:
= j+
1 i:
= i+
1 mpNext[i] = j fintantque
Voyons un exemple de la table des longueurs des bords maximaux pour le motif « ACABACA ».

Nous remarquons que mpNext[7] = 3, c’est-à-dire que le bord maximal de x[0..6], et donc du motif entier, est de longueur 3. En effet, ce bord est « ACA » qui est préfixe et suffixe de ACABACA. Après la création des longueurs des bords, la phase de recherche peut être faite en temps O(m+n). Au pire des cas, l’algorithme de Morris-Pratt fait 2n-1 comparaisons.
Procédure RechercheMP (x, m, y, n) PrétraitementMP (x, m, mpNext) i
:
= j:
= 0 // Initialisation des indices tantque (j<
= n) faire // Parcours du texte tantque ( (i>
-1) et (x[i] ≠ y[i]) ) faire i:
= mpNext[i] // Décalage en fin de bord fintantque i:
= i+
1 j:
= j+
1 si (i ≥ m) alors Occurrence de x trouvée à la position j - i i:
= mpNext[i] finsi fintantque
VI-D. L’algorithme de Knuth – Morris – Pratt

y[j+i], avec 0 < i < m. Dès lors :
- x[0..i-1] = y[j..j+i-1] : les i-1 caractères précédemment comparés sont identiques. Notons u cette sous-chaîne.
- x[i] ≠ y[j+i]

Lorsqu’un décalage de la fenêtre de comparaison a lieu, il ne faut pas oublier qu’un préfixe v du motif peut correspondre à un suffixe de la portion u du texte.

De plus, pour éviter une autre non-correspondance immédiate, le premier caractère après le préfixe v doit être différent de l’ancien x[i] puisque nous savons déjà que y[j+i] ≠ x[i]. Un tel préfixe v est appelé bord disjoint (tagged border) de u. Notation : Soit kmpNext[i] la longueur du plus long bord de x[0..i-1], pour 0 < i ≤ m, suivi d’un caractère différent de x[i] ; ou -1 si aucun bord disjoint n’existe. mpNext[0] = -1 mpNext[i] = | Bord maximal disjoint (x[0..i-1]) | Après un décalage, les comparaisons peuvent reprendre entre x[kmpNext[i]] et y[j+i] sans rater d’occurrence de x dans y, et tout en évitant un retour en arrière dans le texte. La table kmpNext peut être calculée en temps et espace O(m). Ce calcul est réalisé avant la phase de recherche.
Procédure PrétraitementKMP (x, m, kmpNext) i
:
= 0 j:
= kmpNext[0]:
= -1 tantque (i<
m) faire // Parcours du motif tantque ( (j>
-1) et (x[i] ≠ x[j]) ) faire j:
= kmpNext[j] fintantque i:
= i+
1 j:
= j+
1 si (x[i] = x[j]) alors // Même caractère:
bord non disjoint kmpNext[i]:
= kmpNext[j] sinon jmpNext[i]:
= j // Position du bord disjoint fsi fintantque
Après le calcul de la table kmpNext, la phase de recherche peut être réalisée en temps O(m+n), avec au plus 2n-1 comparaisons.
Procédure KMP (x, m, y, n) PrétraitementKMP (x, m, kmpNext) i
:
= j:
= 0 tantque (j<
n) faire // Parcours du texte tantque ( (i>
-1) et (x[i]!
= y[j]) ) faire i:
= kmpNext[i] fintantque i:
= i+
1 j:
= j+
1 si (i>
m) alors Occurrence de x trouvée à la position j - i i:
= kmpNext[i] finsi fintantque
Nous remarquons que l’algorithme de Knuth-Morris-Pratt a exactement la même complexité pour le cas le plus défavorable que l’algorithme de Morris-Pratt. Cependant, il y a une différence importante au niveau du délai, c’est-à-dire le nombre de comparaisons faites sur un même caractère dans le pire des cas. Le délai pour l’algorithme de Morris-Pratt est borné par m, alors qu’il est borné par logf (m) où f est le nombre d’or : (1 + 51/2) / 2.
VI-E. Algorithme de Boyer – Moore
- x[i+1 .. m-1] = y [i+j+1 .. j+m-1], notons u cette portion pour rappel : le parcours des comparaisons se fait de gauche à droite,donc de j+m-1 à j.
- x[i] ≠ y[j+i]

La fonction de décalage du bon suffixe consiste à aligner le segment u avec son occurrence la plus à droite dans x, qui est précédée par un caractère différent de x[i].

S’il n’y a pas de tel segment, le décalage consiste à aligner le plus long suffixe v de y[j+i+1 .. j+m+1] avec un préfixe de x qui correspond.


La fonction de décalage du mauvais caractère consiste à aligner y[j+i] avec son occurrence la plus à droite dans x[0 .. m-2]. Exemple :

Si aucun caractère égal à y[j+i] n’existe dans le motif x, aucune occurrence de x dans y ne peut inclure y[j+i]. Dans ce cas, le début de la fenêtre est alignée avec le caractère qui suit immédiatement y[j+i], c’est-à-dire y[j+i+1].

L’algorithme Boyer-Moore choisit le décalage maximum retourné par la fonction de bon suffixe et la fonction de mauvais caractère. Les résultats de cette fonction sont stockés respectivement dans une table bmGS et bmBC. Celles-ci peuvent être calculées en temps O(m + σ) avant la phase de recherche, et nécessitent un espace mémoire de O(m + σ), où σ est la taille de l’alphabet.
Procédure BoyerMoore (x, m, y, n) calculBmGS (x, m, bmGS) // Fonctions non détaillées ici calculBmBC (x, m, bmBC) j
:
= 0 tantque (j<
= n - m) faire i:
= m - 1 tantque ((i>
= 0) et (x[i] = y[j+
i])) faire si (i<
0) alors MOTIF TROUVE en position j j:
= j+
bmGS[0] sinon j:
= j+
MAX(bmGS[i], bmBC[y[j+
i]] - m+
1+
i) finsi i:
= i - 1 fintantque fintantque
Sur des alphabets très grands, l’algorithme de Boyer-Moore est extrêmement rapide. La recherche de am-1b dans bn ne nécessite que O(n / m) comparaisons, ce qui est le minimum absolu pour tout algorithme de pattern matching où seul le motif est prétraité. L’algorithme au pire des cas est en temps O(mn). Cependant, en pratique, on constate que le nombre total de comparaisons est très souvent inférieur à la longueur du texte. En fait, il a été prouvé que cet algorithme est sous-linéaire en moyenne.
VI-F. Algorithme de Aho – Corasick

Nous pouvons ainsi exprimer la fonction de transition comme suit :
Fonction TRANSITION(p,a)
:
tantque pa ∉ P et p ≠ ε faire p:
= BordX(p) fintantque si pa ∈ p alors retourner (pa) sinon retourner (ε)
La recherche des occurrences des mots de X dans un texte t = t1…tn se fait par l’algorithme suivant, qui incorpore l’évaluation des transitions :
Procédure AHO_CORASICK(X, t)
:
q:
= ε // état initial pour i de 1 à n faire // parcours du texte tantque qti ∉ P et q ≠ ε faire q:
= BordX[q] fintantque si qti ∈ P alors q:
= qti // on avance dans l'automate sinon q:
= ε // motif introuvable:
on retourne au début finsi si q est un état final alors MOTIF q TROUVE en position i finsi finpour
Nous pouvons remarquer que l’algorithme de recherche des occurrences des mots de X dans t s’effectue en temps O(n + m) et en place O(m).
p . a =
fX(pa) si pa ∈ P;
BordX(pa) sinon;
BordX(pa) =
BordX(p) . a si p ≠ ∉
∉ sinon
VI-G. Snort et le pattern matching
VI-H. Conclusion

Enfin, nous avons vu que le choix d’un bon algorithme n’était pas suffisant : l’implémentation et les structures de données choisies jouent un rôle très important dans les performances d’un algorithme.
VII. Conclusion
VIII. Bibliographie
http://www-igm.univ-mlv.fr/~lecroq/string/
Éléments d’algorithmique – Recherche de motifs D. Beauquier, J. Berstel, Ph. Chrétienne
http://www-igm.univ-mlv.fr/~berstel/Elements/Elements.html
Optimizing Pattern Matching for Intrusion Detection Marc Norton Increasing Performance in High Speed NIDS, A look at Snort’s internals Neil Desei Managing Security with Snort and IDS Tools Kerry J. Cox, Christopher Gerg O’Reilly – ISBN : 0-596-00661-6 Les IDS – Les systèmes de détection d’intrusions informatiques Thierry Evangelista Dunod – ISBN 2 10 007257 9 Les attaques externes Eric Detoisien Détection et tolérance d’intrusions Samuel Dralet Les tests d’intrusions Eric Detoisien et Frédéric Raynal Bro: Un autre IDS Open-Source Jean-Philippe Luiggi Misc Magazine n°14 Snort User Manual The Snort Project
http://www.snort.org
Prelude HandBook Prelude Hybrid IDS project
http://www.prelude-ids.org/
Bro Reference Manual Lawrence Berkeley National Laboratory
http://www.bro-ids.org
LIDS Documentation LIDS Project
http://www.lids.org
Articles Wikipédia
http://www.wikipedia.org
IX. Annexe : Rappels essentiels concernant les protocoles
- d’une partie fixe de 20 octets
- d’une partie à longueur variable : les options
Il est utile de connaître les champs du protocole IP, qui sont utilisés à des fins de reconnaissance ou d’attaque par déni de services :
- Version (4 bits) : version du protocole (IPv4, bientôt IPv6)
- En-tête (4 bits) : spécifie la longueur de l’en-tête, en mots de 32bits. Minimum 5, car il y a 20 octets au minimum dans l’en-tête
- Type de service (8 bits) : notion de qualité de service
- Longueur totale (16 bits) : longueur du datagramme complet (en-têtes + données) : max 65 535 octets
- Identification (16 bits) : valeur pour identifier les fragments d’un même datagramme
- Flags (3 bits) : pour contrôler la fragmentation IP o Bit 0 : réservé =>doit être laissé à 0 o Bit 1 : Accept Fragmentation (AF) =>0 si autorisée o Bit 2 : Don’t Fragment (DF)=>0 quand il s’agit du dernier fragment
- Offset de fragmentation (13 bits) : spécifie le décalage du premier octet par rapport au datagramme complet. Le décalage du premier fragment vaut 0. Le maximum pour un datagramme est de 8192 fragments
- Durée de vie / TTL (8 bits) : permet de limiter la durée de vie d’un paquet sur le réseau. Est décrémentée par chaque nœud de transit.
- Protocole (8 bits) : indique le protocole de niveau supérieur qui est utilisé (ex. : ICMP/IGMP/TCP/UDP)
- Checksum d’en-tête (16 bits) : somme de contrôle calculée sur l’en-tête uniquement. Doit être recalculé à chaque modification du TTL ou du ToS
- Adresse source (32 bits)
- Adresse destination (32 bits)
- Options (longueur variable) : rarement utilisé L’en-tête, permettant d’identifier le protocole de niveau supérieur n’est inclus que dans le premier fragment.
Pour établir une connexion TCP, il y a un protocole de négociation appelé « poignée de main TCP » (handshake). Celle-ci se déroule en 3 phases : 1) La source émet une requête d’établissement de connexion : bit SYN à 1 + numéro de séquence aléatoire (ISN) ; 2) Si la destination accepte : bits SYN et ACK à 1 + numéro de séquence propre + numéro de séquence de la source augmenté de 1 ; 3) La source acquitte la réponse de la destination en positionnant le bit ACK à 1, en incrémentant son numéro de séquence originel et un numéro d’acquittement égal au numéro de séquence de la destination augmenté de 1. Les champs de TCP, comme ceux de IP, sont souvent utilisés par des pirates à des fins intrusives. Voici un rappel de ces champs :
- Port source & port destination (16 bits) : déterminent le service requis
- Numéro de séquence (32 bits) : numéro du premier octet de données par rapport au début de la transmission, sauf si SYN est marqué. Dans ce cas, numéro de séquence = ISN.
- Accusé de réception (32 bits) : Si ACK est marqué, ce champ contient le numéro de séquence du prochain octet que le récepteur s’attend à recevoir
- Header Length (4 bits) : taille de l’en-tête TCP en nombre de mots de 32 bits
- Réservé (6 bits) : usage futur toujours à 0
- Flags (6 bits) : utilisés pour contrôle et gestion des connexions TCP o URG : champ « pointeur de données urgentes » significatif o ACK : champ « accusé de réception » significatif o PSH : fonction Push o RST : réinitialisation de la connexion o SYN : synchronisation des numéros de séquence o FIN : fin de connexion
- Fenêtre (16 bits) : nombre d’octets à partir de la position marquée dans l’accusé de
- réception que le récepteur est capable de recevoir
- Checksum (16 bits) : somme de contrôle calculée sur le datagramme
- Pointeur de données urgentes (16 bits) : spécifie la position d’une donnée urgente (position par rapport au numéro de séquence)
- Options (variable) : doit être un multiple de 8 bits =>remplissage (padding) éventuel o Maximum Segment Size (MSS) : taille maximale des segments : envoyée dans la requête de connexion initiale o Window Scale : permet de définir des tailles de fenêtre supérieures à 64Ko o Selective Acknowledgement (SACK) : acquittements sélectifs o NOP (No OPeration) : séparateur pour aligner le début d’une option sur le début d’un mot de 16 bits
- Voici également un rappel des champs du protocole UDP :
- Port source (16 bits)
- Port destinataire (16 bits)
- Longueur (16 bits) : nombre d’octets du datagramme entier (y compris en-tête). Min = 8
- Checksum (16 bits)
Le protocole ICMP est souvent utilisé à des fins malicieuses, car c’est un protocole utile pour des messages flash, et il ne nécessite pas de connexion ni de port. Les paquets ICMP sont encapsulés dans les paquets IP pour des raisons historiques. Les champs ICMP sont les suivants :
- Type (8 bits) : type de message
- Code (8 bits) : précise le message identifié, par rapport au type de message – Type 0 (Echo reply) =>pas de code – Type 3 (Destination Unreachable) =>0 = net unreachable, 1 = host unreachable, 2 = protocole… – Type 4 (Source Quench) : contrôle de flux – Type 5 (Redirect) =>Code 0 = network, 1 = host – Type 8 (Echo request) – Type 11 (Time exceeded) : durée de vie écoulée – Type 13 (Timestamp) : marqueur temporel – Type 14 (Timestamp reply ) : réponse au marqueur temporel – Type 30 (Traceroute)
Source: Developpez.com – Jonathan Krier