lunes, 4 de enero de 2010

TCP 3-Way Handshake con Scapy

Scapy es una poderosa herramienta para manipular paquetes de red. Muchas veces, para jugar con algunos protocolos primero debemos crear una conexión TCP, así que aquí les dejo algunas simples lineas para poder hacerlo.

Antes de comenzar debemos configurar una regla de IPtables para que cuando recibamos el SYN/ACK del servidor, nuestro Sistema Operativo no responda con un RST:

iptables -A OUTPUT -p tcp -d www.google.com.ar -s 10.10.0.157
--dport 80 --tcp-flags RST RST -i DROP

Todo lo que se encuentra a continuación deberían ejecutarlo de una sola vez y rápidamente para que funcione sin problemas:

# Defino el IP Header y el Initial Sequence Number del Cliente
ip_header = IP(src="10.10.0.157", dst="www.google.com.ar")
cliente_ISN = 12345

# Creo el paquete SYN a ser enviado
envio_SYN = ip_header/TCP(sport=1024, dport=80, flags="S", seq=cliente_ISN)

# Envio el paquete SYN y recibo el SYN/ACK de respuesta
recibo_SYNACK = sr1(envio_SYN)

# Actualizo el ISN del Cliente y el recibido del Servidor
server_ISN = recibido_SYNACK.seq+1
cliente_ISN = cliente_ISN+1

# Creo el paquete ACK a ser enviado
envio_ACK = ip_header/TCP(sport=1024, dport=80, flags="A", seq=cliente_ISN,
ack=server_ISN)

# Envio el paquete ACK y termino el handshake
send(envio_ACK)

# Creo el paquete con un Payload y lo envío al Servidor
PUSH = ip_header/TCP(sport=1024, dport=80, flags="PA", seq=cliente_ISN,
ack=server_ISN)

DATA = "\nGET / HTTP/1.1\r\nHost:www.google.com.ar\r\n\r\n"

sr1(ip_header/PUSH/DATA)

Otra cosa interesante que podríamos hacer, es emular todo el handshake entre el Cliente y el Servidor, y luego inyectar todo este tráfico creado por nosotros en la red.

var_list = [var1, var2, var3, var4]

wrpcap("handshake.pcap", var_list)

Esto podría ser muy útil si estamos probando reglas de un IDS, o si queremos comprobar el comportamiento de cierto tráfico en la red.

No hay comentarios.:

LinkWithin