Ingeniería Inversa & Seguridad

Cuando Intenté Hackear una App y la App Me Hackeó a Mí

La historia de cómo un simple "voy a hacer un bot para no usar esta app tan lenta" se convirtió en una semana de guerra psicológica contra defensas anti-bot que no sabía que existían.

Todo empezó con una estupidez

Tenía esta app de fidelidad de una cadena de retail que era lentísima. Cada vez que quería ver mis puntos o cupones tardaba una eternidad en cargar, y pensé: "Joder, seguro que esto es solo una llamada a una API, ¿no?"

Spoiler: Sí era solo una llamada a una API, pero justo cuando me puse a hacerlo Salesforce chapó esa página que necesitaba, así que fui a por el apk. Era como abrir una caja fuerte que tenía otra caja fuerte dentro, que tenía otra caja fuerte dentro, que tenía un post-it diciendo "jódete".

7 Días De Puro Sufrimiento
8+ Herramientas Rotas
Ganas de Tirar el Ordenador

Las armas que usé (y las que me traicionaron)

Python y Aiogram Mi combo de confianza para hacer bots de Telegram. Al menos esto no me falló.
Frida La joya de la corona para joder apps en tiempo real. Sin esto no hubiera podido hacer nada.
Playwright Para automatizar el navegador cuando todo lo demás falló. Medio roto en Mac, pero funcionó en Windows.
Burp Suite Para espiar el tráfico como un acosador digital. Imprescindible para ver qué coño está pasando.
iptables Cuando la app se hace la lista y evita tu proxy, la fuerzas a nivel de red. Hardcore pero efectivo.
Docker Lo exploré por si acaso funcionaba, pero al final no lo necesité tanto como pensaba.
ADB y Emuladores Para trastear con Android sin joder mi móvil personal. Menos mal que existe.
JADX-GUI Para descompilar el APK y buscar pistas. Como leer el diario de tu enemigo.

La Saga de los Muros (o cómo cada solución creaba un problema nuevo)

Esto no fue un proyecto, fue una novela de suspense donde cada capítulo terminaba con un plot twist que me jodía el plan.

Obstáculo 1: Mi Mac M2 Me Odia

Pensé: "Voy a instalar un certificado falso en el emulador y listo". Pero resulta que las imágenes de Android para Apple Silicon tienen el sistema de archivos bloqueado más duros que muhammad ali. adb remount me daba la callada por respuesta.

Primer cambio de planes: "Vale, jodamos la app web en lugar de la móvil".

Obstáculo 2: Playwright Decidió Jubilarse

Playwright en macOS M2 es como un coche bonito que no arranca. Se crasheaba silenciosamente y me dejaba ahí como un gilipollas preguntándome qué había pasado. Selenium igual.

Segundo cambio de planes: migrar todo a una máquina Windows porque aparentemente mi Mac tiene algo personal contra la automatización web.

Obstáculo 3: La App Móvil Era un Búnker

Ya en Windows, volví a atacar la app móvil. Y aquí empezó la guerra de verdad:

SSL Pinning: La app me decía "tu certificado de Burp me la suda, no voy a confiar en ti". Solución: Frida con un script de unpinning para decirle "sí que vas a confiar, cabrona".

Detección de Proxy: Después de quitar el SSL pinning, la app ignoraba completamente mi proxy. Como si hubiera puesto un cartel de "ESTOY ESPIANDO" y la app hubiera decidido cambiar de acera. Solución: iptables para forzar TODO el tráfico del emulador por mi proxy. Si no quieres ir por las buenas, irás por las malas.

Anti-Debugging: Cuando conseguí que Frida funcionara, la app se daba cuenta y se suicidaba instantáneamente. Era como jugar al escondite con alguien que siempre te pilla. Solución: en lugar de lanzar la app con Frida (muy obvio), la lanzaba normal y luego atacaba Frida al proceso. Sigilo level 100.

Victoria temporal: Finalmente conseguí interceptar el tráfico. La app hablaba con dos APIs: una de terceros (tipo Salesforce) y otra propia. Me sentí como Neo viendo Matrix por primera vez.

El Plot Twist Final (o cómo la app me jodió)

Después de replicar todo el proceso de login web (que era un puto laberinto de ViewStates dinámicos y tokens Bearer), mi bot conseguía loguearse perfectamente. La sesión funcionaba, los endpoints respondían... pero la API que tenía que darme los datos del QR simplemente no se ejecutaba nunca.

No fallaba. No daba error. Simplemente... no pasaba nada. Como si la app hubiera decidido hacer una huelga silenciosa.

El diagnóstico que me jodió el alma: La aplicación web usa fingerprinting de navegador. Es decir, puede detectar que mi navegador está siendo controlado por Playwright en lugar de por un humano real. Y como castigo, no te bloquea el login (eso sería muy obvio), sino que simplemente decide no hacer las llamadas importantes después del login.

Es como si te dejaran entrar a una fiesta pero luego todos te ignoraran. Técnicamente estás dentro, pero prácticamente estás jodido.

Reflexión de un tipo que ya no sabe si reír o llorar: Técnicamente, el proyecto fue un éxito. Aprendí más sobre seguridad en una semana que en meses de tutoriales. Pero también aprendí que hay gente por ahí haciendo defensas tan cabronamente inteligentes que dan ganas de aplaudir y mandarlos a la mierda al mismo tiempo.

La seguridad moderna no es una puerta cerrada, es un laberinto lleno de puertas falsas donde cada vez que crees que has ganado, te das cuenta de que el juego era otro completamente distinto.

Lo que aprendí (además de que soy masoca)

Este proyecto me enseñó que la seguridad real no son barreras que puedes saltarte una por una. Es un ecosistema hecho para que cuando superes una, ya estés metido en la trampa de la que viene.

También aprendí que la diferencia entre hacer algo que funciona en tu ordenador y hacer algo que funciona en el mundo real es mucha. En tu ordenador no hay SSL pinning, ni detección de debugging, ni fingerprinting de navegador.

Y lo más importante: que hay desarrolladores por ahí que son unos hijos de puta muy inteligentes, y que la próxima vez que una app tarda en cargar, igual me callo y espero los 3 segundos extras en lugar de intentar hackearla.

Mentira, seguramente lo vuelva a intentar. Pero ahora al menos sé en lo que me meto.

PD: Un mes después ha reaparecido la página y ya está terminado 🥸