Come scoprire il sistema operativo remoto con un solo ping (e un pizzico di traceroute)

L’OS Fingerprinting è il processo che permette di determinare il sistema operativo dell’host remoto. Esistono due metodi per metterlo in pratica.

Attivo: Inviando pacchetti sonda ed analizzando la risposta
Passivo: Intercettando (sniffing) i dati in transito e valutando particolari campi dei protocolli.

Ci sono potenti e comodi strumenti per fare questo. Ma in questo articolo voglio presentare un metodo per tentare di identificare l’host remoto manualmente, utilizzando ping e traceroute (o tracert).

Questa tecnica può tornare utile nel caso in cui non si disponesse degli strumenti appositi, in casi di emergenza. Sicuramente è utile per allontanarsi dall’astrazione dell’uso di uno strumento automatico ed avvicinarsi al significato delle cose, scopo vero della conoscenza.

Una delle tecniche del fingerprinting è quella di intercettare i pacchetti dati ed analizzarne i campi dei protocolli. Ogni sistema operativo, nell’ambito delle linee guida dei protocolli e nella misura in cui questi lo permettano, creano i pacchetti dati con valori arbitrari e distintivi.
Analizzando questi valori si riesce ad identificare quale sistema operativo ha creato un particolare pacchetto.

Per entrare più nello specifico, e per avvicinarci al tema centrale di questo articolo, parliamo del protocollo IP . Il protocollo IP (Internet Protocol) è il protocollo principe di Internet: ogni dato che viaggia su Internet è racchiuso in questo protocollo.

Ogni informazione, dall’email allo streaming video o audio, attraversa la rete in forma frammentata: ogni frammento viene chiamato pacchetto dati. Ogni connessione TCP viene fatta a pezzi e inglobata in pacchetti IP. Naturalmente questa è una descrizione assai grossolana ma per lo scopo di questo articolo può bastare.

Questi pacchetti dati contengono come dicevamo pezzi di video o pagine web o qualsiasi altro dato; ma contengono anche altre informazioni, proprie del protocollo IP e utili al funzionamento del sistema.

Per esempio, le informazioni aggiuntive saranno gli indirizzi del mittente e del destinatario. Ogni pacchetto dati IP contiene al suo interno l’indirizzo IP (il famoso indirizzo IP) dell’host che invia il pacchetto stesso; senza questo indirizzo il destinatario non saprebbe da dove viene l’informazione e non saprebbe a chi rispondere; la presenza dell’indirizzo di destinazione è ovvio: “a chi devo mandare questi dati?”.

Non finisce qui. In ogni pacchetto ci sono anche altri dati, dati controllo. Uno in particolare di questi dati ci interessa in modo particolare: il campo TTL.

TTL significa Time To Live. E’ un valore che indica quanto per tempo il pacchetto IP può vagare per la rete prima di raggiungere la destinazione. Una volta che questo tempo scade, il pacchetto stesso viene eliminato.
Questo campo serve per evitare che pacchetti per qualche motivo sfuggiti al controllo continuino all’infinito a girare per la rete, con prevedibili problemi di congestione del traffico.

Il Time To Live funziona così: quando il pacchetto viene creato e quindi trasmesso, questo valore viene impostato con un valore. Questo valore non è specificato da nessuna parte, ognuno lo può impostare come vuole. Ad ogni passaggio in un router questo valore viene decrementato di uno. Quando raggiunge lo zero viene scartato dalla rete.

Da quanto appena detto è facile intuire che il protocollo IP ha delle regole ben precise: il formato dei pacchetti, il meccanismo del TTL…; ma lascia anche la flessibilità di scegliere i valori di TTL, che come dicevo prima sono distintivi per ogni sistema operativo. A questo punto è chiaro che catturando un pacchetto IP e analizzando il TTL si può indovinare quale tipo di sistema operativo lo ha trasmesso.

Esiste uno strumento comune, presente in tutti i computer, che si chiama ping: tramite questo comando si può interrogare un host remoto e visuallizarne il TTL.

Verificarlo è semplice. Lancio il prompt dei comandi e “pingo” il mio computer:

C:\Documents and Settings\angelor>ping 127.0.0.1
 
Esecuzione di Ping 127.0.0.1 con 32 byte di dati:
 
Risposta da 127.0.0.1: byte=32 durata&lt;1ms <strong>TTL=128</strong>

Questa informazione può essere utiissima se il nostro obiettivo è quello di identificare un sistema operativo remoto. Il TTL del mio computer è 128.

Bene. Ma che ci facciamo con questo numero? Ogni sistema operativo inizializza il TTL con un valore proprio. In genere Windows XP lo inizializza a 128, mentre Linux a 64.
Avendo il mio computer risposto con 128, è chiaro che sto usando Windows.

