Saltar al contenido
Nuevo

DeepSeek V4.1 Flash gratis por 7 días: 10M tokens al día tras cualquier recarga. Hasta el 30/11.

Cómo funciona

OWASP Juice Shop con Docker: un laboratorio local para practicar

Ejecuta OWASP Juice Shop en un contenedor Docker limitado a tu equipo, comprueba que responde y detenlo sin dejar nada en ejecución.

Principiante5 min de lecturaPor NotHoly

OWASP Juice Shop es una aplicación web intencionalmente vulnerable. Puedes ejecutarla en un contenedor Docker en tu propio equipo, abrirla en el navegador en http://127.0.0.1:3000 y practicar seguridad web sobre ella sin tocar sistemas de nadie más. El proyecto dice incluir vulnerabilidades de todo el OWASP Top Ten, además de otras que aparecen en aplicaciones reales. A continuación están los comandos, qué revisar después de cada uno, cómo mantener el puerto privado y cómo detener el laboratorio.

Lo que necesitas

  • Un equipo que sea tuyo o que administres, con permiso para ejecutar Docker en él.
  • Docker Engine o Docker Desktop. Instálalo siguiendo la documentación oficial de Docker para tu sistema operativo.
  • Un navegador con herramientas para desarrolladores. Chrome, Firefox y Edge las incluyen.
  • Espacio en disco y memoria para un contenedor. El tamaño de la imagen depende de la etiqueta que elijas, así que revisa primero su página en Docker Hub.

Juice Shop tiene fallos a propósito. Mantenlo en una máquina y en una red que controles, y nunca lo expongas a internet.

1. Comprueba que Docker funciona

Ejecuta estos dos comandos en una terminal:

bash
docker --version
docker info

El primero muestra la versión del cliente de Docker. El segundo se conecta a Docker Engine y muestra su configuración. Si docker info indica que no puede conectarse al daemon, inicia Docker Desktop o el servicio de Docker y vuelve a ejecutar el comando. El texto exacto del error depende de la plataforma, así que sigue la documentación de instalación de Docker si la solución no es obvia.

2. Inicia el laboratorio solo en loopback

La documentación del proyecto menciona la imagen bkimminich/juice-shop. El README del proyecto la ejecuta sin etiqueta, lo que descarga latest. Si quieres un laboratorio repetible, elige una etiqueta de versión en la página de Docker Hub y añádela al nombre de la imagen (bkimminich/juice-shop:<tag>), para saber qué versión estás probando.

bash
docker run --rm --name juice-shop-lab \
  -p 127.0.0.1:3000:3000 \
  bkimminich/juice-shop

La opción -p publica un puerto del contenedor en la máquina host. El valor 127.0.0.1:3000:3000 tiene tres partes: la dirección del host, el puerto del host y el puerto del contenedor. La referencia de publicación de puertos de Docker explica que un mapeo sin dirección puede escuchar en todas las interfaces del host. Poner 127.0.0.1 primero hace que el laboratorio solo sea accesible desde tu propia máquina.

La opción --rm elimina el contenedor cuando se detiene. El comando se ejecuta en primer plano, así que la terminal sigue mostrando logs hasta que lo interrumpas. La primera ejecución descarga la imagen, lo que puede tardar un rato.

Abre http://127.0.0.1:3000 en un navegador de la misma máquina. Deberías ver la página de inicio de Juice Shop. Si no carga, revisa la terminal en busca de errores y ejecuta docker ps en otra terminal para confirmar que el contenedor está activo y que el mapeo de puertos es correcto. Los clientes VPN, los proxies y las redes de máquinas virtuales pueden cambiar cómo se comporta el tráfico local, así que revisa también esas capas antes de tocar las opciones.

No cambies 127.0.0.1 por 0.0.0.0 para que la página cargue. Eso expone el laboratorio a otros dispositivos de tu red.

3. Observa la carga de una página inofensiva

