Identification des outils ICMP utilisés par les Hackers

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:

  1. L'utilitaire 'ping' du paquet iputils sur un systeme REdhat avec noyau 2.2.14.

  2. HPING2 beta 54, ecrit par antirez ( http://sourceforge.net/projects/hping2. ).

  3. Nemesis v1.1, ecrit par obecian (http://www.packetfactory.net/Projects/Nemesis

  4. Icmpenum v1.1.1, ecrit par Simple Nomad (http://razor.bindview.com/).

  5. SING v1.0, ecrit par Alfredo Omella ( http://www.sourceforge.net/projects/sing).

Le type de message ICMP examine sera une requete Echo ICMP envoye avec tous les outils cites. Tous les outils seront installes et utilises sous une machine Linux Redhat avec noyau 2.2.14.

Requete Echo ICMP

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

Quelques elements importants sur les empreintes digitales des utilitaires ping doivent être garde en tete. Ping (comme d'autres utilitaires ping sous Unix et Unix-like) utilise un champ de donnees ICMP de 56 octets. Ceci fait une longueur totale du datagramme IP de 84 octets. Ping commence son numero de sequence ICMP à 0, et l'intervalle entre un numero de sequence et un autre est de 1 hexa. Ping utilise la valeur de 64 comme valeur par défaut pour le champ TTL IP pour les demandes d'écho ICMP.

Un autre point a garder en tete est le comportement de Linux avec les nombres ID IP. La trace a été prise après que ma machine Linux ait demarre. Le premier nombre ID IP qui a été utilisé était un nombre decimal à deux chiffres. L'intervalle entre un nombre ID IP et un autre est de 1.

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

Un fait notable est qu'il n'y a aucune donnée transportée avec la demande d'écho ICMP produite avec le comportement de défaut de HPING2. Par défaut, la longueur totale des datagrammes Echo ICMP produits par HPING2 sera toujours de 28 octets.

Comme ping, HPING2 utilise son ID de processus comme valeur du champ ID ICMP:

[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

Dans sendicmp.c le programme definit: icmp->un.echo.id = getpid();

C'etait seulement pour la premiere requete Echo ICMP emvoye. A quoi ressemble la seconde requete Echo ICMP?

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

La comparaison entre la premiere paire de requetes Echo ICMP et la reponse avec la seconde paire revelle qu'ils ne sont pas exactement identiques. Nous pouvons les differencier sur les points suivants:

Nous pouvons également conclure que la valeur du champ d'identification IP n'est pas synchronisee avec celle du système d'exploitation de base. Dans les exemples ci-dessus, HPING2 a utilisé 14546, et 19756, alors que le système d'exploitation utilisait 36, et 37 (si vous faites un essai contre l'adresse de loopback de votre machine, vous pouvez voir ceci se produire). En fait, la valeur du champ d'identification IP est aléatoirement calculée.

Le seul vrai detail que nous pouvons utiliser est le fait que HPING2 n'a aucune donnée dans son partie de données ICMP.

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

Les informations qui peuvent nous aider a identifier Nemesis incluent:

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

La seconde paire de requete et reponse Echo ICMP est identique a la premiere paire, excepte pour le numero d'identification IP (qui est utilise depuis l'OS).

Le checksum pour l'en-tête ICMP est le même avec les deux paires, puisque les numeros de sequence ICMP et les numéros d'identification ICMP utilisés sont identiques. Puisque Nemesis produira la même demande d'écho ICMP par défaut, nous pouvons detecter les mêmes configurations a chaque fois.

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

A partir de la premiere requete Echo ICMP, nous pouvons conclure que la taille des paquets qu'Icmpnum produit sera toujours de 28 octets, sans partie de donnees.

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

L' ID IP sera toujours egal a la valeur de 029a hex / 666 decimal. La valeur de l'ID ICMP sera toujours mis a 029a hex. Le numero de sequence ICMP sera toujours mis a 0. Le TTL IP avec icmpnum est mis a 255. Ces configurations uniques nous permettent d'identifier icmpnum assez facilement.

SING (Send ICMP Nasty Garbage)

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

Les informations suivantes peuvent nous aider a identifier SING:

Voila al trace tcpdump de la seconde paire de requete/reponse Echo ICMP:

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

A partir de la seconde paire requete/reponse Echo ICMP, nous pouvons conclure que:

Les parametres que l'on peut utiliser pour identifier SING sont:

Conclusion sur l'OS

Un Exemple avec SING

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;)

Conclusion

Chacun des outils discutés a sa propre seule empreinte digitale. L'identification de ces seules différences entre un outil et un l'autre nous permet de déterminer l'outil utilisé. Regarder les fautes/erreurs uniques dans la conception des outils permettra parfois l'identification du système d'exploitation.

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/)