hping3(8) envoie des paquets TCP/IP (presque) arbitraires à des systèmes réseaux

RESUME

hping3 [ -hvnqVDzZ012WrfxykQbFSRPAUXYjJBuTG ] [ -c count ] [ -i wait ] [ --fast ] [ -I interface ] [ -9 signature ] [ -a host ] [ -t ttl ] [ -N ip id ] [ -H ip protocol ] [ -g fragoff ] [ -m mtu ] [ -o tos ] [ -C icmp type ] [ -K icmp code ] [ -s source port ] [ -p[+][+] dest port ] [ -w tcp window ] [ -O tcp offset ] [ -M tcp sequence number ] [ -L tcp ack ] [ -d data size ] [ -E filename ] [ -e signature ] [ --icmp-ipver version ] [ --icmp-iphlen length ] [ --icmp-iplen length ] [ --icmp-ipid id ] [ --icmp-ipproto protocol ] [ --icmp-cksum checksum ] [ --icmp-ts ] [ --icmp-addr ] [ --tcpexitcode ] [ --tcp-mss ] [ --tcp-timestamp ] [ --tr-stop ] [ --tr-keep-ttl ] [ --tr-no-rtt ] [ --rand-dest ] [ --rand-source ] ] [ --beep ] hostname

DESCRIPTION

hping3 est un outil réseau capable d'envoyer des paquets TCP/IP sur commande et d'afficher les réponses de la cible comme le programme ping le fait avec les réponses ICMP. hping3 traite la fragmentation, les contenus de paquets et les tailles arbitraires, et peut être utilisé dans le but de transférer des fichiers encapsulés dans les protocoles supportés. En utilisant hping3 vous êtes capable d'effectuer au moins les tâches suivantes :


 - Tester les règles d'un firewall
 - Scanner des ports de façon avancée
 - Tester les performances réseau en utilisant différents protocoles, tailles de paquets, TOS (type de service) et fragmentation.
 - Découverte de "Path MTU"
 - Transférer des fichiers même au travers de règles de firewall vraiment fascistes.
 - Comme traceroute avec différents protocoles.
 - Utilisation comme Firewalk.
 - Détermination d'OS à distance.
 - Audit de pile TCP/IP.
 - Beaucoup d'autres.

C'est également un bon outil didactique pour apprendre TCP/IP. hping3 est développé et maintenu par [email protected] et est sous la version 2 de la licence GPL. Le développement est ouvert donc vous pouvez m'envoyer des patches, suggestions et affronts sans inhibition.

SITE DE HPING

site primaire sur http://www.hping.org. Vous pouvez trouver à la fois la version stable et les instructions pour télécharger le dernier code source sur http://www.hping.org/download.html

OPTIONS DE BASE

-h --help
Montre l'écran d'aide sur la sortie standard, donc vous pouvez rediriger vers less.
-v --version
Montre l'information de version et l'API utilisée pour accéder au niveau données (data link layer), linux sock packet ou libpcap.
-c --count count
Arrête après avoir envoyé (et reçu) count paquets réponse. Après que le dernier paquet a été envoyé hping3 attend COUNTREACHED_TIMEOUT secondes les réponses du système cible. Vous avez la possibilité de régler COUNTREACHED_TIMEOUT en éditant hping3.h
-i --interval
Attend le nombre spécifié de secondes ou de micro secondes entre l'envoie de chaque paquet. --interval X fixe wait à X secondes, --interval uX fixe wait à X micro secondes. Le défaut est d'attendre une seconde entre chaque paquet. En utilisant hping3 pour transférer des fichiers fixer cette option est très important pour augmenter le taux de transfert. Même en utilisant hping3 pour effectuer des scans passifs/avec usurpation d'adresse vous devriez fixer cette option, voir HPING3-HOWTO pour plus d'informations.
--fast
Alias pour -i u10000. Hping enverra 10 paquets par seconde.
--faster
Alias pour -i u1. Plus rapide que --fast ;) (mais pas aussi rapide que votre ordinateur peut envoyer des paquets à cause de la conception basée sur les signaux).
--flood
Envoi les paquets aussi vite que possible sans prendre en compte les réponses de retour. Cette méthode est encore plus rapide que l'option -i u0.
-n --numeric
Sortie numérique seulement, aucune tentative ne sera faite pour chercher les noms symboliques pour les adresses système.
-q --quiet
Sortie silencieuse. Rien n'est affiche excepté les lignes de résume au moment du démarrage et quand c'est fini.
-I --interface interface name
Par défaut sur les systèmes linux et BSD hping3 utilise l'interface de routage par défaut. Sur d'autres systèmes ou quand il n'y a pas d'interface de routage par défaut hping3 utilise la première interface non loopback. Quoi qu'il en soit vous avez la possibilité de forcer hping3 à utiliser l'interface dont vous avez besoin en utilisant cette option. Note : vous n'avez pas besoin de spécifier le nom complet, par exemple -I et va correspondre à eth0 ethernet0 myet1 et cetera. Si aucune interface ne correspond hping3 essayera d'utiliser lo.
-V --verbose
Active la sortie verbeuse. Les réponses TCP seront affichées comme suit :

