The Path of the Samurai – Scapy (Parte 3)

Buenas a todos de nuevo!

Se que ha pasado un tiempo… y coño! que hoy es navidad! HOHOHO! feliz navidad y todas esas cosas no? pero ya que estamos todos de vacatas… por que no aprovechar y escribir/leer algo de hacking no?? que no se nos oxiden las neuronas (en mi caso LA) . Por lo visto os han molado los anteriores artículos sobre scapy así que hoy vamos a continuar esta ciber-aventura en el mundo de los paquetes de protocolos de red…. y vamos a hablar de FUZZING de paquetes….

Hace poco me toco explicar que es esto del fuzzing a una persona totalmente ajena a este mundillo y la verdad al principio me costo dar con un símil guay y entendible pero EUREKA! lo consegui así que os lo transmito tal cual que creo que pese a ser muy simplista esta explicado de forma que todos lo vamos a poder entender.

¿Que es un paquete de red?

Vale algunos estaréis pensando ¿Really? ¿Are you kidding me? si.. empezamos por aquí… simplemente son una trama de 0 y 1 enviados de una determinada manera por una red de ordenadores que tanto en origen como en destino tienen un significado concreto. Para el fuzzing vamos a pensar un poco mas en abstracto… y vamos a pensar que ese paquete es esto:

 

 

Un paquete de los nuestros es una tabla en la que tendremos un color por cada una de las celdas. Vale digamos que ordenados de determinada manera los colores de ese paquete son instrucciones que se envían por la mencionada red. Y ahora llegamos al punto que decimos… y si determinamos el protocolo AZUL en la primera casilla pero decidimos que todo el resto del contenido sea aleatorio? Bueno pues ESO ES FUZZING DE PAQUETES!

 

 

No es mas que hacer un paquete y hacer que parte del contenido vaya rellenado de forma aleatoria sin control alguno sobre el contenido del mismo. ¿Sencillo no?

¿Vale tio… me ha encantado la clase de Barrio Sesamo, pero y esto pa que?

Bien,  cuando se hacen pruebas contra maquinas desconocidas este tipo de prueba se realiza para comprobar dos cosas:

  1. El equipo en cuestión es capaz de contestar a paquetes mal formados. (Lo cual es una gran cagada)
  2. Entre todos los paquetes que se generan de forma aleatoria… puede existir uno que hace que la maquina haga Chocapic y la haga funcionar de manera inesperada (¿guay verdad?, Reinicio de sesiones…. Apagar la maquina…. dejarla tonta… llámalo como quieras)

Vale ahora vamos a meternos en scapy y vamos a crear paquetes fuzzeados. Como ya conocemos algunos protocolos… vamos a practicar con ellos:

ITS FUZZING TIME!

Para empezar…. visto que siempre hacemos las pruebas contra el equipo  que causa el caos cuando no funciona (Alias ROUTER) vamos a mirar que rango de iP tenemos y empezaremos a dar caña… para ello ifconfig:

Ya tenemos el rango de red…. ya es cosa vuestra si queréis utilizar a vuestro hermano como escudo… (jajjaja ya de puestos por que no verdad??) asi que vamos a usar esto en diferentes protocolos para ver que ocurre en cada uno de ellos.

ARP

 

paqARP=fuzz(ARP(pdst="IP_ORIGEN", psrc="IP_DESTINO"))
send(paqARP*10000, iface="eth0")

Y su correspondiente traza que en este caso al hacerlo desde una VM da problemas y solo ha sido posible capturarlo desde la misma VM viendo el trafico desde la interfaz ANY… como veis … se encuentran dificultades a la hora de hacer pruebas es cuestión de ir solventandolas poco a poco.

TCP

paqTCP=Ether(dst="MAC_DESTINO",src="MAC_ORIGEN")/fuzz(IP(dst="IP_ORIGEN", src="IP_DESTINO"))
send(paqTCP*10000)

Y aquí la traza

ICMP

paqICMP=Ether(dst="MAC_DESTINO",src="MAC_ORIGEN")/IP(dst="IP_DESTINO",src=IP_ORIGEN)/fuzz(ICMP())
send(paqICMP*10000)

Y aquí podemos ver la traza… que como se puede observar… todos los paquetes están mal formados o son de contenido RARUNO… eso no quita para que entre los que se envían aparezca alguno que este correcto, al final entre toda la basura que se genera alguno tiene que acertar:

