miércoles, febrero 17, 2021

Ataques en redes IPv4&IPv6: Network Packet Manipulation con Scapy y NetfilterQueue

En el blog ya hemos hablado de la técnica Network Packet Manipulation o manipulación de paquetes de red, por ejemplo, en el artículo Owneando MySQL con Network Packet Manipulation o Hackear un Wordpress con Network Packet Manipulation. También hemos hablado de cómo fortificar un Wordpress u otros entornos a través de certificados y evitar así la manipulación de paquetes. Incluso, hubo un TFM donde se implementó un Joomla! in Paranoid Mode para evitar, entre otros ataques, el Network Packet Manipulation sobre este CMS.

Figura 1: Ataques en redes IPv4&IPv6: Network Packet Manipulation
con Scapy y NetfilterQueue

La herramienta utilizada para llevar a cabo el ataque era Ettercap y los filtros que ésta proporciona. Los filtros de Ettercap se programaban y se compilaban a través de la herramienta Etterfilter, obteniendo un fichero resultado que, posteriormente, había que pasarle a Ettercap mediante la opción ‘-F’, permitía hacer manipulación de paquetes, aunque si lo comparamos con Scapy y lo que vamos a ver hoy, no es comparable, ya que Scapy y la librería Netfilter NFQueue proporcionan un conjunto bastante potente que permite ‘tocar’ lo que queramos a diferentes capas dentro de la pila TCP/IP y hacer muchos ataques en redes tanto IPv4 como IPv6.
Tiempo atrás, nuestro antiguo compañero Santiago Hernández publicó una herramienta denominada Polymorph y que permitía la modificación de paquetes al vuelo u ‘on the fly’. Una herramienta muy interesante que permite automatizar y facilitar la manipulación de paquetes. La herramienta está escrita en Python y hay varios ejemplos sobre modificación de paquetes en diferentes protocolos.


Hoy hablaremos de cómo escribir un pequeño script para, utilizando Scapy y la librería netfilterqueue, poder modificar peticiones de MySQL. Por ejemplo, cambiar un SELECT * from tabla1 por un SELECT * FROM tabla2 o por un INSERT, UPDATE o DELETE. Realmente podríamos manipular la consulta como queramos, como ya se vio en el pasado con Ettercap.

Configurando el entorno de la prueba

Lo primero es montar el entorno y especificar qué es lo que vamos a hacer. A continuación, os dejo las máquinas que vamos a utilizar:
 
- Máquina Víctima 1: Máquina Ubuntu con un base de datos MySQL. 
 
- Máquina Víctima 2: Máquina Windows (cualquier) con un cliente de base de datos llamado HeidiSQL (realmente, valdría con cualquier aplicación que haga consultas contra la base de datos de MySQL). 
 
- Máquina atacante: Nos pondremos un Kali Linux, aunque se podría hacer en cualquier Linux fácilmente. Utilizaremos iptables, scapy y netfilterqueue.
 
Tal y como está montado el entorno, cuando el Windows se conecte contra la base de datos que está en el Ubuntu, realizaremos una consulta a la base de datos y veríamos la respuesta esperada. Es decir, si hacemos una SELECT * from textos, veríamos el contenido de la tabla textos.

Figura 4: Select * from textos;

Para que el tráfico pase por la máquina de Kali Linux donde lanzaremos el script que generaremos, debemos utilizar una herramienta que nos permita hacer ARP Spoofing. Por ejemplo, utilizaremos arpspoof para spoofear la caché ARP de la máquina Ubuntu y de la Windows. Vamos, el Level 1 de los ataques de redes IPv4 En este caso, la sintaxis sería:

arpspoof -i [interfaz de red] -t [IP Ubuntu] [IP Windows]

Para hacer el envenenamiento de la caché bi-direccional, ejecutaríamos la instrucción anterior también de esta forma:

arpspoof -i [interfaz de red] -t [IP Windows] [IP Ubuntu]

Debemos recordar que tenemos que activar el forwarding en la máquina Kali Linux, eso lo encontraremos en este fichero /proc/sys/net/ipv4/ip_forward. Ponemos el dato a 1 y listo. Por último, y aquí es donde entra NFQUEUE, debemos generar una regla de iptables para que el tráfico que pase por la máquina Kali Linux, y en este caso no vaya dirigida a la máquina Kali Linux, se redirija a NFQUEUE. Esto es un sistema de colas de red que permite a diferentes aplicaciones poder analizar el tráfico que llega. Para ello ejecutamos la siguiente instrucción:

