Ce qui suit est le postage original (ndt : du moins sa traduction) à bugtraq
à propos de la méthode de scan usurpée/passive/indirecte. Voir le fichier
HPING2-HOWTO pour plus d'informations.
antirez
---
Salut,
J'ai découvert une nouvelle méthode de scan de ports TCP. Au
contraire de toutes les autres elle vous permet de scanner en
utilisant des paquets usurpés (ndt : dont l'adresse IP source est
usurpée), ainsi les systèmes scannés ne peuvent pas voir votre
adresse réelle. Afin de réaliser cela j'utilise trois particularités
bien connues des mises en oeuvre TCP/IP de la plupart des OS.
(1) * les systèmes répondent SYN|ACK à SYN si le port TCP cible
est ouvert, et RST|ACK si le port TCP cible est fermé.
(2) * Vous pouvez connaître le nombre de paquets que les systèmes
envoient en utilisant le champ id de l'entête IP. Voir mes
précédents postages 'à propos de l'entête IP' dans cette mailing
liste.
(3) * les systèmes répondent RST à SYN|ACK, ne répondent rien à
RST.
Les joueurs:
système A - le système malfaisant, l'attaquant.
système B - le système silencieux.
système C - le système victime.
A est votre système.
B est un système particulier : il ne doit envoyer aucun paquet
pendant que vous scannez C. Il y a énormément de systèmes à 'trafic
nul' sur Internet, spécialement la nuit :)
C est la victime, il doit être vulnérable aux scans SYN.
J'ai appelé cette méthode de scan 'scan du système muet' (ndt :
l'autre traduction de 'dumb' est bête) en référence aux
caractéristiques du système B.
Comment elle fonctionne :
Le système A surveille le nombre de paquets sortants depuis B en
utilisant le champ id de l'entête IP. Vous pouvez faire ceci
simplement en utilisant hping :
#hping B -r
HPING B (eth0 xxx.yyy.zzz.jjj): no flags are set, 40 data bytes
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=0 ttl=64 id=41660 win=0 time=1.2 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=1 ttl=64 id=+1 win=0 time=75 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=2 ttl=64 id=+1 win=0 time=91 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=3 ttl=64 id=+1 win=0 time=90 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=4 ttl=64 id=+1 win=0 time=91 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=5 ttl=64 id=+1 win=0 time=87 ms
-cut-
..
.
Comme vous pouvez le voir, les incréments du champ id sont toujours
de 1. Ainsi ce système a la caractéristique requise pour jouer le
rôle de B.
Maintenant le système A envoie des paquets SYN au port X de C en
usurpant l'adresse source de B.
(avec hping => 0.67 c'est très facile, http://www.kyuzz.org/antirez)
si le port X de C est ouvert, le système C enverra SYN|ACK à B (oui,
le système C ne sait pas que le véritable expéditeur est A). Dans ce
cas le système B répond au SYN|ACK avec un RST.
Si nous envoyons au système C quelques paquets SYN il répondra à B
quelques paquet SYN|ACK, ainsi B répondra à C quelques RST... ainsi
nous verrons que le système B est en train d'envoyer des paquets !
.
..
-cut-
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=17 ttl=64 id=+1 win=0 time=96 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=18 ttl=64 id=+1 win=0 time=80 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=19 ttl=64 id=+2 win=0 time=83 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=20 ttl=64 id=+3 win=0 time=94 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=21 ttl=64 id=+1 win=0 time=92 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=22 ttl=64 id=+2 win=0 time=82 ms
-cut-
..
.
Le port est ouvert !
Par contre, si le port X de C est fermé alors en envoyant à C
quelques paquets SYN avec l'adresse usurpée de B, il répondra avec
des paquets RST à B, et B ne répondra pas (voir 3). Ainsi nous
verrons que le système B n'est en train d'envoyer aucun paquet :
.
..
-cut-
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=52 ttl=64 id=+1 win=0 time=85 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=53 ttl=64 id=+1 win=0 time=83 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=54 ttl=64 id=+1 win=0 time=93 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=55 ttl=64 id=+1 win=0 time=74 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=56 ttl=64 id=+1 win=0 time=95 ms
60 bytes from xxx.yyy.zzz.jjj: flags=RA seq=57 ttl=64 id=+1 win=0 time=81 ms
-cut-
..
.
Le port est fermé.
Tout ceci peut paraître compliqué à réaliser, mais utiliser deux
sessions de hping dans des consoles virtuelles Linux ou sous X rend
cela plus simple.
La première session surveille le système B : hping B -r
La seconde session envoie des paquets SYN spoofés : hping C -a B -S
Désolé si mon anglais n'est pas clair.
Cependant ce postage n'est pas adéquat pour décrire exhaustivement
cette méthode de scan, ainsi je vais écrire un article à ce sujet,
en particulier comment mettre en oeuvre ceci dans un scanner de
ports (i.e. nmap), et à propos des caractéristiques des joueurs et
des OS utilisés.
bonne nouvelle année,
antirez
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>