5. Implementazione di nmap e risultati
Ho creato una implementazione di riferimento delle tecniche di rilevamento S.O. menzionati sopra (eccetto quelle che ho detto che sono state esclude). Ho aggiunto questo al mio scanner Nmap, il quale ha il vantaggio che riconosce già quali porte sono aperte e chiuse per il fingerprinting, cosí non dovete dirglielo. Esso è pure portabile tra Linux, *BSD, Solaris 2.51 e 2.6, e alcuni altri sistemi operativi.
Le nuove versioni di nmap leggono un file riempito con i template di fingerprint, che seguono una grammatica semplice. Ecco qui un esempio:
FingerPrint IRIX 6.2 - 6.4 # Grazie a Lamont Granquist
TSeq(Class=i800)
T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT)
T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)
Diamo un'occhiata alla prima linea (sto aggiungendo > come marcatori):
> FingerPrint IRIX 6.2 - 6.3 # Grazie a Lamont Granquist
Questo semplicement dice che il fingerprint riguarda IRIX dalla versione 6.2 alla 6.3 e il commento dichiara che Lamont Granquist gentilmente mi ha mandato gli indirizzi IP o le fingerprint delle macchine IRIX testate.
> TSeq(Class=i800)
Questo significa che il campionamento ISN lo mette [N.d.T. l'host al cui abbiamo fatto lo scan di nmap] nella classe i800. Questo significa che ciascun nuovo numero della successione è un multiplo di 800 più dell'ultimo numero.
> T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
Il test è denominato T1 (che sta per test1, intelligente no?). In questo test mandiamo un pacchetto SYN con un paio di opzioni TCP a una porta aperta.DF=N
significa che il bit "non frammentare" della risposta non deve essere impostato. W=C000|EF2A
significa che la "finestra" avvertimento che abbiamo ricevuto deve essere 0xC000 o EF2A.ACK=S++
significa che il riconoscimento, che riceviamo deve essere il nostro numero di successione iniziale piú 1. Flags = AS
significa che il flag ACK e SYN sono stati mandati nella risposta. Ops = MNWNNT
significa che lo opzioni nella risposta devono essere (in questo ordine):
<MSS (not echoed)><NOP><Window scale><NOP><NOP><Timestamp>
> T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
Il test 2 comporta un NULL con le stesse opzioni a una porta aperta.
Resp=Y
significa che possiamo ottenere una risposta. Ops=
significa che non ci deve essere alcuna opzione inclusa nel pacchetto risposta. Se noi togliamo completamente '%Ops='
allora ogni opzione mandata dovrebbe corrispondere.
> T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M)
Il test 3 è un SYN|FIN|URG|PSH c/opzioni a una porta aperta.
> T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
Questo è un ACK a una porta aperta. Notate che noi non abbiamo un Resp= qui. Questo significa che la mancanza di una risposta (ad esempio il pacchetto è stato lasciato cadere sulla rete o ci troviamo davanti a un firewall) non renderà incapace un match (o corrispondenza) purchè tutti gli altri testi "matchino" [N.d.T. ovvero siano in grado di creare una corrispondenza]. Facciamo questo perchè virtualmente ogni S.O. manderà una risposta, così una mancanza di risposta è generalmente un attributo delle condizioni dirette e non del S.O. in se stesso. Mettiamo il tag Resp nei test 2 e 3 perchè alcuni sistemi operativi scartano questi [N.d.T i pacchetti] senza rispondere.
> T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
> T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
> T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
Questi test sono un SYN,ACK, e FIN|PSH|URG, rispettivamente, a una porta chiusa. Le stesse opzioni come sempre sono impostate. Certamente tutto questo è, probabilmente ovvio dati i nomi descrittivi 'T5', 'T6', e 'T7' :).
> PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)
Questa frase è il test di "porta unreachable" (porta non raggiungibile). Dovreste riconoscere DF=N
, l'abbiamo visto prima. TOS=0
significa che il campo del tipo del servizio IP era 0. I due campi successivi danno il valore (esadecimale) del campo della lunghezza totale (total length) IP del messaggio header IP e la lunghezza totale data nel header IP, che ha fatto "echoing" indietro verso di noi. [N.d.T.In altre parole a cui l'host, che precedentemente era stato sottoposto allo scan, ha inoltrato verso di noi.] (RID=E
significa che il valore RID che abbiamo indietro nella copia del nostro pacchetto originale UDP è stata aspettata (per esempio è uguale a quella che abbiamo mandato). RIPCK=E
significa che non hanno [N.d.T i pacchetti mandati] fottuto il checksum (se lo avessero fatto, diremmo RIPCK=F
). UCK=E
significa che il checksum UDP è ancora corretto. Poi viene la lunghezza UDP che era 0x134
e DAT=E
significa che essi hanno fatto l'echoing dei nostri dati in maiera corretta . In quanto la maggior parte delle implementazioni (inclusa questa) non manda ciascuno dei nostri dati UDP indietro, essi prendono DAT=E di default.
La versione di nmap con questa funzionalità è correntemente nel sesto ciclo beta privato. Potrebbe essere rilasciata nel momento in cui hai letto questo articolo in Phrack. Ma potrebbe pure non esserlo. Vedi http://nmap.org/ per l'ultima versione di nmap.
Avanti Indietro Indice