Man in the middle: cómo generar tu propio proxy

Este post surge de la frustración que muchas veces he sentido cuando he tenido que debuggear algo (normalmente una app) con una herramienta como Charles. ¿Por qué no veo las trazas? ¿Por qué me quedo sin internet? ¿Por qué estoy viendo la navegación de mi vecino?

Para solucionar este problema estuve investigando para entender si podía utilizar alguna otra solución que me permitiera almacenar las trazas de lo que estaba generando con mi sesión en algún archivo, por ejemplo un csv. Así llegué a Mitmproxy.

Mitmproxy es una herramienta de proxy que se utiliza para interceptar el tráfico HTTP entre un cliente y un servidor. Esto significa que puede leer y modificar la información que se envía entre ambas partes. Además, es compatible con una variedad de sistemas operativos, incluyendo Windows, Linux y MacOS. Algo como esto:

Fuente: https://surfshark.com/es/blog/proxy-server

En este artículo, vamos a aprender juntos cómo utilizar el script mitmproxy para interceptar y analizar el tráfico HTTP generado por sistemas de análisis de datos como Google Analytics y Tealium. También exploraremos cómo este script puede ayudarte a solucionar problemas en estos sistemas.

El problema

Lo más normal es que estés trabajando en una app que utiliza por ejemplo Google Analytics para recopilar datos sobre los usuarios. Sin embargo, auditar algunos de los problemas recientes que estás viendo resulta cada vez más complicado. ¿Cómo puedes saber cuál es el problema?

Si bien es cierto que podríamos utilizar el DebugView de Firebase para esta tarea, muchas veces la opción no está disponible (problemas con iOS, framework diferente…). Como ya hemos visto, una alternativa de abordar este problema es utilizando el script mitmproxy. Al interceptar el tráfico HTTP entre el cliente y el servidor, podemos ver exactamente qué datos se están enviando. Esto nos permite identificar fácilmente los problemas y solucionarlos de manera efectiva. Eso sí, no nos quedaremos sólo con lo que nos da mitm, sino que lo traduciremos y lo almacenaremos en un csv.

La solución

Para utilizar el script mitmproxy, primero debemos instalarlo en nuestra máquina. Para hacer esto, necesitaremos utilizar la línea de comandos. Primero, debemos instalar el paquete mitmproxy utilizando un administrador de paquetes. A mí me ha funcionado mejor brew, pero debería poderse hacer igualmente con pip. Para hacer esto, abrimos una ventana de terminal y escribimos el siguiente comando:

brew install mitmproxy

Una vez que se haya instalado mitmproxy, podemos comenzar a utilizarlo para interceptar el tráfico HTTP.

El repositorio

En el repositorio que os adjunto aquí encontraréis la solución que he planteado (un script que recoja las trazas de google analytics o tealium y las recoja en un csv) y que funciona como una POC (aquí cada uno es libre de utilizar este código, ampliarlo o modificarlo)

Para lanzar el script que va a empezar a captar las trazas con las que trabajamos, tendremos que utilizar la feature de mitmdump de la siguiente manera:

mitmdump -s mitm_ae.py

Cuando visitamos un sitio web, mitmproxy interceptará todas las solicitudes entrantes y salientes, incluyendo aquellas que contienen datos relacionados con el sistema de seguimiento que estamos depurando. El script analiza estas solicitudes y, si corresponden con el sistema de seguimiento que hemos indicado, los datos relevantes se escriben en un archivo .csv. Aquí podéis ver el script completo:

import csv
from mitmproxy import http
from urllib.parse import urlparse


session = input('qué nombre quieres darle a tu sesión? ')
system = input('qué sistema vas a debuggear? (google analytics, tealium) ')

if system == 'google analytics':
    #google analytics
    def response(flow: http.HTTPFlow):
        u = urlparse(flow.request.url)
        if u.netloc == 'www.google-analytics.com':
            print('GOOGLE ANALYTICS')
            with open('session_{}.csv'.format(session), mode='a') as session_user:
                session_writer = csv.writer(session_user, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)
                session_writer.writerow([u.query])

elif system == 'tealium':
    #tealium
    def response(flow: http.HTTPFlow):
        u = urlparse(flow.request.url)
        if u.netloc == 'collect-eu-central-1.tealiumiq.com':
            with open('session_{}.csv'.format(session), mode='a') as session_user:
                session_writer = csv.writer(session_user, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)
                session_writer.writerow([flow.request.content])

En nuestro script, primero se le pedirá al usuario que proporcione un nombre para la sesión actual y el sistema que se está depurando. Luego, la función response() se define para que se ejecute cada vez que se reciba una respuesta HTTP de un servidor remoto. Esta función analiza la URL de la solicitud entrante y determina si corresponde con el sistema de seguimiento que estamos depurando. Si es así, se escriben los datos relevantes en un archivo .csv que contiene el nombre de la sesión que proporcionamos anteriormente.

Los resultados que se escriben en el csv son algo parecido a esto:

Aunque muy en bruto, estas trazas ya nos pueden servir para determinar si lo que estamos auditando es correcto. La limpieza y formateo de esto sería el siguiente paso imaginable.

La configuración

Para utilizar el script mitmproxy, primero debemos darle las especificaciones técnicas necesarias al dispositivo para que mitmproxy pueda actuar como un proxy. Por tanto, lo que tenemos que hacer es lo siguiente:

En ordenador:

Abrir la configuración de proxies en nuestro ordenador y cambiarla a la por defecto de mitm (127.0.0.1 y 8080)

En móvil:

Si estamos trabajando con un móvil tendremos que configurar nuestro proxy para que cuadre con la dirección de nuestro wifi y cambiaremos el puerto a 8080. Abriremos mitmproxy desde terminal y en el móvil iremos a la dirección mitm.it

Cuando estemos en esa web nos descargaremos e instalaremos el certificado adecuado a nuestro sistema operativo.

Conclusiones

En resumen, hemos aprendido cómo depurar los sistemas de seguimiento web utilizando mitmproxy y un simple script de Python. mitmproxy es una herramienta poderosa que nos permite interceptar el tráfico web y analizarlo en tiempo real, lo que puede ser extremadamente útil para depurar problemas relacionados con el seguimiento y la analítica web.

Con el script que hemos creado, podemos depurar fácilmente sistemas de seguimiento web populares, como Google Analytics, Tealium y otros, y almacenar los datos relevantes en un archivo .csv para su posterior análisis.

Espero que os haya resultado útil y, por supuesto, espero leer vuestras dudas o sugerencias en comentarios!

Deja un comentario