Home > C/C++, GNU/Linux, MiTM Replace, Programacion, Proyectos, Red, Seguridad, UNIX > MiTM Replace / Jugando entre capas

MiTM Replace / Jugando entre capas

En este post me gustaría presentaros una herramienta y dar algunos ejemplos para jugar un poco con los protocolos Ethernet y TCP/IPv4 (en adelante TCP), en concreto para hacer Ethernet Forwarding y modificar el payload de los segmentos TCP.

La herramienta en cuestión está disponible en https://github.com/sch3m4/mitmreplace.

Nota: De aquí en adelante supondremos que estamos trabajando sobre redes Ethernet.

Como es sabido, la tarea más básica de cualquier router que se precie, es el de interconectar distintas redes. Esta tarea se lleva a cabo (simplificando) cambiando la cabecera Ethernet (origen y destino) así como la cabecera IP, guardándo las “equivalencias” en una tabla en la memoria del dispositivo.

De manera casi similar funcionan los puentes de red, cuya tarea seŕia la de unir varias redes en una, pero sin realizar los cambios de ambas cabeceras (lo que sí hace un router).
La herramienta en cuestión realiza un “mix” entre estos dos modos de funcionamiento, actúa como un puente de red entre una o más redes, ofreciendo la posibilidad de manipular el payload de los segmentos TCP.

Q: ¿Un puente sobre una única red?
A: Sí, dependiendo de los entornos que veremos a continuación trabajaremos sobre una red o sobre dos.

La idea para poder realizar esto, es lanzar la herramienta sobre una red en la que controlemos el tráfico, ¿cómo lo conseguimos? Pues entre otras opciones, tenemos el envenenamiento ARP y montar un punto de acceso falso. Por ello, si hacemos envenenamiento ARP trabajaremos sobre una única red, y si optamos por montar el punto de acceso trabajaremos con dos redes.

Veamos una imagen para ver más claro cómo funciona la herramienta en cada uno de estos entornos:

Nota: Las siguiente imagen no se corresponde con una arquitectura de red real, solo pretende mostrar el flujo de datos.

En esta figura se puede ver el flujo de datos entre los PCs 4 y 5 siendo víctimas de un envenenamiento ARP por el PC 3, por lo que estos tres equipos están en el mismo segmento de red y solo disponen de una interfaz de red.

Es importante cuando ejecutemos la herramienta, desactivar el IP Forwarding en el sistema, ya que será la propia herramienta quien realice esta tarea. Otro detalle importante es que la herramienta no realiza NAT, por lo que debemos estar preparados para enrutar el tráfico sobre las IPs que a priori desconozcamos.

Si por el contrario hemos montado un punto de acceso (siendo nosotros el PC-3) tendremos dos interfaces, una interface por la que enrutar el tráfico de los clientes (modificado o no) y otra interface (Wireless) donde se conectarán los clientes.

Dicho esto, vamos a comenzar con algunos ejemplos sobre la herramienta en cada uno de estos entornos.

Lo primero como siempre, es descargarnos la herramienta:

$ git clone git://github.com/sch3m4/mitmreplace.git
Cloning into ‘mitmreplace’…
remote: Counting objects: 56, done.
remote: Compressing objects: 100% (43/43), done.
remote: Total 56 (delta 12), reused 55 (delta 11)
Receiving objects: 100% (56/56), 286.47 KiB | 117 KiB/s, done.
Resolving deltas: 100% (12/12), done.

A continuación entramos en el directorio y compilamos (necesitaremos las siguientes librerías: glib-2.0, xml2, pcap):

