# ============================================================ # lab-linux-persist — una tarea programada mal permisada y su # correccion, dentro de un contenedor de laboratorio. # ------------------------------------------------------------ # El objetivo NO es "hackear": es ver, en un sistema que puedes # destruir, como una tarea que root ejecuta cada pocos segundos se # convierte en persistencia y en ejecucion como root cuando el # script que lanza es escribible por un usuario sin privilegios. # 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 logs -f caja # observar la tarea # docker compose down -v # ============================================================ name: lab-linux-persist networks: # Sin salida a internet: este laboratorio no necesita hablar con # nadie y no debe poder hacerlo. Por eso NO se instala cron con # apt (haria falta red): la "tarea programada" de root se simula # con un bucle, que a efectos de permisos es identico a una linea # de crontab de root o a un systemd timer con OnCalendar. aislada: driver: bridge internal: true services: caja: image: debian:12-slim container_name: persist-caja networks: - aislada command: - /bin/bash - -c - | set -e # --- un usuario sin privilegios: tu punto de partida --- useradd -m -s /bin/bash becario 2>/dev/null || true # --- el script que "root" ejecuta periodicamente --- # En produccion esto seria /etc/cron.d/backup o una unit de # systemd. Lo escribimos linea a linea (sin heredoc) para que # el bloque YAML no dependa de la indentacion. mkdir -p /opt/tareas echo '#!/bin/bash' > /opt/tareas/backup.sh echo '# tarea de mantenimiento que root ejecuta cada 15 segundos' >> /opt/tareas/backup.sh echo 'echo "[backup] $(date -u +%H:%M:%S) ejecutado por: $(id -un)"' >> /opt/tareas/backup.sh # --- EL FALLO DELIBERADO --- # El script y su directorio son escribibles por cualquiera. # 'becario' puede reescribir lo que root va a ejecutar. chmod 0777 /opt/tareas chmod 0777 /opt/tareas/backup.sh # --- el log donde se observa cada ejecucion --- mkdir -p /var/log : > /var/log/tarea.log chmod 0644 /var/log/tarea.log # --- el "cron" de root: ejecuta backup.sh cada 15s como root --- ( while true; do /opt/tareas/backup.sh >> /var/log/tarea.log 2>&1 sleep 15 done ) & echo "escenario listo." echo "la tarea de root corre cada 15s; observa /var/log/tarea.log" echo "entra con: su - becario" # mantener el contenedor vivo sin consumir 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 restart: "no"