Banner 1

Envenenamiento ARP con scapy

ARP


El ARP (address Resolution Protocol), es el encargado de convertir direcciones IP a direcciones fisicas llamadas MAC (Medium Access Control address) en una red Ethernet. Ya que las maquinas en una red fisica, se pueden comunicar unicamente si conocen sus direcciones fisicas de red , este protocolo se encarga de la transformacion de direcciones, permitiendo de esta forma que cuando en una red local el usuario de la maquina A desee establecer una comunicación con la maquina B, solo tenga que indicar a la aplicación ej. Telnet la direccion ip de la maquina B.

¿Que procedimiento sigue A para saber la direcciòn fisica de B?, A envia un paquete (peticion ARP) a todas las maquinas de la red local, el paquete contiene entre otras cosas la direccion ip de B, todas las maquinas reciben el paquete, pero solo contesta la que reconoce su ip en la peticion ARP, en este caso B responde enviando directamente un paquete (respuesta ARP ) a A con su direccion fisica.




Tablas ARP

Para no tener que estar enviando paquetes de peticion ARP cada vez que quieran comunicarse, las computadoras que utilizan ARP mantienen una memoria intermedia donde guardan la direccion ip y la direccion fisica de las maquinas con las que se han comunicado, esta informacion es actualizada cada cierto tiempo (el tiempo de actualizacion depende del sistema operativo). Una tabla ARP se puede mostrar de la siguiente forma:




Scapy

Scapy es un programa interactivo escrito en python que sirve para manipular paquetes de red, si se utiliza Debian o Ubuntu este viene incluido en los repositorios y se puede instalar con apt-get install scapy, en otro caso se puede bajar de su pagina oficial http://www.secdev.org/projects/scapy/ para windows, ademas ofrecen guias de instalacion para Mac OS X 10.4, FreeBSD, OpenBSD 3.8. La guia de instalacion para windows se puede encontrar en http://trac.secdev.org/scapy/wiki/WindowsInstallationGuide.





Podemos ver todas las capas de protocolos soportados por scapy con el comando ls()

>>>ls()

ARP : ARP

ASN1_Packet : None

BOOTP : BOOTP

CookedLinux : cooked linux

DHCP : DHCP options

DNS : DNS

[...]




Para listar los campos que tiene ARP colocamos:

>>>ls (ARP)

hwtype : XShortField = (1)

ptype : XShortEnumField = (2048)

hwlen : ByteField = (6)

plen : ByteField = (4)

op : ShortEnumField = (1)

hwsrc : ARPSourceMACField = (None)

psrc : SourceIPField = (None)

hwdst : MACField = ('00:00:00:00:00:00')

pdst : IPField = ('0.0.0.0')




Iniciando el Envenenamiento ARP: En este caso se trata de hacer creer a Azul que nosotros somos el Punto de Acceso, y de esta forma impedirle conectarse a internet. Aqui pueden ver el esquema de red utilizado:




Delenn se conecta con su tarjeta de red inalambrica, Azul (victima, o.s.=windows) se conecta por cable y el modem provee conexion a internet al router inalambrico.

Con el fin de poder ver que sucede cuando se hace un envenenamiento ARP, esta es la salida del comando arp -a en Azul antes de:




En la imagen anterior podemos ver que Azul tiene en su tabla ARP la direccion IP y la direccion fisica del router inalambrico.




Bueno volviendo con scapy, necesitamos indicarle los parametros necesarios para construir el paquete ARP que sera enviado a Azul y lo hacemos de la siguiente forma:

>>>s=ARP (op="who-has", psrc= "192.168.2.1", pdst="192.168.2.3", hwdst="00:1e:d7:e2:d1:dc")

En la expresion anterior le estamos asignando a la variable s el paquete ARP. Pasando a describir cada uno de los parametros quedaria de la siguiente forma:

op= En scapy una peticion ARP es representada por “who-has” y una respuesta ARP por “is-at”

psrc= Le indicamos quien es el que envia el paquete, en este caso colocamos que es el router inalambrico y no nosotros (Delenn).

pdst= Le indicamos que el paquete serà dirigido a Azul que tiene la ip 192.168.2.3

hwdst= Le indicamos la direccion fisica a la que Azul debe enviar sus paquetes (Direccion fisica de Delenn, aunque puede ser cualquiera).

La conversacion entre Delenn y Azul seria de la siguiente manera:

Vea 192.168.2.3 esta es mi direccion fisica 00:1e:d7:e2:d1:dc (verdad) y yo soy 192.168.2.1 (mentira). Entonces 192.168.2.3 que es Azul actualiza su tabla ARP y cambia la Direccion fisica de 192.168.2.1 que es el router inalambrico por la de Delenn.

Si queremos ver todo el contenido del paquete ARP que sera enviado colocamos:

>>>ls(s)

hwtype : XShortField = 1 (1)

ptype : XShortEnumField = 2048 (2048)

hwlen : ByteField = 6 (6)

plen : ByteField = 4 (4)

op : ShortEnumField = 1 (1)

hwsrc : ARPSourceMACField = '00:1e:d7:e2:d1:dc' (None)

psrc : SourceIPField = '192.168.2.1' (None)

hwdst : MACField = '00:1e:d7:e2:d1:dc' ('00:00:00:00:00:00')

pdst : IPField = '192.168.2.3' ('0.0.0.0')

Ahora solo tenemos que enviar el paquete ARP de la sigiente forma:

>>>send(s, inter=3, loop=1)

Con esto le estamos diciendo a scapy que envie el paquete s cada 3 segundos y esto se repite hasta que terminemos el proceso con Control+C . La razon por la cual ponemos a enviar el paquete en un ciclo infinito (loop=1), es para no darle tiempo a Azul de renovar su Tabla ARP con valores reales.

Si queremos que Scapy solo envie un paquete colocamos:

>>>send(s)




Ahora si ejecutamos de nuevo el comando arp -a en Azul obtenemos:




¿Que paso?, Bueno como muestra la imagen despues de que enviamos los paquetes con scapy, la tabla ARP de Azul ha cambiado, ahora aparece Delenn con su ip y su direccion fisica, hasta ahi todo bien, ya que a diferencia de la primera imagen Azul y Delenn han necesitado comunicarse entonces Azul ha incluido a Delenn en su tabla ARP, ahora si nos fijamos en la direccion fisica del router inalambrico, nos podemos dar cuenta que es la misma direccion fisica de Delenn, esto es envenenamiento ARP en funcionamiento, si intentamos acceder a internet desde Azul veremos que no se puede ya que este necesita conectarse con el router inalambrico por medio de su direccion fisica, pero tiene tiene es la direccion fisica de Delenn. Si dejamos que scapy siga enviando paquetes , Azul no va a poder conectarse a internet y despues de un tiempo se pondra morado ;)P.

Podemos obtener el mismo resultado si utilizamos la funcion predefinida por scapy para envenenamiento ARP llamada arpcachepoison() :

>>>arpcachepoinson(“192.168.2.3”, “192.168.2.1”,2)

Con lo anterior se envian los paquetes ARP cada 2 segundos, y Azul cambia la direccion fisica del Punto de Acceso en su tabla Arp por la direccion fisica de la maquina desde la cual se estan enviando realmente los paquetes.


Fuente:http://www.mirphakblog.com.ar/?q=node/22

No hay comentarios:

Powered by Bad Robot
Helped by Blackubay