$ ./configure && make
checking for a BSD-compatible install… /usr/bin/install -c
(…)
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands
(CDPATH=”${ZSH_VERSION+.}:” && cd . && /bin/bash /home/sch3m4/mitmreplace/missing –run autoheader)
rm -f stamp-h1
touch config.h.in
cd . && /bin/bash ./config.status config.h
config.status: creating config.h
config.status: config.h is unchanged
make  all-recursive
make[1]: se ingresa al directorio `/home/sch3m4/mitmreplace’
Making all in src
make[2]: se ingresa al directorio `/home/sch3m4/mitmreplace/src’
gcc  -g -O2   -o mitmreplace mitmreplace-checksum.o mitmreplace-forward.o mitmreplace-main.o mitmreplace-patterns.o mitmreplace-replace.o  -lglib-2.0 -lpcap -lxml2 -lpthread
make[2]: se sale del directorio `/home/sch3m4/mitmreplace/src’
make[2]: se ingresa al directorio `/home/sch3m4/mitmreplace’
make[2]: se sale del directorio `/home/sch3m4/mitmreplace’
make[1]: se sale del directorio `/home/sch3m4/mitmreplace’

Y tendremos la herramienta lista para ser ejecutada:

Su uso es bastante intuitivo, los parámetros “ingw” y “outgw” corresponden a las direcciones MAC de los gateways legítimos tanto de entrada como de salida, para que el equipo que recibe los datos modificados “crea” que provienen del dispositivo legítimo.

El objetivo en este caso va a ser un dispositivo Android que visitará http://safetybits.net Y lanzaremos la herramienta de manera que reemplazará todas las coincidencias de “libntoh” por “l33t.0f”, este es el contenido legítimo que el objetivo visualizaría:

Para llevar a cabo este “ataque” la herramienta dispone de un archivo donde introduciremos los datos que queremos reemplazar. Este archivo es un XML donde especificaremos la cadena a encontrar y la cadena por la que será reemplazada. Si una de estas dos cadenas deben ser tratadas como datos binarios, debe indicarse mediante un atributo que pondremos a “1″ o “0″ en función de si alguna de las cadenas deben ser tratadas como datos binarios respectivamente, en cuyo caso las representaremos en hexadecimal.

El archivo en cuestión tiene el siguiente formato, y para este ejemplo no necesitaremos modificarlo pues ya tiene los reemplazos que necesitamos:

Como se puede ver, reemplazaremos “Acept-Encoding: gzip” por “Accept-Encoding: text” para poder acceder a la respuesta en bruto (sin comprimir). El siguiente patrón es el que realmente cambiará el texto que necesitamos.

Por lo tanto (como se aprecia en la imagen), debemos crear una entrada en este archivo siguiendo el formato estipulado por cada reemplazo que queramos realizar.

Lo primero que vamos a realizar es un envenenamiento ARP de un cliente (192.168.1.45), haciendo uso de arpspoof:

Lo siguiente (no necesariamente en este orden) es desactivar el IP Forwarding, para ello usamos sysctl:

Con nuestro escenario preparado, solo necesitamos lanzar la herramienta indicándole la puerta de enlace legítima y la interfaz que vamos a utilizar:

A partir de ahora, será la herramienta quien realice el forwarding para mantener el acceso a la red del objetivo, y cada vez que encuentre un segmento TCP en el que exista alguna coincidencia con los datos especificados a través del fichero XML, lo sustituirá y enviará el segmento de vuelta a la red, causando el siguiente salida y efecto en el cliente:

Ha de quedar claro que la herramienta “no entiende” de protocolos de aplicación, el reemplazo solo se realiza en segmentos TCP, y como probáblemente más de uno se ha dado cuenta, las cadenas “libntoh” y “l33t.0f” tienen la misma longitud, ¿Por qué? La respuesta es bastante simple, si intentamos reemplazar “aabbcc” por “ABC” el resultado será “ABCbcc”. Esto es así, por la limitación del MSS, ya que de sobrepasarlo habría que enviar otro segmento TCP, y de cualquier modo, si modificamos la longitud del segmento, habría que ajustar el número de secuencia en dicho punto de la conexión, lo que desestabilizaría la conexión ya que no estamos haciendo de proxy a nivel TCP.

Con esto ya podemos “jugar” cambiando URLs de javascripts, imágenes, PDFs, binarios, “https://” por ” http://” (fíjate que hay un espacio ;-) ), etc.

Artículos Relacionados

  1. No comments yet.
  1. No trackbacks yet.