Altro esempio pratico. Ho una rete VMWare con due computer:

  • Windows XP con indirizzo 192.168.132.128
  • Linux Ubuntu con indirizzo 192.168.132.130

Eseguo un ping su 192.168.132.128:

C:\Documents and Settings\angelor&gt;ping 192.168.132.128
 
Esecuzione di Ping 192.168.132.128 con 32 byte di dati:
 
Risposta da 192.168.132.128: byte=32 durata=1ms TTL=128
Risposta da 192.168.132.128: byte=32 durata&lt;1ms TTL=128
Risposta da 192.168.132.128: byte=32 durata&lt;1ms TTL=128
Risposta da 192.168.132.128: byte=32 durata&lt;1ms TTL=128
 
Statistiche Ping per 192.168.132.128:
Pacchetti: Trasmessi = 4, Ricevuti = 4, Persi = 0 (0% persi),
Tempo approssimativo percorsi andata/ritorno in millisecondi:
Minimo = 0ms, Massimo =  1ms, Medio =  0ms

Questo risultato conferma che Windows XP risponde con TTL=128.

Eseguo un ping su 192.168.132.130:

C:\Documents and Settings\angelor&gt;ping 192.168.132.130
 
Esecuzione di Ping 192.168.132.130 con 32 byte di dati:
 
Risposta da 192.168.132.130: byte=32 durata&lt;1ms TTL=64
Risposta da 192.168.132.130: byte=32 durata&lt;1ms TTL=64
Risposta da 192.168.132.130: byte=32 durata&lt;1ms TTL=64
Risposta da 192.168.132.130: byte=32 durata&lt;1ms TTL=64
 
Statistiche Ping per 192.168.132.130:
Pacchetti: Trasmessi = 4, Ricevuti = 4, Persi = 0 (0% persi),
Tempo approssimativo percorsi andata/ritorno in millisecondi:
Minimo = 0ms, Massimo =  0ms, Medio =  0ms

Anche in questo caso c’è la conferma: il sistema che so essere Linux Ubuntu risponde con TTL=64.

Qui è tutto facile, rete locale su un sistema virtuale. Però il TTL vien e decrementato di una unità ad ogni passaggio di router (hop). Facciamo un esperimento nel mondo reale.

Vado su CentralOps e pingo www.redhat.com (Suppongo che redhat.com utilizzi sistemi Linux e dovrebbe rispondere con TTL=64):

count      ttl (hops)      rtt (ms)             from
1            <strong>58</strong>               0                      72.246.88.112

Nell’esperimento condotto sulla mia rete locale non ci sono router e il TTL non viene mai decrementato. Invece tra CentralOps e RedHat potrebbero esserci diversi router.

Il risultato mostra un TTL pari a 58 e non 64. Ma attenzione: ricordo che ad ogni hop il TTL iniziale viene decrementato di uno.

Visto che il TTL ottenuto è 58, ma quello che mi aspettavo doveva essere 64, suppongo che tra i due host ci siamo 6 router. Ma supporre non basta, occorre una dimostrazione strumentale.

Per ottenere il numero di hop tra due sistemi usiamo traceroute (tracert Windows). Vado ancora su CentralOps ed eseguo un traceroute su www.redhat.com:

hop      rtt     rtt     rtt          ip address        domain name
1         1       2       1           70.84.211.97     61.d3.5446.static.theplanet.com
2         0       0       0           70.84.160.129   vl1.dsr01.dllstx5.theplanet.com
3         0       0       0           70.85.127.105   po51.dsr01.dllstx3.theplanet.com
4         0       0       0           70.87.253.9      et3-1.ibr04.dllstx3.theplanet.com
5         0       0       0           63.218.23.25    ge5-3.br02.dal01.pccwbtn.net
6         0       0       0           72.246.88.112   a72-246-88-112.deploy.akamaitechnologies.com

Il risultato conferma che il TTL iniziale di redhat.com è 64, ovvero il 58 che abbiamo ottenuto con il ping sommato al numero degli hop tra i due sistemi: 6. Il caso è risolto: redhat.com usa Linux!

Il mondo reale è molto più complesso. I TTL standard possono essere alterati, ogni versione di sistema operativo può avere TTL diversi. Può capitare che sia Windows sia Linux rispondano con TTL a 128. Per una risposta più affidabile bisogna utilizzare i programmi come p0f, nmap o xprobe, che effettuano anche altri tipi di controlli.

Ho descritto a grandi linee come funzionano i programmi di fingerprinting. Questo è un metodo da Mac Gyver, in emergenza può anche tornare utile. Mac Gyver con un poco di pazienza e abilità riusciva a creare esplosivo dal nulla: certo, se avesse avuto sottomano un po’ di C4 avrebbe fatto prima!

3 Commenti

I commenti sono bloccati.