Introduction
Le taux des Intrusions systèmes est en hausse. Que ce soit des "script kids" tentant de changer la page d'accueil d'un site ou bien un attaquant tentant de voler des numéros de cartes de crédits, les serveurs doivent s'équiper et non pas seulement pour éviter ces attaques mais aussi pour savoir si celles-ci ont lieu. C'est ici que les IDS (Systèmes de Détection d' Intrusion) rentrent en jeu. En bref, un IDS est installé sur un réseau et tente d'y découvrir les anomalies. Un IDS de base capture tout le trafic ou bien une bien partie des communications. Il compare alors le trafic à une base de donnée d' "empreintes d'attaques" ou a des signatures d'attaques connues. Si une attaque est détectée, l'IDS peut entreprendre diverses actions selon la réponse configurable à l'attaque. Ces actions sont multiples, allant de prévenir l'administrateur!
par message jusqu'à interdire tout trafic provenant de l'attaquant. Des IDS plus performants reconnaîtront aussi des anomalies dans des modèles d'utilisateurs systèmes. Par exemple, Bob se log toujours en provenance d'une machine que nous nommerons "defiant" entre 9 et 17 heures. Soudainement bob commence à se logger d'une machine se nommant "regret" entre 1 et 3 heure du matin le samedi. Un IDS puissant noterait cela comme suspect.
Naturellement un tel système peut avoir des défauts. Comme un scanner de virus, un IDS n'est effectif uniquement contre des attaques qu'il sonnait ou desquelles il a des signatures. Un attaquant intelligent pourrait légèrement modifier une attaque et changer la signature de l'attaque et ainsi éviter toute détection par l'IDS.
Cet article se centralisera sur l'installation et l'utilisation de base de Snort, un IDS librement disponible et populaire qui tourne sous Linux, *BSD, Solaris / SunOS, HP-UX, AIX, IRIX, et MAC OS X. Snort fut même récemment porté sur Win32. La deuxième partie de cet article portera sur des particularitées plus avancées tels que les rapports et les écritures de règles personnalisées.
Snort est facile a utiliser, un IDS léger écrit par Marty Roesch qui est capable d'exécuter l'analyse de trafic en temps réel et la sauvegarde des paquets sur des réseaux IP. Certaines des autres particularités de Snort sont :
- Analyse des protocoles
- Recherche et comparaison par contenu
- Possibilité d' Alertes en temps réel
- Peut lire dans une trace de TCPDump et s'exécuter en prenant en compte une règle donnée
- Langage des règles flexible pour définir le trafic a collecter ou a ignorer
Snort est aussi en constante évolution.
Executer Snort avec un jeu de Règles
Le pouvoir réel de Snort vient du fait qu'il est capable de lire des règles, d'observer le trafic sur le réseau et de comparer les deux afin d'y voir des ressemblances. Des règles peuvent être crées pour observer les pings, scans, tentatives de connections sur des backdoors, failles-cgi, et d'autres méthodes communes utilisées par des attaquants pour gagner le contrôle d'une machine cible. Les Alertes peuvent être logger dans un fichier spécifier sur la ligne de commande ou même en passant par syslog et les ajoutées ainsi aux messages système. Tout ceci peut être exécuter en tache de fond.
Les jeux de Règles peuvent être écrits à la main. Souvent, les gens utilisent un de ces jeux de règles disponibles gratuitement sur le site de Snort : http://www.snort.org/snort-files.htm. Une interface personnalisé est capable de créer vos règles afin de subvenir à vos besoins "à la volée" sur http://www.snort.org/Database/rules.asp.
Afin de laisser les choses simples pour le moment nous ne générerons qu'une simple règle et examinerons son contenu. La règle suivante a été automatiquement générée pour répondre aux requêtes ICMP.
#---------------------------------------------
# http://www.snort.org Snort 1.6 Ruleset
# Current Database Updated -- 07/12/2000
#Contact: Jim Forster - jforster@rapidnet.com
#---------------------------------------------
preprocessor http_decode: 80 443 8080
preprocessor minfrag: 128
preprocessor portscan: 192.168.1.1/24 3 5 /var/log/snort_portscan.log
# ^^^^^^^^^^^ ^ ^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
# | | | |
#Votre Adresse IP ou Réseau ici-+ | | |
# | | |
#Nombre de Ports connéctés------------+ | |
# dans cet | |
#Intervalle (en secondes)---------------+ |
# |
#Fichier de Log (chemin/nom)---------------------------+
preprocessor portscan-ignorehosts: 192.168.1.4
#---------------------------------------------
#----------------------------------------------------
# CHANGEZ LA LIGNE SUIVANTE POUR ADAPTER VOTRE RÉSEAU
# (Systeme Seul = votre ip/32)
var HOME_NET 192.168.1.1/24
#----------------------------------------------------
alert icmp !$HOME_NET any -> $HOME_NET any (msg:"IDS166 - PING Seer
Windows"; content:"|88042020202020202020202020202020|";itype:8;depth:32;)
alert icmp !$HOME_NET any -> $HOME_NET any (msg:"IDS152 - PING BSD";
content: "|08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17|"; itype: 8;
depth: 32;)
alert icmp !$HOME_NET any -> $HOME_NET any (msg:"IDS153 - PING Cisco
Type.x"; content:"|abcdabcdabcdabcdabcdabcdabcdabcd|";itype:8;depth:32;)
alert icmp !$HOME_NET any -> $HOME_NET any (msg:"IDS154 - PING CyberKit 2.2
Windows"; content:"|aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|";itype:8;depth:32;)
alert icmp !$HOME_NET any -> $HOME_NET any (msg:"IDS155 - PING Delphi-Piette
Windows"; content:"|50696e67696e672066726f6d2044656c|";itype:8;depth:32;)
alert icmp !$HOME_NET any -> $HOME_NET any (msg:"IDS156 - PING Flowpoint
2200DSL Router"; content:"|0102 0304 0506 0708 090a 0b0c 0d0e
0f10|";itype:8;depth:32;)
-- SNIP --
Snort n'accepte qu'une règle par ligne. Les lignes ont été coupées dans l'exemple ci-dessus pour une meilleure lisibilité.
La première partie de la règle (la tête) traite avec les directives du préprocesseur, les hôtes desquels il faut ignorer les scans, et de configurer l'adresse IP de la machine.
Les directives du Préprocesseur: Permet d'ajouter des fonctionnalités a Snort en autorisant les programmeurs d'utiliser des plug-ins sous la forme de modules aisemant. Un exemple est une directive du préprocesseur pour détecter les scans de ports. En entrant une adresse IP ou une adresse réseau, en mettant des seuils pour les ports étant connectés pour un certain temps et en spécifiant un répertoire pour enregistrer les logs, Snort observera les tentatives de connections semblables au critères précédents et les enregistrera en conséquence. Si vous utilisez cette directive, vous devriez aussi prendre avantage de la directive du préprocesseur nommée portscan-ignorehosts. Mettez n'importe quelle adresse sur cette ligne séparée par un espace que Snort devrait ignorer lors de la détection d'un scan. Certains serveurs comme les DNS feraient voyager le d&ea!
cute;tecteur de scan donc il est préférable de les ignorer. Par contre, si vous avez déjà un programme en place qui détecte les scans, cette directive peut-être commentée.
Le Préprocesseur httpd_decode est utilisé pour capturer les chaînes de caractères contenus dans les URL HTTP et de les convertir en chaînes ASCII. C'est pour avoir la possibilité d'analyser et de comparer les chaînes de caractères contenus dans les jeux de règles avec celles capturées.
Le Préprocesseur minifrag observe les paquets qui ont atteint la taille d'un seuil spécifié. Les paquets Fragmentés sont souvent utilisés par des attaquants pour éviter toute détection.
HOME_NET: Cette directive spécifie l'adresse IP et le bloc CIDR que Snort doit observer.
Snort peut lire les règles uniquement sur une ligne non-cassé (pas de retour a la ligne au milieu de la règle). Cependant les règles ci-dessous sont en plusieurs morceaux pour plus de clarté. La deuxième partie de cet article se centrera sur la manière dont ces règles fonctionnent. En attendant de se pencher techniquement sur le jeu de règles, il est assez facile de comprendre ce que chacune d'entre elles fait.
Maintenant nous pouvons exécuter Snort avec ces règles et voir comment elles fonctionnent:
# snort -d -h 192.168.1.1/24 -l ./log -c ping.rules -s -i eth0 -D
-d décharge la couche application
-h reseau principale
-l chemin du fichier d'enregistrement
-c nom du fichier qui comporte les règles
-s envoi les alertes a syslog
-i interface sur laquelle écouter
-D lance Snort en processus de fond (mode Daemon)
La première fois que vous lancerez Snort avec un jeu de règles il serait une bonne idée de laisser l'argument -D de côté afin de s'assurer que Snort se charge sans erreurs. La plupart des autres options s'expliquent d'elles-mêmes à l'exception de la fonction de log. Etant donné que nous avons spécifié a Snort d'envoyer les messages d'alertes a syslog, d'autres enregistrements seront ajoutés. Le répertoire que l'on spécifie sur la ligne de commande contiendra un répertoire supplémentaire pour chaque hôte détecter comme violant une règle et les actions entreprises qui ont fait que l'alerte s'est produit. En utilisant l'exemple d'un jeu de règle provoquant une alerte pour un ping, on verra un extrait de ce qui serait dans /var/adm/messages si Snort détectait des ping.
Jul 12 19:18:22 strife snort[370]: IDS152 - PING BSD: 192.168.1.10 -> 192.168.1.1
Jul 12 19:18:23 strife snort[370]: IDS152 - PING BSD: 192.168.1.10 -> 192.168.1.1
Jul 12 19:18:24 strife snort[370]: IDS152 - PING BSD: 192.168.1.10 -> 192.168.1.1
Jul 12 19:18:25 strife snort[370]: IDS152 - PING BSD: 192.168.1.10 -> 192.168.1.1
Note: Pour avoir plus d'informations sur des attaques listées comme ci-dessus vous pouvez visiter http://dev.whitehats.com/ids/ids.html et faire une recherche sur le numero de l'IDS affiché. Dans ce cas précis, faites une recherche sur IDS 152.
Maintenant si nous regardons dans notre fichier de log, Snort devrait avoir créer un repertoire contenant des informations sur l' hôte nous ayant pingé.
# ls log
192.168.1.10
# cd log/192.168.1.10
# ls
ICMP_ECHO
# more ICMP_ECHO
[**] IDS152 - PING BSD [**]
07/12-19:18:22.311702 192.168.1.10.200 -> 192.168.1.1
ICMP TTL:49 TOS:0x0 ID:17933
ID:48507 Seq:0 ECHO
06 28 6D 39 5A C8 04 00 08 09 0A 0B 0C 0D 0E 0F .(m9Z...........
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./
30 31 32 33 34 35 36 37 01234567
[**] IDS152 - PING BSD [**]
07/12-19:18:23.310086 192.168.1.10:200 -> 192.168.1.1
ICMP TTL:49 TOS:0x0 ID:18002
ID:48507 Seq:256 ECHO
07 28 6D 39 F1 BA 04 00 08 09 0A 0B 0C 0D 0E 0F .(m9............
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./
30 31 32 33 34 35 36 37 01234567
-- SNIP --
Ainsi le fichier de log crée contient les paquets capturés de l'action offensive.