len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.4 ms tos=0 iplen=40 seq=0 ack=1380893504 sum=2010 urp=0

-D --debug
Active le mode de débogage, c'est utile quand vous rencontrez quelques problèmes avec hping3. Quand le mode de débogage est activé vous obtiendrez plus d'informations à propos de la détection des interfaces, de l'accès au niveau données, du réglage des interfaces, des options d'analyse, de la fragmentation, du protocole HCMP et d'autres choses.
-z --bind
Lie CTRL+Z au time to live (TTL) ainsi vous serez capable d'incrémenter/décrémenter le ttl des paquets sortant en pressant CTRL+Z une ou deux fois.
-Z --unbind
Dé-lie CTRL+Z ainsi vous serez capable d'arrêter hping3
--beep
Emet un « bip » pour tous les paquets correspondants reçus (mais pas pour les erreurs ICMP).

SELECTION DE PROTOCOLE

Le protocole par défaut est TCP, par défaut hping3 enverra des entêtes TCP sur le port 0 du système cible avec une winsize (ndt : taille de fenêtre) de 64 sans aucun drapeau TCP activé. Souvent c'est la meilleure manière de faire un 'ping caché', utile quand la cible est derrière un firewall qui jette ICMP. De plus un paquet TCP null-flag (ndt : sans drapeau) vers le port 0 a de bonnes probabilités de ne pas être journalisé.
-0 --rawip
Mode RAW IP, dans ce mode hping3 enverra une entête IP avec les données ajoutées avec --signature et/ou --file, voir également --ipproto qui vous autorise à fixer le champ protocole IP.
-1 --icmp
Mode ICMP, par défaut hping3 enverra un paquet ICMP echo-request, vous pouvez fixer un autre type/code ICMP en utilisant les options --icmptype --icmpcode
-2 --udp
Mode UDP, par défaut hping3 enverra des paquets UDP vers le port 0 du système cible. Les options réglables des entêtes UDP sont les suivantes : --baseport, --destport, --keep.
-8 --scan
Mode scan, l'option attend un argument qui décrit des groupes de ports à scanner. Les groupes de ports sont séparés par des virgules : un nombre décrit seulement un port unique, donc 1,2,3 signifie ports 1, 2 et 3. Les intervalles sont spécifiés en utilisant une notation début-fin, comme 1-1000, qui dit à hping de scanner les ports entre 1 et 1000 (inclus). Le mot spécial all est un alors pour 0-65535, pendant que le mot spécial known inclut tous les ports listés dans /etc/services.
Les groupes peuvent être combinés, donc la commande suivante scannera les ports entre 1 et 1000 ET le port 8888 ET les ports listés dans /etc/services: hping --scan 1-1000,8888,known -S target.host.com
Les groupes peuvent être niés (soustraits) en utilisant un caractère ! comme préfix, donc la ligne de commande suivante scannera tous les ports NON listés dans /etc/services dans l'intervalle 1-1024 : hping --scan '1-1024,!known' -S target.host.com
Gardez à l'esprit que pendant que hping apparaît beaucoup plus comme un scanneur de ports dans ce mode, la plupart des options sont toujours honorées, donc pour effectuer par exemple un scan SYN vous avez besoin de spécifier l'option -S, vous pouvez changer la taille de la fenêtre TCP, le TTL, contrôler la fragmentation IP comme habituellement, et ainsi de suite. La seule différence réelle est que le comportement standard de hping est encapsulé dans un algorithme de scan.
Note technique : Le mode scan utilise une conception basée sur deux processus, avec de la mémoire partagée pour la synchronisation. L'algorithlme de scan n'est toujours pas optimal, mais déjà assez rapide.
Conseil : à la différence de la plupart des scanneurs, hping montre quelques informations intéressantes à propos des paquets reçus, les champs IP ID, TCP win, TTL, et ainsi de suite, n'oubliez pas de regarder ces informations additionnelles quand vous effectuez un scan! Quelques fois elles montrent des détails intéressants.
-9 --listen signature
Mode d'écoute de HPING3, en utilisant cette option hping3 attend les paquets qui contiennent signature et exporte de la fin de la signature à la fin du paquet. Par exemple si hping3 --listen TEST lit un paquet qui contient 234-09sdflkjs45-TESThello_world il affichera hello_world.