iptables -A FORWARD -j NFQUEUE --nfqueue-num [num]

El valor de num puede ser de 0 en adelante. Si ponemos algún valor diferente a 0, deberemos tenerlo en cuenta para el código de Python que escribiremos.


Ahora que tenemos todo listo, debemos instalar scapy y netfilterqueue. Esto puede será sencillo con pip, pero puede que haya algún problema con netfilterqueue. Por ello, hay que garantizar que tenemos instalado algunos paquetes. Ejecutamos apt-get install build-essential python-dev libnetfilter-queue-dev. Si hubiera algún problema más, deberíamos tirar del código fuente del proyecto netfilterqueue e instalarlo a mano.


Una vez tenemos todo listo, vamos empezar por un código sencillo. En el main del script podemos ejecutar esto:
 
nfqueue = NetfilterQueue()
nfqueue.bind(1, modify)
try:
print ("[*] waiting for data")
nfqueue.run()
except KeyboardInterrupt:
pass
nfqueue.unbind()

Si nos fijamos crea un objeto de tipo NetfilterQueue(). Si miramos se hace un bind a la cola número 1, es decir, en la regla de iptables anterior la opción --queue-num debería valer 1. Si miramos la instrucción nfqueue.bind se le pasa un valor denominado ‘modify’ esto a punta a una función que veremos después. Cuando llegan los paquetes a nuestro script a través de la cola a la que iptables redirige el tráfico, todos los paquetes serán pasados a la función ‘modify’ para su análisis y/o modificación. Hay que recordar que debemos meter el import de scapy y netfilter de la siguiente manera:

from scapy.all import *
from netfilterqueue import NetfilterQueue

Ahora vamos a analizar un poco la función modify. Si miramos la definición de la función y la primera instrucción vemos alguna cosa de interés:

def modify(packet):
pkt = IP(packet.get_payload())

El término packet es el paquete que ha llegado por red y que se ha metido en la cola de NFQUEUE. Nuestro script, gracias a la librería netfilternfqueue puede obtener el paquete y poder analizarlo. Creamos una variable pkt para poder manipular lo que queramos. Es una copia del paquete, desde el nivel IP en adelante. Es decir, packet.get_payload() nos permite obtener los datos del paquete y con el prefijo IP() nos quedamos con la capa IP en adelante.

Figura 7: Obtención del paquete y reemplazo

Nuestro objeto pkt tiene una capa TCP (solo nos interesa esos paquetes), sino la tiene aceptaríamos el paquete sin más. Se consulta si tiene capa TCP y si el puerto destino de la petición va al puerto 3306, que es el puerto de MySQL. El método show() es interesante para poder debuggear lo que hay en cada capa de cada paquete.

Figura 8: Debuggeando el acceso al paquete con print

En este caso, una vez se modifica el campo que se buscaba, se re-calculan los checksum del paquete. Esto es importante, ya que si no, no nos funcionará. Por último, copiamos nuestro pkt modificado al ‘packet’ original. Si nos fijamos en la instrucción packet.accept() está fuera del ‘if’ o del match con las condiciones que buscábamos. Es decir, como todos los paquetes pasan por este script, solo analizamos en busca de modificación los que cuadran con las condiciones, y los que no directamente se aceptan y se reenvían tal cual.

Figura 9: Pentesting con Kali Silver Edition

Ahora vamos a probar la ejecución del script en nuestro entorno. Como se puede ver en nuestra máquina Kali Linux se detectan diferentes cosas y se modifica la consulta original por una nueva.

Figura 10: Funcionamiento del script en nuestro Kali Linux

Si vemos con HeidiSQL el resultado obtenido que podemos ver en la imagen superior que se ha obtenido un resultado diferente al que obtuvimos al principio, y así queda en la base de datos.

Figura 11: Resultado en la base de datos

Es un ejercicio interesante para un pentester que necesita tener flexibilidad y poder disponer de scripts o herramientas para las auditorías de sistemas y redes. Sin duda, Scapy y NetfileterQueue dan mucha potencia a cualquier cosa que se requiera en un Ethical Hacking en tema de redes. Con ello se pueden generar un gran número de herramientas. Muy interesante.

No hay comentarios:

Publicar un comentario