Una PoC con Scapy para hacer un ICMP Redirect y el ataque MitM del pasado
Aprovechando que ayer anunciamos ya que está disponible nuestro libro de Ataques en Redes de Datos IPv4 & IPv6 (4ª Edición), hoy vamos a hacer algo hacking de redes. En el artículo de hoy vamos a hablar del conocidísimo ICMP Redirect, del que ya muchos sabéis que se puede utilizar para hacer un ataque de red. Podemos decir que es un poco ‘antiguo’ o que a día de hoy no afectará a la mayoría de sistemas que encontremos en un Ethical Hacking, porque vendrá deshabilitado por defecto. Y cierto es, en muchos sitios no lo encontraremos habilitado porque está deshabilitada la opción de aceptar redirecciones ICMP, pero...
En "El lado del mal" ya hemos hablado de Scapy y su potencia junto a NetfilterQueue para hacer manipulación de paquetes al vuelo u ‘on the fly’. Scapy y NetfilterQueue es una forma de poner en práctica y aprender mucho sobre cómo funcionan los protocolos que forman parte de la pila TCP/IP, por lo que recomendamos que le echéis un ojo para poner en práctica toda la teoría que os puedan dar sobre TCP/IP.
El artículo tiene un enfoque didáctico de enseñar en qué consiste el ataque y no de ponerlo en valor hoy en día, ya que, como he comentado, seguramente no puedas usarlo en un pentesting. Aunque como todo en la vida, podemos encontrar cualquier cosa en una empresa y cualquier tipo de configuración. Configuraciones heredadas, "legacy" o cómo queramos llamarla, por lo que nunca está de más conocer posibilidades en lo que ataques de tipo ‘Man in the Middle’ se refiere. Si observamos lo que dice evilsocket, creador de Bettercap, quizá una de las herramientas de ataques de red modernos más potente, el ICMP redirect es difícil de encontrar, pero todo puede ocurrir.
Nosotros para este artículo vamos a montar un pequeño escenario y queremos explicar la parte más didáctica. Para ello utilizaremos lo siguiente:
A diferencia del ARP Spoofing, en el caso del ICMP Redirect podemos indicar ciertos paquetes o conexiones que deben ser enviadas por un router o por otro. Al final, el ARP Spoofing es más sencillo, pero también generamos más ruido. En ICMP Redirect, con un solo paquete para indicar la redirección podemos estar bastante tiempo con la ruta “envenenada”. Es un riesgo alto. Por ello, debemos conocer algunos conceptos previos en la máquina víctima, observando el fichero /etc/sysctl.conf o desde la ruta /proc/sys/net/ipv4/conf/all/*. Por ejemplo:
Figura 1: Una PoC con Scapy para hacer un
ICMP Redirect y el ataque MitM del pasado
En "El lado del mal" ya hemos hablado de Scapy y su potencia junto a NetfilterQueue para hacer manipulación de paquetes al vuelo u ‘on the fly’. Scapy y NetfilterQueue es una forma de poner en práctica y aprender mucho sobre cómo funcionan los protocolos que forman parte de la pila TCP/IP, por lo que recomendamos que le echéis un ojo para poner en práctica toda la teoría que os puedan dar sobre TCP/IP.
Figura 2: Ataques en redes de datos IPv4&IPv6 (4ª Edición) de
JL. Rambla, ampliado y revisado por Pablo González y Chema Alonso
Figura 3: Debate sobre ICMP Redirect
Nosotros para este artículo vamos a montar un pequeño escenario y queremos explicar la parte más didáctica. Para ello utilizaremos lo siguiente:
- Máquina atacante: Una Kali Linux 2020, por ejemplo. Lo importante va a ser que tenga Scapy instalado.
- Máquina víctima: Una máquina con Ubuntu GNU/Linux de cualquier versión.
- Red: La red tendrá salida a Internet.
Figura 4: Pentesting con Kali Silver Edition |
- net.ipv4.conf.all.accepts_redirects: Esto tiene que estar a 0, si está a 1 la máquina no aceptará redirecciones por ICMP.
- net.ipv4.conf.all.secure_redirects: Esto estará a 1. Esto quiere decir que una redirección solo será aceptada si viene una dirección de la lista. Es decir, validación de quién pide la redirección.
- En sistemas Microsoft Windows existen claves de registro para verificar esto.
Por la parte del atacante, solo debemos activar el forward en /proc/sys/net/ipv4/ip_forward o en el fichero /etc/sysctl.conf si lo queremos dejar persistente. Es recomendable verificar que no hacemos send_redirects a nivel de kernel, esto se puede verificar en el fichero /etc/sysctl.conf.
Montando el código en Scapy
Para mostrar un ejemplo sencillo de esta implementación, se utilizará Scapy para generar el paquete y poder enviar el ICMP de redirección. Una manera sencilla de verlo será a través del uso del intérprete de Python, que tanto utilizamos los pentesters.
La primera capa que vamos a construir es el datagrama IP. Para ello, solo indicaremos la dirección IP origen y la dirección IP destino. Todos los campos necesarios para que el datagrama tenga sentido, serán gestionados por Scapy. Si nos fijamos en la imagen, la dirección IP origen será la del router al que queremos “suplantar”. La dirección IP destino será la de la máquina víctima, en este caso, nuestro Ubuntu.
Una vez hemos creado la capa IP y almacenado en una variable, vamos a generar la capa ICMP y la almacenaremos en una variable denominada icmp. La instrucción ICMP(type=X, code=Y) nos permite generar un paquete ICMP de tipo 5, en este caso, el cual indicará el redirect. Se puede ver en la imagen algunos de los tipos de paquetes en ICMP. Son más de los que en un principio seguro pensabas que habría en este protocolo, pero hay que pensar que ICMP es Internet Control Message Protocol, por lo que es un protocolo más importante que utilizarle solo para un ‘ping’.
Bien, después hacemos un icmp.gw = “my-ip”. Asignando mi IP como nuevo Gateway en la notificación del protocolo ICMP. Y ahora viene lo divertido, dentro del ICMP encapsularemos el tipo de peticiones que queremos que la víctima nos reenvíe a nosotros. Es decir, si queremos que cuando la víctima haga un ping (ICMP de tipo 8) a una dirección IP en Internet nos lo envíe a nosotros en vez de al router original necesitamos indicárselo, ¿cómo?
Para este ejemplo, generamos un paquete con la primera capa IP y la capa ICMP que definimos anteriormente. Después, dentro del ICMP de redirección le metemos una segunda capa IP dónde le decimos a la máquina Ubuntu que cuando haga ‘match’ la IP origen y destino del datagrama tendrá que enviarlo a nosotros y, además, sea un ICMP de tipo 8, lo que esté encapsulado dentro de ese datagrama IP. Parece lioso, pero es sencillo.
Una vez preparado, utilizamos la instrucción send(packet) para enviar un paquete, según el código presentado antes sería send(p). A la función send la podemos meter en bucle con send(p, loop=1, interval=1), haciendo que cada segundo se envíe un paquete. En la imagen anterior de Wireshark, desde nuestra Kali Linux, podemos ver cómo el mensaje ICMP nos está llegando a nosotros y podemos ver el ping que se hace desde Ubuntu al servidor en Internet. Tenemos funcionando el Man in the Middle.
Otro apunte por el que podemos ver que nos han ‘envenenado el enrutamiento’ es mediante el uso del comando ip route get [dirección IP]. Como se puede ver en la imagen anterior podemos ver fácilmente que nos han modificado el enrutamiento. Y por tanto estamos sufriendo un ataque. Para evitar este ataque, nuestra máquina GNU/Linux debería estar fortificada, y así evitaríamos que estos esquemas nos pudieran afectar.
Sin duda, cuando trabajamos con protocolos y ataques de red en un Ethical Hacking o en un forense es importante conocer los detalles que hay por debajo, para poder trabajar de forma más eficiente y más potente. Limitarse a ejecutar una herramienta automática está bien, sobretodo cuando se conoce lo que ocurre por detrás. Espero que el artículo didáctico de hoy os llame la atención para ponerse con Scapy a jugar y ver sus posibilidades.
Montando el código en Scapy
Para mostrar un ejemplo sencillo de esta implementación, se utilizará Scapy para generar el paquete y poder enviar el ICMP de redirección. Una manera sencilla de verlo será a través del uso del intérprete de Python, que tanto utilizamos los pentesters.
Figura 5: Libro de Python para Pentesters 2ª Edición en 0xWord
escrito por Daniel Echeverry Montoy "Adastra".
Figura 6: Construcción del datagrama IP en Scapy
Una vez hemos creado la capa IP y almacenado en una variable, vamos a generar la capa ICMP y la almacenaremos en una variable denominada icmp. La instrucción ICMP(type=X, code=Y) nos permite generar un paquete ICMP de tipo 5, en este caso, el cual indicará el redirect. Se puede ver en la imagen algunos de los tipos de paquetes en ICMP. Son más de los que en un principio seguro pensabas que habría en este protocolo, pero hay que pensar que ICMP es Internet Control Message Protocol, por lo que es un protocolo más importante que utilizarle solo para un ‘ping’.
Figura 7: Vamos al RFC de Tipo 5 Redirect
Bien, después hacemos un icmp.gw = “my-ip”. Asignando mi IP como nuevo Gateway en la notificación del protocolo ICMP. Y ahora viene lo divertido, dentro del ICMP encapsularemos el tipo de peticiones que queremos que la víctima nos reenvíe a nosotros. Es decir, si queremos que cuando la víctima haga un ping (ICMP de tipo 8) a una dirección IP en Internet nos lo envíe a nosotros en vez de al router original necesitamos indicárselo, ¿cómo?
Lo primero es crear una segunda capa IP que irá encapsulada en el ICMP de redirección. En esa capa IP indicamos cuál sería la dirección IP origen de la petición y cuál sería la dirección IP destino de dicha petición. En el caso de que ambas direcciones IP coincidan, se nos enviará a nosotros, pero podemos hilar más fino. Podemos añadir otra capa como, por ejemplo, aparte de controlar la IP origen y destino del paquete, si encima de dicho paquete es ICMP, UDP o TCP lo que se envía. Esto es muy interesante.
Figura 8: Direcciones montadas
Para este ejemplo, generamos un paquete con la primera capa IP y la capa ICMP que definimos anteriormente. Después, dentro del ICMP de redirección le metemos una segunda capa IP dónde le decimos a la máquina Ubuntu que cuando haga ‘match’ la IP origen y destino del datagrama tendrá que enviarlo a nosotros y, además, sea un ICMP de tipo 8, lo que esté encapsulado dentro de ese datagrama IP. Parece lioso, pero es sencillo.
Figura 9: Captura de la PoC en Wireshask
Una vez preparado, utilizamos la instrucción send(packet) para enviar un paquete, según el código presentado antes sería send(p). A la función send la podemos meter en bucle con send(p, loop=1, interval=1), haciendo que cada segundo se envíe un paquete. En la imagen anterior de Wireshark, desde nuestra Kali Linux, podemos ver cómo el mensaje ICMP nos está llegando a nosotros y podemos ver el ping que se hace desde Ubuntu al servidor en Internet. Tenemos funcionando el Man in the Middle.
Figura 10: MitM up & running
Otro apunte por el que podemos ver que nos han ‘envenenado el enrutamiento’ es mediante el uso del comando ip route get [dirección IP]. Como se puede ver en la imagen anterior podemos ver fácilmente que nos han modificado el enrutamiento. Y por tanto estamos sufriendo un ataque. Para evitar este ataque, nuestra máquina GNU/Linux debería estar fortificada, y así evitaríamos que estos esquemas nos pudieran afectar.
(Revisada y Ampliada) de Carlos Álvarez y Pablo González en 0xWord
Saludos,
Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters: Gold Edition", "Hacking con Metasploit: Advanced Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root", “Pentesting con Powershell (2ª Edición)”, "Pentesting con Kali Silver Edition" y de "Empire: Hacking Avanzado en el Red Team", Microsoft MVP en Seguridad y Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica. Para consultas puedes usar el Buzón Público para contactar con Pablo González - Conseguir 100 Tempos Gratis en MyPublicInbox
Contactar con Pablo González |
No hay comentarios:
Publicar un comentario