lab-linux-persist — tarea programada mal permisada ================================================== ESTADO: LABORATORIO LOCAL Target: contenedor persist-caja (sin puertos publicados) Autorizacion: sistema local creado por ti para entrenamiento. Este laboratorio es tuyo y corre en tu maquina, aislado y sin salida a internet. Todo lo que aqui se practica se practica aqui dentro. Ninguna de estas tecnicas debe usarse contra un sistema que no sea tuyo o para el que no tengas autorizacion escrita. Que monta --------- Una sola "maquina" Debian con: - usuario 'becario' sin privilegios (tu punto de partida) - /opt/tareas/backup.sh script que root ejecuta cada 15 segundos - /var/log/tarea.log el log donde se ve cada ejecucion - un bucle de root hace de "cron": lanza backup.sh y espera El fallo deliberado: /opt/tareas y /opt/tareas/backup.sh estan en 0777 (escribibles por cualquiera). Como root ejecuta ese script, 'becario' puede reescribirlo y conseguir que root ejecute lo que el quiera. Eso es, a la vez, ejecucion como root y persistencia: la puerta se vuelve a abrir en cada ciclo de la tarea. No se instala cron con apt porque el laboratorio no tiene red. El bucle de root es identico, a efectos de permisos, a una linea de crontab de root o a un systemd timer con OnCalendar. Comandos -------- docker compose up -d levantar docker compose logs -f caja observar la tarea (cada 15s) docker compose exec caja bash entrar como root (inspeccionar) docker compose exec caja su - becario trabajar como usuario normal docker compose down -v destruir Recorrido (construir -> atacar -> observar -> defender -> verificar) ------------------------------------------------------------------- # OBSERVA la tarea legitima corriendo como root cat /var/log/tarea.log # [backup] ... ejecutado por: root # como 'becario', mira los permisos: el script es escribible por ti ls -ld /opt/tareas # drwxrwxrwx ls -l /opt/tareas/backup.sh # -rwxrwxrwx # ATACA: haz que la tarea de root deje una marca a tu favor echo 'id -un > /tmp/quien_ejecuta' >> /opt/tareas/backup.sh # OBSERVA: espera al siguiente ciclo (<=15s) y comprueba quien la creo ls -l /tmp/quien_ejecuta # dueno: root <- corrio como root cat /tmp/quien_ejecuta # root # DEFIENDE (como root): devuelve la propiedad y cierra la escritura # chown -R root:root /opt/tareas # chmod 0755 /opt/tareas # chmod 0755 /opt/tareas/backup.sh # VERIFICA (como becario): ya no puedes tocar el script echo 'malicia' >> /opt/tareas/backup.sh # Permission denied Por que esto importa -------------------- Una tarea programada es codigo que se ejecuta solo, con la identidad de quien la programo, una y otra vez. Si un usuario sin privilegios puede modificar lo que se ejecutara (el script, su directorio, el propio archivo de crontab o la unit de systemd), tiene ejecucion con la identidad de esa tarea de forma repetida y automatica. La regla es simple: todo lo que una tarea privilegiada ejecuta debe ser propiedad de root y no escribible por nadie mas. Si algo falla ------------- el contenedor sale enseguida revisa 'docker compose logs caja' el log no crece espera 15s; el primer ciclo tarda no existe 'becario' el escenario no termino de montar; haz 'down -v' y 'up -d' de nuevo Cuando termines, siempre: docker compose down -v