Scapy. Manipulación avanzada e interactiva de paquetes. Parte 5

Seguimos con la serie sobre Scapy y la manipulación avanzada e interactiva de paquetes, sniffing, fingerprint, tracers, procedimientos  y generación de gráficos, envio de paquetes, etc. Todo esto lo vimos en la Parte 1, Parte 2, Parte 3 y Parte 4 de la serie dedicada a Scapy.

En esta 5º parte vamos a estudiar las técnicas de Fuzzing con Scapy. Con Fuzzing nos referimos a una serie de técnicas encaminadas a la inyección aleatoria y automatizada de datos contra un determinado software o servicio para generar errores y vulnerabilidades, y así poder corregir dichos defectos. Los paquetes y peticiones se envían, en muchos casos, malformadas, para así comprobar como maneja este tipo de situaciones los servicios y/o protocolos. En este caso, Scapy realiza Fuzzing de protocolos.

La funcion fuzz() de Scapy.

La función fuzz() genera una serie de valores aleatorios para los campos del protocolo que usemos para el fuzzing. Puede cambiar cualquier valor incluso valores de campo como sumas de control dándole valores correctos.

Podemos hacer Fuzzimg de unos portocolos y otros dejarlos con vlores «normalizados». Podemos, también realizar fuzzing con los valores de unos campos del protocolo y otros no, dádoles a los que no un valor concreto que nos interese.

Vamos a ir viendo todo esto de forma gráfica. De momento vamos a ver como scapy crea los campos aleatorios con dos ejemplos:

Fuzzing IP.

fuzzing con scapy funcion fuzz

Al mostrar con show() el paquete construído, vemos, de forma clara, (enmarcado) los campos cuyos valores los generará al enviar el paquete. Los genenerará de forma aleatoria. Estos campos son:

  • version (RandNum)
  • id (RandShort)
  • frag (RandNum)
  • ttl (RandByte)
  • proto (RandByte)
  • dst genera una IP de destino aleatoria: 131.90.110.116

Los Rand* se refieren al tipo de dato aleatorio.

Fuzzing TCP

fuzzing con scapy funcion fuzz

Aquí vemos que casi todos los campos se pueden generar de forma aleatoria. Vemos también que el campo flags de TCP  puede tener cualquiera de los valores e incluso combinados.

Vamos a ver esto último con otro ejemplo y aprovechamos para realizar un fuzzing scapy real enviando una serie de paquetes con loop activado con la función send():

fuzzing con scapy funcion fuzz

Enviamos un 327 paquetes com una IP de destino fijada, un fuzz TCP que para ilustrar mejor el ejemplo hemos fijado el puerto de origen a 4444.

Si ponemos a funcionar Wireshark para ver los paquetes capturados por el host 192.168.1.5:

fuzzing con scapy funcion fuzz captura wireshark

Vemos que:

  • todos los paquetes con origen 192.168.1.100 tienen como puerto 4444  que fijamos en la construcción del paquete.
  • todos los puertos de destino son aleatorios
  • los flags TCP son aleatorios
  • también los amaños de ventana

podéis hacer la prueba y ver vosotros mismos en Wireshark la aleatoriedad de los campos en el fuzzing.

Otro ejemplo. añadimos un nuevo protocolo:

fuzzing con scapy funcion fuzz captura wireshark

NOTA: verbose=0 es para que no salgan los puntitos ………. en pantalla.

El resultado en Wireshark:

fuzzing con scapy funcion fuzz captura wireshark

Arriba. Hemos realizado un fuzzing UDP y NTP.

Recordad que, según la Wikipedia, Network Time Protocol (NTP) es un protocolo de Internet para sincronizar los relojes de los sistemas informáticos a través de ruteo de paquetes en redes con latencia variable. NTP utiliza UDP como su capa de transporte, usando el puerto 123. Está diseñado para resistir los efectos de la latencia variable.

Observad la aleatoriedad de los modos  NTP en la captura Wireshark:

modos en cabecera NTP
Un fuzzing sobre DNS podría ser:

>>> d=IP(dst=»192.168.1.5″)/UDP(dport=53)
>>> d=IP(dst=»192.168.1.5″)/UDP(dport=53)/fuzz(DNS())
>>> send(d,loop=1,verbose=0)
^C>>> d.summary()
‘IP / UDP / DNS Qry ‘
>>>

NOTA: ^C es para parar el envío de paquetes.                                  

Podemos también hacer fuzzing a varios destinatarios en el mismo envío:
>>> c=IP(dst=["192.168.1.5","192.168.1.10","192.168.1.11"])/fuzz ( UDP() ) 
>>> send(c,loop=1,verbose=0) ^C>>>
Podemos enviar los paquetes con sr() o srloop():
fuzzing con scapy funcion fuzz sr srloop

Hacemos lo mismo con fuzz TCP. Vemos ahora como uno de los host responde (está reseñado en la captura) al envio de paquetes con los campos TCP aleatorios:

fuzzing con scapy funcion fuzz sr srloop tcp

Vemos el received 1 packet:

fuzzing con scapy funcion fuzz sr srloop tcp

===========

Esta entrada fue publicada en Scapy, Seguridad y redes, Windump. TCPDump y etiquetada , , , . Guarda el enlace permanente.

2 respuestas a Scapy. Manipulación avanzada e interactiva de paquetes. Parte 5

  1. Jimmy dijo:

    Amigo, en verdad muchas felicitaciones por tus aportes, mira que esto de scapy me quito el sueño! y ahora sufro de insomnio jajaja.
    hasta el momento todo va de perlas, pero en el trayecto me surgieron un 3 dudas y espero por favor me puedas responder honestamente, ahi te van:
    la 1ra es, cuantos años tienes?, la 2da cuanto tiempo llevas dedicándote a esto de seguridad informática y la 3ra de que parte del mundo eres.
    sin mas que decir por el momento me retiro repitiendo: Muchas felicitaciones, en verdad se ve que eres alguien que tiene el buen gusto de compartir lo que aprende. Saludos desde Cd. Obregon, Sonora. México

  2. mackdyzoon dijo:

    He acabado de leer todo lo que escribes, pero tengo una pregunta:
    Si hago wget de un archivo pdf en la red para descargarlo, ¿Cómo puedo usar este programa o tcpdump para reconstruir el pdf a partir de la captura de paquetes que se hace???

Deja un comentario