Introduction
De nombreux outils existent aujourd'hui permettant à un attaquant d'ordinateurs malveillant d'envoyer les datagrammes modifies ICMP. Ces datagrammes peuvent être utilisés pour différentes tâches: détection de machines, détection avançée de machines, empreinte digitale (fingerprints) de systèmes d'exploitation et plus. Cet article examinera si nous pouvons identifier les différents outils ICMP utilisés par les hackers disponibles aujourd'hui. Si nous pouvons identifier l'outil, nous pouvons identifier le système d'exploitation ou un certain nombre de systèmes d'exploitation sur lesquels cet outil pourrait fonctionner. Nous utiliserons le fait que certains de ces outils héritent de quelques valeurs de l'Os de base. Ceci sera fait passivement, sans questionner activement la machine de l'attaquant d'ordinateurs malveillant .
Dans la discussion, nous allons examiner les cinq utilitaires suivants:
Nemesis v1.1, ecrit par obecian (http://www.packetfactory.net/Projects/Nemesis)
Icmpenum v1.1.1, ecrit par Simple Nomad (http://razor.bindview.com/).
SING v1.0, ecrit par Alfredo Omella ( http://www.sourceforge.net/projects/sing).
RFC 792 - Internet Control Message Protocol (http://www.ietf.org/rfc/rfc0792.txt ) - definit le moyen d'envoyer une requete Echo ICMP. La partie emetteur initialise l'identificateur (employé pour identifier des demandes d'écho destine a différentes machines destination) et le numero de sequence (si des demandes multiples d'écho sont envoyées a la même machine destination), ajoute quelques données (arbitraires) à la zone d'information et envoie l'écho ICMP a la machine destination. Dans l'en-tête ICMP, le code egale zéro. Le destinataire devrait seulement changer le type en ECHO Reply et renvoyer le datagramme à l'expéditeur (et le total de contrôle (checksum) de l'en-tête ICMP).
Differencier les outils
Requetes Echo ICMP en utilisant l'utilitaire "Ping" sous Linux
Ce qui suit est une requete Echo ICMP envoyer avec l'utilitaire ping du paquet iputils d'un systeme Linux Redhat avec noyau 2.2.14:
[root@godfather sbin]# ping -c 2 y.y.y.y PING y.y.y.y (y.y.y.y) from x.x.x.x : 56(84) bytes of data. 64 bytes from hostname (y.y.y.y): icmp_seq=0 ttl=255 time=0.1 ms 64 bytes from hostname (y.y.y.y): icmp_seq=1 ttl=255 time=0.1 ms --- y.y.y.y ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.1/0.1/0.1 ms [root@godfather sbin]# The snort trace: 11/01-23:09:51.398772 x.x.x.x -> y.y.y.y ICMP TTL:64 TOS:0x0 ID:38 ID:1037 Seq:0 ECHO 9F 86 00 3A 85 15 06 00 08 09 0A 0B 0C 0D 0E 0F ...:............ 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 11/01-23:09:51.398819 y.y.y.y -> x.x.x.x ICMP TTL:255 TOS:0x0 ID:39 ID:1037 Seq:0 ECHO REPLY 9F 86 00 3A 85 15 06 00 08 09 0A 0B 0C 0D 0E 0F ...:............ 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 Les requetes Echo ICMP suivantes sont envoyees: 11/01-23:09:52.391176 x.x.x.x -> y.y.y.y ICMP TTL:64 TOS:0x0 ID:40 ID:1037 Seq:1 ECHO A0 86 00 3A EB F7 05 00 08 09 0A 0B 0C 0D 0E 0F ...:............ 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 11/01-23:09:52.391220 y.y.y.y -> x.x.x.x ICMP TTL:255 TOS:0x0 ID:41 ID:1037 Seq:1 ECHO REPLY A0 86 00 3A EB F7 05 00 08 09 0A 0B 0C 0D 0E 0F ...:............ 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
Le nombre ID ICMP de ping est l'identification (ID) du processus assignée a ping lors de l'execution.
HPING2
HPING2 est un outil reseau capacble d'envoyer des paquets ICMP/UDP/TCP modifies et d'afficher les reponses de victimes comme ping fait avec les reponses ICMP. HPING2 traite la fragmentation, un corps et une taille de paquets arbitraires et peut etre utilise pour tranferer des fichiers avec les protocoles supportes. HPING2 se compile sous Linux et *BSD.
Dans le prochain exemple, j'ai envoye une requete Echo ICMP avec HPING2:
[root@godfather sbin]# hping2 -1 -c 2 y.y.y.y default routing not present HPING y.y.y.y (y.y.y.y): icmp mode set, 28 headers + 0 data bytes 28 bytes from y.y.y.y: icmp_seq=0 ttl=255 id=36 rtt=0.8 ms 28 bytes from y.y.y.y: icmp_seq=1 ttl=255 id=37 rtt=0.7 ms --- y.y.y.y hping statistic --- 2 packets tramitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.7/0.7/0.8 ms [root@godfather sbin]# The snort trace: By Martin Roesch (roesch@clark.net, www.snort.org) 11/01-23:08:48.338644 x.x.x.x -> y.y.y.y ICMP TTL:64 TOS:0x0 ID:14546 ID:1032 Seq:0 ECHO 11/01-23:08:48.338691 y.y.y.y -> x.x.x.x ICMP TTL:255 TOS:0x0 ID:36 ID:1032 Seq:0 ECHO REPLY
[root@godfather /root]# ps aux | grep hping root 4826 0.0 0.4 1200 512 pts/1 S 19:57 0:00 [root@godfather /root]# 11/04-19:57:44.846703 x.x.x.x -> y.y.y.y ICMP TTL:64 TOS:0x0 ID:57750 ID:4826 Seq:20 ECHO
11/01-23:08:49.331187 x.x.x.x -> y.y.y.y ICMP TTL:64 TOS:0x0 ID:19756 ID:1032 Seq:1 ECHO 11/01-23:08:49.331233 y.y.y.y -> x.x.x.x ICMP TTL:255 TOS:0x0 ID:37 ID:1032 Seq:1 ECHO REPLY 23:08:49.331187 > x.x.x.x > y.y.y.y: icmp: echo request (ttl 64, id 19756) 4500 001c 4d2c 0000 4001 2fb3 xxxx xxxx yyyy yyyy 0800 eefb 0804 0100
les checksums des entetes ICMP (changes parce que les numeros de sequence ont change).
Nemesis
Nemesis est une suite d'injection de paquets reseau TCP/UDP/ICMP/ARP/DNS/RIP/IGMP/OSPF. Nemesis se compile sous Linux, *BSD, et Sun Solaris.
Dans le prochain exemple, j'ai envoye une requete Echo ICMP avec Nemesis. Les options que j'ai utilise sont -vv pour mode verbeux, -i pour type ICMP et -c pour la valeur du code ICMP:
[root@godfather /root]# nemesis-icmp -vv -i 8 -c 0 -S x.x.x.x -D y.y.y.y ICMP Packet Injection -=- The NEMESIS Project 1.1 (c) 1999, 2000 obecian[IP] x.x.x.x > y.y.y.y [Type] ECHO REQUEST [Sequence number] 0 [IP ID] 0 [IP TTL] 254 [IP TOS] 0x18 [IP Frag] 0x4000 Wrote 48 bytes ICMP Packet Injected La trace tcpdump: 00:27:16.153322 > x.x.x.x > y.y.y.y: icmp: echo request (DF) [tos 0x18] (ttl 254, id 29) 4518 0030 001d 4000 fe01 7e95 xxxx xxxx yyyy yyyy 0800 f7ff 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00:27:16.153375 > y.y.y.y > x.x.x.x: icmp: echo reply [tos 0x18] (ttl 255, id 30) 4518 0030 001e 0000 ff01 bd94 yyyy yyyy xxxx xxxx 0000 ffff 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
la valeur du champ IP TTL etait mise a 254 (l'OS utilise 64 comme valeur par defaut du champs IP TTL pour les requetes Echo ICMP);
la valeur du champ de l'identificateur ICMP est egale a zero (ICMP_ID=0);
la
valeur du champ du numero de sequence ICMP est egale a zero (ICMP_Seq=0);
la portion
des donnees ICMP est egale a 20 octets (Les OS Linux, Unix et Unix-like
utilisent 56 octets de donnees pour les requetes Echo ICMP. L'OS Microsoft
Windows utilise 32 octets). Cela veut dire que, par defaut, la longueur
totale des datagrammes Echo ICMP est egale a 48 octets.
Les 20 octets de donnees avec ces requetes Echo ICMP sont nuls.
Voila la seconde paire de requete et reponse Echo ICMP envoyes par Nemesis: 00:27:23.294060 > x.x.x.x > y.y.y.y: icmp: echo request (DF) [tos 0x18] (ttl 254, id 31) 4518 0030 001f 4000 fe01 7e93 xxxx xxxx yyyy yyyy 0800 f7ff 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00:27:23.294097 > y.y.y.y > x.x.x.x: icmp: echo reply [tos 0x18] (ttl 255, id 32) 4518 0030 0020 0000 ff01 bd92 yyyy yyyy xxxx xxxx 0000 ffff 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
Obecian fait une réécriture majeure de l'outil, ainsi dans v2.0 il y aura beaucoup de surprises.
Icmpenum
Icmpenum est la preuve d'un outil de conception qui a ete ecrit par Simple Nomad. L'outil est capable d'envoyer des requetes Echo ICMP, des requetes Timestamp ICMP et des requetes d'information ICMP.
[root@godfather /root]# ./icmpenum -i 1 IP_Address 11/04-19:40:22.256600 x.x.x.x -> y.y.y.y ICMP TTL:255 TOS:0x0 ID:666 ID:39426 Seq:0 ECHO 11/04-19:40:22.256662 y.y.y.y -> x.x.x.x ICMP TTL:255 TOS:0x0 ID:18 ID:39426 Seq:0 ECHO REPLY 19:40:22.256600 > x.x.x.x > y.y.y.y: icmp: echo request (ttl 255, id 666) 4500 001c 029a 0000 ff01 bb44 xxxx xxxx yyyy yyyy 0800 f565 029a 0000
Envoie d'une autre requete Echo ICMP avec icmpnum: 11/04-19:40:43.826947 x.x.x.x -> y.y.y.y ICMP TTL:255 TOS:0x0 ID:666 ID:39426 Seq:0 ECHO 11/04-19:40:43.826992 y.y.y.y -> x.x.x.x ICMP TTL:255 TOS:0x0 ID:19 ID:39426 Seq:0 ECHO REPLY
SING est "le couteau suisse" pour ICMP. Avec SING, vous pouvez envoyer presque tout ce que votre esprit peut considérer avec le protocole ICMP. SING se compile sous Linux, *BSD, et Sun Solaris. Dans l'exemple suivant, j'ai envoyé une requete Echo ICMP avec SING:
[root@godfather /root]# sing -c 4 y.y.y.y SINGing to y.y.y.y (y.y.y.y): 16 data bytes 16 bytes from y.y.y.y: seq=0 ttl=255 TOS=0 time=0.169 ms 16 bytes from y.y.y.y: seq=1 ttl=255 TOS=0 time=0.155 ms 16 bytes from y.y.y.y: seq=2 ttl=255 TOS=0 time=0.136 ms 16 bytes from y.y.y.y: seq=3 ttl=255 TOS=0 time=0.136 ms --- y.y.y.y sing statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.136/0.149/0.169 ms [root@godfather /root]# 00:24:59.011868 > x.x.x.x > y.y.y.y: icmp: echo request (ttl 255, id 13170) 4500 0024 3372 0000 ff01 8a64 xxxx xxxx yyyy yyyy 0800 7cad 3c04 0000 2be6 e039 332e 0000 00:24:59.011908 > y.y.y.y > x.x.x.x: icmp: echo reply (ttl 255, id 25) 4500 0024 0019 0000 ff01 bdbd yyyy yyyy xxxx xxxx 0000 84ad 3c04 0000 2be6 e039 332e 0000
Seulement 8 octets de donnees ICMP sont utilises. Ils sont utilises pour le calcul du RTT. Cela veut dire que, par defaut, la longueur totale d'un datagramme Echo ICMP de SING sera de 36 octets.
00:25:00.004593 > x.x.x.x > y.y.y.y: icmp: echo request (ttl 255, id 13170) 4500 0024 3372 0000 ff01 8a64 xxxx xxxx yyyy yyyy 0800 d6c9 3c04 0100 2ce6 e039 d711 0000 00:25:00.004630 > y.y.y.y > x.x.x.x: icmp: echo reply (ttl 255, id 26) 4500 0024 001a 0000 ff01 bdbc yyyy yyyy xxxx xxxx 0000 dec9 3c04 0100 2ce6 e039 d711 0000
Si vous prenez la peine d'examiner profondément les sources, vous pourrez decouvrir des faits qui vous aideront à identifier le système d'exploitation sur lequel l'outil fonctionnait.
Je prendrais SING en exemple. Avec les OS Linux et *BSD, SING utilise un nombre constant pour la valeur du champ d'identification IP. La valeur est l'hexa 0x3372 (13170 en décimale). Excepté les systèmes d'exploitation Sun Solaris, parce qu'on ne permet pas l'indication de l'identification IP.
Depuis que nous pouvons identifier SING, regarder le nombre du champ d'identification IP et voir une valeur différente que l'hexa 0x3J372 ou 13170 en décimale nous indiquera que l'outil SING s'execute sur une machine Sun Solaris.
Une autre intéressante information que nous pouvons utiliser est le fait que les machines Sun Solaris mettent leur bit DF avec des message de types ICMP Query par défaut. SING n'est aucune exception. Ceci nous donne qu'une autre vérification supplémentaire pour le fonctionnement de SING sous une machine Sun Solaris.
Une pensée: la valeur du champs ID ICMP est l'identification de processus assignée a SING par le système d'exploitation. Si nous pouvons calculer l'intervalle des nombres qui seront assignés comme identification de processus pour SING sous les divers systèmes d'exploitation, nous pourrions pouvoir trouver l'OS. Par exemple - avec Linux après le boot, l'identification ICMP a été placée à une valeur hexa 3c04, égale 1084 en décimal. Avec FreeBSD, l'identification ICMP de SING etait mis a 1b03 l'hexa / 795 décimal. Avec le soleil Solaris, cette valeur a été mise à 7330 hexa / 12403 décimal. C'est plus compliqué qu'il semble, et devrait être plus étudié pour voir si on peut lui faire confiance.
Nous pouvons utiliser toutes ces informations pour différencier les diverses plateformes sous laquelle SING pourrait s'exécuter.
D'autres types de messages de requêtes ICMP
Nous avons examiné seulement les demandes Echo ICMP. Si nous examinions d'autres types de message de requêtes ICMP, d'autres sources pour la différentiation des outils seraient introduites. Certaines seraient introduites parce que le seul type de message de requête ICMP, qui est partagé entre tous les OS, est une requete Echo ICMP (avec l'utilitaire ping).
De nombreuses options avec de nombreux outils
Parfois vous regarderez une trace d'un datagramme ICMP et pourrez conclure qu'un de ses champs a été évidemment modifie. Pouvez-vous conclure a partir de la valeur modifiee du champ quel était l'outil utilisé? Dans la plupart des cas oui, parce que les outils ont leur propre empreinte digitale qui donnent leur identité. Ce n'est pas vraiment d'importance quel type de message de requête ICMP vous produisez avec cet outil. Avec la manipulation de quelques champs, il y a seulement un outil capable de faire ca. Je peux dire que la capacité de mettre un bit inutilisé comme dans l'exemple est uniquement possible avec l'outil ICMP de hacker SING. Une conclusion que vous pouvez certainement faire est que l'utilitaire ping n'a pas été employé dans la plupart des cas pour modifier le datagramme en question.
Imiter d'autres OS
Le seul outil ICMP de hacker que j'ai vu qui ait la capacité d'imiter un autre système d'exploitation est SING. Les autres paramètres de SING indiquent toujours son identité.
Les regles Snort
Voila des règles Snort pour détecter l'utilisation des outils examinés dans cet article. La concordance des champs TOS a été présenté dans le dernier CVS Snort, alors qu'il n'y a toujours pas de support pour le bit DF.
alert icmp !$HOME_NET any -> $HOME_NET any (msg:"SING Echo from LINUX/*BSD"; id:13170; itype: 8; dsize: 8;) alert icmp !$HOME_NET any -> $HOME_NET any (msg:"SING Echo from Sun Solaris"; itype: 8; dsize: 8;) alert icmp !$HOME_NET any -> $HOME_NET any (msg:"Nemesis v1.1 Echo"; content:"|0000000000000000000000000000000000000000|"; itype: 8;icmp_id: 0; icmp_seq: 0; dsize: 20;) alert icmp !$HOME_NET any -> $HOME_NET any (msg:"icmpenum v1.1.1"; id: 666; itype: 8;icmp_id: 666; icmp_seq: 0; dsize: 0;) alert icmp !$HOME_NET any -> $HOME_NET any (msg:"HPING2 Echo from LINUX/*BSD"; itype: 8; dsize:0;)
Les informations de ce document ont été présentées la première fois au BlackHat 2000 d'Amsterdam, les 23-25 octobre 2000. La présentation est disponible sur le Web BlackHat - http://www.blackhat.com./
Traduit
par NightBird (http://www.nightbird.free.fr/)