Ya que estáis… por que no probáis todo esto con el Router de casa?? al final es un dispositivo que tenéis ahí pero que jamas os habéis propuesto hacerle un pentest verdad? Pues darle duro a ver si alguno lo conseguís… eso si … si conseguís algún resultado… no os olvidéis de comentarlo… que así todos podemos aprender no?

 

Un saludo a todos! Y pensad cosas malignas que podáis hacer con esto… y proponed…

FELIZ NAVIDAD CONEJILLOS!

PD: en la siguiente vais a tener mas chicha… así que id armándoos de paciencia ;P

6 comentarios en «The Path of the Samurai – Scapy (Parte 3)»

  1. Me encanta ver cómo cada grupo tiene su propia palabra: «Hacer pop», «hacer chocapic», «hacer catacrocker», «hacer catapum», «hacer plas»… ¿Estará relacionado con la cantidad de palabras que tenemos para «canuto»? Jajaja.
    Gran tuto. Ya me flipasteis con las diapos de la charla y todo lo que la amplíe es bienvenido.
    Gracias! Y felices fiestas!

    1. Mil Gracias! jejeje la verdad es que es la manera que me vino a la cabeza para explicarlo a una persona que no sabe nada o casi nada de nuestro mundillo y cada vez que le explico algo intento ser super claro para que sepa que tramo a diario jajajajja ;P

      1. Me encanta cómo lo llevas. No tengo ni idea de scapy y contigo me estoy poniendo al día.
        Esperamos atentos a la próxima entrega, tito Nebu :o)

  2. Una dudita: ¿El código de fuzzing TCP está bien? ¿Se invierten las IP en src y dst? De ser así: ¿Por qué?
    Gracias!

  3. Tengo un problema con el fuzz de ICMP. Declaro el siguiente parámetro:
    paqICMP=Ether(dst=»80:29:XX:XX:XX:XX»,src=»00:16:XX:XX:XX:XX»)/IP(dst=»192.168.0.1″,src=»192.168.0.12″)/fuzz(ICMP())

    Y al lanzarlo obtengo el siguiente error:
    Traceback (most recent call last):
    File «», line 1, in
    File «/usr/local/lib/python2.7/dist-packages/scapy/sendrecv.py», line 269, in send
    realtime=realtime, return_packets=return_packets)
    File «/usr/local/lib/python2.7/dist-packages/scapy/sendrecv.py», line 247, in __gen_send
    s.send(p)
    File «/usr/local/lib/python2.7/dist-packages/scapy/arch/linux.py», line 401, in send
    sx = str(ll(x))
    File «/usr/local/lib/python2.7/dist-packages/scapy/packet.py», line 277, in __str__
    return self.build()
    File «/usr/local/lib/python2.7/dist-packages/scapy/packet.py», line 354, in build
    p = self.do_build()
    File «/usr/local/lib/python2.7/dist-packages/scapy/packet.py», line 344, in do_build
    pay = self.do_build_payload()
    File «/usr/local/lib/python2.7/dist-packages/scapy/packet.py», line 336, in do_build_payload
    return self.payload.do_build()
    File «/usr/local/lib/python2.7/dist-packages/scapy/packet.py», line 344, in do_build
    pay = self.do_build_payload()
    File «/usr/local/lib/python2.7/dist-packages/scapy/packet.py», line 336, in do_build_payload
    return self.payload.do_build()
    File «/usr/local/lib/python2.7/dist-packages/scapy/packet.py», line 344, in do_build
    pay = self.do_build_payload()
    File «/usr/local/lib/python2.7/dist-packages/scapy/packet.py», line 336, in do_build_payload
    return self.payload.do_build()
    File «/usr/local/lib/python2.7/dist-packages/scapy/packet.py», line 341, in do_build
    pkt = self.self_build()
    File «/usr/local/lib/python2.7/dist-packages/scapy/packet.py», line 332, in self_build
    p = f.addfield(self, p, val)
    File «/usr/local/lib/python2.7/dist-packages/scapy/fields.py», line 147, in addfield
    return self.fld.addfield(pkt,s,val)
    File «/usr/local/lib/python2.7/dist-packages/scapy/fields.py», line 72, in addfield
    return s+struct.pack(self.fmt, self.i2m(pkt,val))
    error: ‘H’ format requires 0 <= number <= 65535

    ¿Es problema de mi host o hay algún error tipográfico?

Los comentarios están cerrados.