# ============================================================ # lab-linux-privesc — permisos, SUID y escalada dentro de un # contenedor de laboratorio. # ------------------------------------------------------------ # El objetivo NO es "hackear": es ver, en un sistema que puedes # destruir, por qué un permiso de más convierte a un usuario # normal en root. Todo ocurre dentro de este contenedor. No hay # puertos publicados y no hay red con salida. # # docker compose up -d # docker compose exec caja su - becario # usuario sin privilegios # docker compose down -v # ============================================================ name: lab-linux-privesc networks: # Sin salida a internet: este laboratorio no necesita hablar # con nadie y no debe poder hacerlo. aislada: driver: bridge internal: true services: # Una sola "máquina" de prácticas. Arranca como root solo para # preparar el escenario (crear usuarios y permisos); el trabajo # del estudiante se hace como el usuario 'becario', sin privilegios. caja: image: debian:12-slim container_name: privesc-caja networks: - aislada # El entrypoint monta el escenario y deja el contenedor vivo. command: - /bin/bash - -c - | set -e # --- usuarios con distintos privilegios --- useradd -m -s /bin/bash becario 2>/dev/null || true useradd -m -s /bin/bash operador 2>/dev/null || true echo 'operador:cambiame' | chpasswd # --- un secreto que 'becario' NO deberia poder leer --- mkdir -p /srv/datos echo 'clave-de-produccion-que-no-deberias-ver' > /srv/datos/secreto.txt chown operador:operador /srv/datos/secreto.txt chmod 600 /srv/datos/secreto.txt # --- el fallo deliberado: un binario SUID de operador que # lanza una utilidad capaz de leer archivos arbitrarios. # 'becario' lo ejecutara con los privilegios de 'operador'. --- cp /bin/cat /usr/local/bin/leer chown operador:operador /usr/local/bin/leer chmod 4755 /usr/local/bin/leer # --- un directorio world-writable dentro del PATH: el otro # clasico. Sirve para la leccion de PATH hijacking. --- mkdir -p /opt/util chmod 0777 /opt/util echo "escenario listo. entra con: su - becario" # mantener el contenedor vivo sin proceso que consuma CPU exec sleep infinity # Reduce el poder del contenedor: quita capacidades que este # laboratorio no necesita, para que un error dentro no toque # el host. Es tambien un ejemplo de lo que se ensena en F03. cap_drop: - NET_RAW - NET_ADMIN security_opt: - no-new-privileges:false # el lab EXISTE para estudiar SUID; ver LEEME restart: "no"