lab-linux-privesc — permisos, SUID y escalada ============================================== ESTADO: LABORATORIO LOCAL Target: contenedor privesc-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) - usuario 'operador' con un secreto en /srv/datos/secreto.txt (chmod 600) - /usr/local/bin/leer un binario SUID de 'operador' (el fallo a estudiar) - /opt/util directorio world-writable dentro del PATH El escenario es deliberadamente imperfecto: existe para que veas, corrijas y vuelvas a comprobar. Comandos -------- docker compose up -d levantar docker compose exec caja bash entrar como root (para inspeccionar) docker compose exec caja su - becario trabajar como usuario normal docker compose down -v destruir Recorrido (construir -> atacar -> observar -> defender -> verificar) ------------------------------------------------------------------- # como 'becario', confirma que NO puedes leer el secreto directamente cat /srv/datos/secreto.txt # Permission denied # observa el binario SUID: el bit 's' en los permisos del dueno ls -l /usr/local/bin/leer # -rwsr-xr-x ... operador operador # el binario corre con los privilegios de 'operador', no los tuyos: /usr/local/bin/leer /srv/datos/secreto.txt # ahora si lo lee # DEFENDER: quitale el bit SUID y vuelve a intentarlo # (como root) chmod u-s /usr/local/bin/leer # VERIFICAR: el mismo comando ahora deberia fallar Por que esto importa -------------------- El SUID no es un bug: es una funcion legitima de Unix (asi funciona 'passwd', por ejemplo). El fallo es ponerselo a un binario que puede leer o escribir archivos arbitrarios. La leccion ensena a distinguir un SUID necesario de uno peligroso, y a auditarlos con: find / -perm -4000 -type f 2>/dev/null Si algo falla ------------- el contenedor sale enseguida revisa 'docker compose logs caja' no existe 'becario' el escenario no termino de montar; haz 'down -v' y 'up -d' de nuevo Cuando termines, siempre: docker compose down -v