Suivant : Et la signature fut...
Monter : Le DoS
Précédent: Résultat de la commande
On constate donc qu'on a bien d'abord l'en-tête IP (20 bytes),
puis l'en-tête ICMP (8 bytes), puis les données (1 bytes).
Si maintenant on regarde le code des fonctions "decode.h" et
"decode.c" définie dans snort, (voir le zip avec les fichiers), on constate
:
- Lorsque Snort reçoit le paquet ICMP, il appelle d'abord la
fonction "DecodeIP" en lui passant comme arguments:
- pkt => un pointeur vers le paquet reçu.
- len => longueur du paquet.
- p => un pointeur vers une structure facilitant le décodage.
- Après plein de tests sur les checksum, fragments, ... il appelle
la fonction "DecodeICMP" en lui passant comme args:
- pkt + hlen => pointeur vers le paquet ICMP (= adresse IP-Paquet + IP-Header-Len).
- ip-len => longueur du contenu du paquet IP, c'est a dire la longueur du paquet ICMP.
- p => la structure de décodage...
- DecodeICMP refait des tests sur la longueur du paquet ICMP,
checksum, ... Ensuite, il définit la longueur des données comme la taille
du paquet ICMP moins la taille du Header, et définit un pointeur vers les
données, c'est à dire, le pointeur du paquet ICMP plus la taille du Header.
Ensuite survient le bug, ...
Il teste le type de message, et dans le cas d'un "echo", ou "echo reply", il décale de nouveau le
pointeur vers les données 4 bytes plus loin (la structure "idseq" représente
la ligne <18h-1Bh> de l'en-tête ci-dessus), et réduit la taille des données de 4 bytes.
Or dans l'exemple précédent, la taille du paquet ICMP etait de 9
bytes ==> si on saute le Header, il reste 1 byte, et si on saute
encore 4 bytes, on est hors du buffer ==> Segmentation fault, ou
core dumped, ...
En fait, il considère que dans certains cas, les 4 derniers bytes du header ICMP doivent figurer dans les données et
dans d'autre cas, comme un "echo", non.
Par exemple, pour le paquet ICMP "Redirect Message", le header est constitué comme suit:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Gateway Internet Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Si une attaque était réalisée avec des messages de ce type, il peut effectivement être intéressant
d'avoir dans les données le champ "Gateway Internet Address".
Mais pour faire cela, il faut considérer que l'en-tête ICMP fait 4 bytes, (pour prendre en
compte les 4 suivants dans les données) et dans le cas d'un "echo", il faut sauter les 4 bytes
suivants. Cela revient tout simplement à changer la taille par défaut du Header ICMP à 4 bytes,
et c'est bien ce que fait le patch proposé par Martin Roesch et implémenté dans la nouvelle version
de Snort.
Suivant: Et la signature fut...
Monter: Le Denial of Service
Précédent: Résultat de la commande