OPTIONS IP

-a --spoof hostname
Utiliser cette option dans le but de fixer une fausse adresse source, cette option assure que le système cible n'obtiendra pas votre adresse réelle. Quoi qu'il en soit les réponses seront envoyées à l'adresse usurpée, ainsi vous ne serez pas capable de les voir. Afin de voir comment il est possible d'effectuer des scans avec des adresses usurpées/passifs voir le fichier HPING3-HOWTO.

--rand-source
Cette option active le mode source aléatoire. hping enverra des paquets avec des adresses sources aléatoires. Il est intéressant d'utiliser cette option pour stresser les tables d'étât d'un firewall, et d'autres tables dynamiques basées sur les IP dans les piles TCP/IP et les firewall logiciels.
--rand-dest
Cette option active le mode destination aléatoire. hping enverra des paquets à des adresses aléatoires obtenues en suivant la règle que vous avez spécifiée comme système cible. Vous avez besoin de spécifier une adresse IP numérique en tant que système cible comme 10.0.0.x. Toutes les occurrences de x seront remplacées avec un nombre aléatoire dans l'intervalle 0-255. Ainsi pour obtenir des adresses IP internet dans l'espace IPv4 complet utilisez quelque chose comme hping x.x.x.x --rand-dest. Si vous n'êtes pas sûrs du genre d'adresses que votre règle génère essayez d'utiliser l'option --debug pour afficher chaque nouvelle adresse destination générée.
Attention : quand cette option est activée hping ne peut pas détecter la bonne interface de sortie pour les paquets, ainsi vous devez utiliser l'option --interface pour sélectionner l'interface de sortie.
-t --ttl time to live
En utilisant cette option vous pouvez fixer le TTL (time to live) des paquets sortant, il est vraisemblable que vous utiliserez ceci avec les options --traceroute ou --bind Dans le doute essayez `hping3 some.host.com -t 1 --traceroute'.
-N --id
Fixe le champ ip->id . La valeur du champ id par défaut est aléatoire mais si la fragmentation est activée et que le champ id n'est pas spécifié alors il sera égal à getpid() & 0xFF, mettre en oeuvre une meilleure solution est dans la liste TODO (ndt : à faire).
-H --ipproto
Fixe le protocole IP dans le mode RAW IP.
-W --winid
Le champ id des systèmes Windows* avant Win2k ont un byte ordering (ndt : ordre des octets) différent, si cette option est activée hping3 affichera proprement les champs id des réponses de ces Windows.
-r --rel
Affiche les incréments du champ id au lieu du champ id. Voir le fichier HPING3-HOWTO pour plus d'informations. Les incréments ne sont pas calculés comme id[N]-id[N-1] mais en utilisant une compensation de pertes de paquets. Voir le fichier relid.c pour plus d'informations.
-f --frag
Découpe les paquets en fragments, ceci peut être utile afin de tester les performances de la fragmentation des piles IP et de tester si certains filtres de paquets sont si faibles qu'ils peuvent être passés en utilisant de petits fragments (anachronique). Par défaut le 'mtu virtuel' (ndt : taille des fragments) est de 16 octets. Voir également l'option --mtu.
-x --morefrag
Fixe le drapeau IP "more fragments" (ndt : d'autres fragments), utilisez cette option si vous voulez que le système cible envoie un paquet ICMP time-exceeded during reassembly (ndt : délai dépassé durant le ré-assemblage).
-y --dontfrag
Fixe le drapeau IP "don't fragment" (ndt : ne pas fragmenter), ceci peut être utilisé pour effectuer un MTU path discovery (ndt : découverte de la valeur minimale de la "taille maximale des paquets" sur le chemin).
-g --fragoff fragment offset value
Fixe l'offset du fragment.
-m --mtu mtu value
Fixe un 'mtu virtuel' différent de 16 quand la fragmentation est activée. Si la taille des paquets est supérieure au 'mtu virtuel' alors la fragmentation est automatiquement activée.
-o --tos hex_tos
Fixe Type Of Service (TOS) (ndt : le type de service), pour plus d'informations essayez --tos help.
-G --rroute
Enregistrer la route. Inclut l'option RECORD_ROUTE dans chaque paquet envoyé et affiche la route présente dans le tampon du paquet retourné. Notez que l'entête IP n'est suffisamment large que pour neuf routes. Beaucoup de systèmes ignorent ou suppriment cette option. Notez également qu'en utilisant hping vous êtes capable d'utiliser l'enregistrement de la route même si le système cible filtre ICMP. Enregistrer la route est une option IP, non pas une option ICMP, ainsi vous pouvez utiliser l'option d'enregistrement de la route même dans les modes TCP et UDP.

OPTIONS ICMP

-C --icmptype type
Fixe le type ICMP, le défaut est ICMP echo request.
-K --icmpcode code
Fixe le code ICMP, le défaut est 0 (implique --icmp).
--icmp-ipver
Fixe la version IP de l'entête IP contenue dans les données ICMP, le défaut est 4.
--icmp-iphlen
Fixe la longueur de l'entête IP contenue dans les données ICMP, le défaut est 5 (5 mots de 32 bits).
--icmp-iplen
Fixe la longueur du paquet IP de l'entête IP contenue dans les données ICMP, le défaut est la taille réelle.
--icmp-ipid
Fixe le champ IP id de l'entête IP contenue dans les données ICMP, le défaut est aléatoire.
--icmp-ipproto
Fixe le protocole IP de l'entête IP contenue dans les données ICMP, le défaut est TCP.
--icmp-cksum
Fixe la somme de contrôle ICMP, le défaut est la somme de contrôle valide.
--icmp-ts
Alias pour --icmptype 13 (pour envoyer des requêtes ICMP timestamp).
--icmp-addr
Alias pour --icmptype 17 (pour envoyer des requêtes ICMP masque réseau).

OPTIONS TCP/UDP

-s --baseport source port
hping3 utilise le port source afin de deviner les numéros de séquence des réponses. Il commence avec un numéro de port source de base, et incrémente ce numéro pour chaque paquet envoyé. Quand un paquet est reçu alors le numéro de séquence peut être calculé comme port.source.réponse - port.source.de.base. Le port source de base par défaut est aléatoire, en utilisant cette option vous êtes capable de fixer un numéro différent. Si vous avez besoin que le port source ne soit pas incrémenté pour chaque paquet envoyé utilisez l'option -k --keep.
-p --destport [+][+]dest port
Fixe le port destination, le défaut est 0. Si le caractère '+' précède le numéro de port destination (i.e. +1024) le port destination sera incrémenté pour chaque paquet reçu. Si deux '+' précèdent le numéro de port destination (i.e. ++1024), le port destination sera incrémenté pour chaque paquet envoyé. Par défaut le port destination peut être modifié interactivement en utilisant CTRL+z.
--keep
Garde constant le port source, voir --baseport pour plus d'informations.
-w --win
Fixe la taille de la fenêtre TCP. Le défaut est 64.
-O --tcpoff
Fixe un faux offset (ndt : décalage) des données TCP. L'offset normal des données est tcphdrlen / 4.
-M --tcpseq
Fixe le numéro de séquence TCP.
-L --tcpack
Fixe le drapeau TCP ack.
-Q --seqnum
Cette option peut être utilisée afin de collecter les numéros de séquence générés par le système cible. Ceci peut être utile quand vous avez besoin d'analyser si les numéros de séquence TCP sont prévisibles. Exemple de sortie :

#hping3 win98 --seqnum -p 139 -S -i u1 -I eth0

HPING uaz (eth0 192.168.4.41): S set, 40 headers + 0 data bytes
2361294848 +2361294848
2411626496 +50331648
2545844224 +134217728
2713616384 +167772160
2881388544 +167772160
3049160704 +167772160
3216932864 +167772160
3384705024 +167772160
3552477184 +167772160
3720249344 +167772160
3888021504 +167772160
4055793664 +167772160
4223565824 +167772160

La première colonne reporte les numéros de séquence, la seconde la différence entre le numéro de séquence courant et le dernier. Comme vous pouvez le voir les numéros de séquence du système cible sont prévisibles.

-b --badcksum
Envoie des paquets avec une mauvaise somme de contrôle UDP/TCP
--tcp-mss
Active l'option TCP MSS et la fixe avec la valeur donnée.
--tcp-timestamp
Active l'option TCP timestamp, et essaye de deviner la fréquence de mise à jour du timestamp et l'uptime du système distant.
-F --fin
Fixe le drapeau TCP FIN.
-S --syn
Fixe le drapeau TCP SYN.
-R --rst
Fixe le drapeau TCP RST.
-P --push
Fixe le drapeau TCP PUSH.
-A --ack
Fixe le drapeau TCP ACK.
-U --urg
Fixe le drapeau TCP URG.
-X --xmas
Fixe le drapeau TCP Xmas.
-Y --ymas
Fixe le drapeau TCP Ymas.

OPTIONS COMMUNES

-d --data data size
Fixe la taille du corps du paquet. Attention, en utilisant --data 40 hping3 ne générera pas des paquets de 0 octet mais de entête_de_protocole+40 octets. hping3 affichera en information la taille des paquets comme première ligne de sortie, comme ceci : HPING www.yahoo.com (ppp0 204.71.200.67): NO FLAGS are set, 40 headers + 40 data bytes
-E --file filename
Utilise le contenu du fichier filename pour remplir les données du paquet.
-e --sign signature
Remplit d'abord longueur de signature octets de données avec signature. Si longueur de signature est plus grand que la taille des données alors un message d'erreur sera affiché. Si vous ne spécifiez pas la taille des données hping utilisera la taille de la signature comme taille des données. Cette option peut être utilisée sans risque avec l'option --file filename, l'espace de données restant sera rempli en utilisant le fichier filename.
-j --dump
Affiche les paquets en hexadécimal.
-J --print
Affiche les caractères imprimables des paquets reçus.
-B --safe
Active le protocole safe, en utilisant cette option les paquets perdus dans un transfert de fichier seront renvoyés. Par exemple afin d'envoyer le fichier /etc/passwd depuis le système A au système B vous pouvez utiliser ce qui suit :
[host_a]
# hping3 host_b --udp -p 53 -d 100 --sign signature --safe --file /etc/passwd
[host_b]
# hping3 host_a --listen signature --safe --icmp
-u --end
Si vous utilisez l'option --file filename, cela vous dit quand la fin du fichier a été atteinte. D'ailleurs cela prévient que l'autre côté accepte plus de paquets. S'il vous plaît, pour plus d'informations voir le fichier HPING3-HOWTO.
-T --traceroute
Mode traceroute. En utilisant cette option hping3 incrémentera le ttl pour chaque paquet ICMP time to live 0 during transit reçu. Essayez hping3 host --traceroute. Cette option implique --bind et --ttl 1. Vous pouvez l'emporter sur le ttl à 1 en utilisant l'option --ttl. Depuis 2.0.0 stable il affiche les informations de RTT. --tr-keep-ttl garde le ttl fixe en mode traceroute, ainsi vous pouvez contrôler simplement un noeud sur la route. Par exemple, pour contrôler comment le 5ème noeud change ou comment son RTT change vous pouvez essayer hping3 host --traceroute --ttl 5 --tr-keep-ttl.
--tr-stop
Si cette option est spécifiée hping quittera dès que le premier paquet qui n'est pas un ICMP time exceeded est reçu. Ceci émule mieux le comportement de traceroute.
--tr-no-rtt
Ne montre pas l'information RTT en mode traceroute. L'information du RTT des ICMP time exceeded n'est même pas calculée si cette option est positionnée.
--tcpexitcode
Quitte avec le champ tcp->th_flag du dernier paquet reçu comme code de retour. Utile pour les scripts qui ont besoin, par exemple, de savoir si le port 999 de quelque système répond avec SYN/ACK ou avec RST en réponse à un SYN, i.e. le service est lancé ou arrêté.

FORMAT DE SORTIE TCP

Le format standard de sortie TCP est le suivant :

len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.4 ms

len est la taille, en octets, des données capturées dans la couche liaison de données en excluant la taille de l'entête de liaison de données. Ceci peut ne pas correspondre à la taille du datagramme IP à cause du rembourrage bas niveau de la couche liaison de données.

ip est l'adresse ip source.

flags sont les drapeaux TCP, R pour RESET, S pour SYN, A pour ACK, F pour FIN, P pour PUSH, U pour URGENT, X pour 0x40 non standard, Y pour 0x80 non standard.

Si la réponse contient DF l'entête IP possède le bit don't fragment (ndt : ne pas fragmenter) positionné.

seq est le numéro de séquence du paquet, obtenu en utilisant le port source pour les paquets TCP/UDP, le champ séquence pour les paquets ICMP.

id est le champ IP ID.

win est la taille de la fenêtre TCP

rtt est le "round trip time" (ndt : temps aller-retour) en millisecondes.

Si vous exécutez hping en utilisant l'option -V de la ligne de commande il affichera des informations supplémentaires à propos du paquet, par exemple :

len=46 ip=192.168.1.1 flags=RA DF seq=0 ttl=255 id=0 win=0 rtt=0.4 ms tos=0 iplen=40 seq=0 ack=1223672061 sum=e61d urp=0

tos est le champ type de service de l'entête IP.

iplen est le champ IP longueur totale.

seq et ack sont les numéros de séquence et d'acquittement sur 32 bits dans l'entête TCP.

sum est la valeur de la somme de contrôle de l'entête TCP.

urp est la valeur du pointeur urgent TCP.

FORMAT DE SORTIE UDP

Le format standard de sortie est :

len=46 ip=192.168.1.1 seq=0 ttl=64 id=0 rtt=6.0 ms

La signification des champs est la même que celle de la sortie TCP pour les champs de même nom.

FORMAT DE SORTIE ICMP

Un exemple de sortie ICMP est :

ICMP Port Unreachable from ip=192.168.1.1 name=nano.marmoc.net

Il est très facile à comprendre. Il commence avec la chaîne "ICMP" suivie par la description de l'erreur ICMP, dans l'exemple Port Unreachable (ndt : port non accessible). Le champ ip est l'adresse IP source du datagramme IP contenant l'erreur ICMP, le champ name est simplement l'adresse numérique résolue en un nom (une requête dns PTR) ou UNKNOWN si la résolution a échoué.

Le format ICMP de Time exceeded during ou de reassembly est un peu différent :

TTL 0 during transit from ip=192.168.1.1 name=nano.marmoc.net

TTL 0 during reassembly from ip=192.70.106.25 name=UNKNOWN

La seule différence est la description de l'erreur, elle commence avec TTL 0.

AUTEUR

Salvatore Sanfilippo <[email protected]>, avec l'aide des personnes mentionnées dans le fichier AUTHORS et sur http://www.hping.org/authors.html

BOGUES

Même en utilisant les options --end et --safe pour transférer des fichiers, le paquet final sera rembourré avec des octets 0x00.

Les données sont lues sans tenir compte de l'alignement, mais l'alignement est imposé dans les structures de données. Ceci ne sera pas un problème sous i386 mais, alors que normalement les entêtes TCP/IP sont naturellement alignées, cela peut créer des problèmes avec divers processeurs et des paquets mal-formés si il y a des accès non alignés quelque part dans le code (aucun avec un peu de chance).

Sur Solaris hping ne fonctionne pas sur l'interface loopback. Ceci semble être un problème solaris, comme exposé dans la liste de diffusion tcpdump-workers, ainsi la libpcap ne peut rien faire pour la supporter correctement.

TRADUCTEUR

Denis Ducamp <[email protected]>