Antes de intentar cualquier desafío, observa cómo se comunican el navegador y el servidor. Abre las herramientas para desarrolladores, ve a la pestaña Red (Network) y recarga la página. Elige una solicitud y anota:

  • el método de la solicitud, como GET;
  • el código de estado de la respuesta;
  • una cabecera de respuesta, como Content-Type;
  • la diferencia entre el documento HTML y un archivo JavaScript.

Puedes obtener la misma información desde la terminal:

bash
curl -I http://127.0.0.1:3000

En Windows PowerShell 5.1, curl es un alias de otro comando, así que escribe curl.exe.

La opción -I envía una solicitud HEAD y muestra solo las cabeceras de la respuesta. La RFC 9110 define los métodos, los códigos de estado y los campos de cabecera que estás viendo. Estas son las primeras líneas de lo que devolvió la imagen sin etiqueta en una ejecución (2026-11-08); otras versiones pueden diferir:

text
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Content-Type: text/html; charset=UTF-8

Anota lo que devuelve tu servidor y compáralo.

La documentación del proyecto describe los desafíos de entrenamiento y sus pistas. Lee ese material antes de intentar un exploit, y mantén todas las pruebas apuntando a 127.0.0.1. Conocer antes el ciclo de solicitud y respuesta facilita evaluar después los resultados de los escáneres, porque ves el tráfico que esas herramientas envían y reciben.

4. Detén y elimina el laboratorio

Si el contenedor se ejecuta en primer plano, presiona Ctrl+C en su terminal. Como usaste --rm, Docker elimina el contenedor en cuanto se detiene.

Si perdiste esa terminal, detén el contenedor desde otra:

bash
docker stop juice-shop-lab

Docker envía una señal de parada y espera a que el contenedor termine. Confirma que el laboratorio ya no está:

bash
docker ps

Si el nombre del contenedor no aparece en la lista, el laboratorio está detenido. Cerrar la pestaña del navegador no detiene el contenedor, así que revisa siempre con docker ps.

Problemas comunes

Si el puerto ya está en uso, docker run falla con Bind for 127.0.0.1:3000 failed: port is already allocated. Elige otro puerto del host, como -p 127.0.0.1:3001:3000, y abre http://127.0.0.1:3001 en su lugar. Mantén la parte 127.0.0.1.

Si el contenedor se cierra de inmediato, lee los logs de la terminal. Busca la primera línea de error, no la última.

Si la primera ejecución tarda mucho, Docker está descargando la imagen y sus capas. Las siguientes empiezan más rápido porque Docker guarda la imagen localmente.

Dónde encaja un modelo de lenguaje

Un modelo de lenguaje puede explicar un código de estado o ayudarte a ordenar tus notas, y NotHoly es un lugar para hacerlo. También puede equivocarse al interpretar una respuesta y no reemplaza la autorización ni la validación manual. Pega solo salidas de tu propio laboratorio, nunca cookies de sesión, tokens ni datos de un objetivo real.

Escribe tus notas a partir de lo que observaste y luego compáralas con las referencias de abajo.

Referencias

Fuentes

  1. OWASP Juice Shop project
  2. OWASP Juice Shop documentation
  3. Docker port publishing
  4. docker container run reference
  5. docker container stop reference
  6. RFC 9110, HTTP Semantics
  7. OWASP Top 10

Más en Laboratorios de hacking

Laboratorios de hacking

Cómo escribir un buen informe de pentest

Estructure un informe de pentest y escriba un hallazgo que otra persona pueda reproducir, con evidencia, impacto, vector CVSS v4.0 y remediación.

Intermedio9 min de lectura

Laboratorios de hacking

Cómo montar un laboratorio doméstico legal

Monta un laboratorio que puedes atacar: archivo de alcance, puertos de Docker en loopback, red aislada, cuaderno de notas y desmontaje limpio.

Principiante4 min de lectura