¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Un descuido que da root (mínimo privilegio)

Después de esta lección: Puedo explicar cómo un fallo permite a un usuario hacerse root y cómo cerrarlo.

Lección de 55 min6 comandosLaboratorio de escalada de privilegios en Linux: un binario setuid, una regla sudo, cron

Un becario con las llaves de todo

Una empresa le encarga a su becario una tarea pequeña: editar un archivo de configuración del servidor. Para ir rápido, el administrador le deja usar sudo con un editor, sin contraseña.

Un año después, una auditoría descubre que el becario podía haberse hecho root cuando quisiera. El camino era el editor.

Al final de esta lección

Nota

Puedo explicar cómo un fallo permite a un usuario hacerse root y cómo cerrarlo.

Palabras clave

PalabraQué significaEjemplo
Privilegioel poder que tiene una cuenta sobre la máquina
Mínimo privilegiodar a cada cuenta solo el poder que su trabajo necesita
Setuidun programa que se ejecuta como su dueño, lo lance quien lo lance-rwsr-xr-x
Regla de sudouna línea que dice quién puede ejecutar qué como root
Auditoríarevisar un sistema con una lista de errores conocidos

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

La regla única

Advertencia

Mira solo la máquina de este laboratorio. Es tuya y no llega a nadie más. Hacer esto en una máquina ajena, sin permiso, es un delito en muchos países.

Setuid ejecuta un archivo como su dueño

Casi todos los programas se ejecutan con los derechos de quien los lanza. Un programa setuid se ejecuta con los derechos de su dueño.

Algunos lo necesitan. passwd debe cambiar un archivo protegido. Pero un programa setuid de root que nadie planeó es un camino hacia root.

Busca los programas con setuid

Comando
find /usr/local/bin /usr/bin -perm -4000 -type f

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Mira su dueño y su modo

Comando
find /usr/local/bin /usr/bin -perm -4000 -type f -exec ls -l {} +

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejemplo: leer la letra s

ModoSignificado
-rwxr-xr-xUn programa normal
-rwsr-xr-xSetuid: se ejecuta como su dueño
-rwxr-sr-xSetgid: se ejecuta con su grupo

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Una regla de sudo puede ser demasiado ancha

Una regla de sudo nombra a un usuario, como quién puede actuar y qué programas. NOPASSWD significa que no pide contraseña.

Nombrar un solo programa parece seguro. No lo es si ese programa puede lanzar otro. Los editores, los paginadores y find pueden abrir una shell. Una shell abierta dentro de sudo es una shell de root.

Busca las reglas sin contraseña

Comando
sudo grep -r NOPASSWD /etc/sudoers.d

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

¿Qué puede ejecutar intern con sudo?

Comando
sudo -l -U intern

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejemplo: reglas estrechas y anchas

ReglaRiesgoMejor
ops ALL=(ALL) NOPASSWD: ALLRoot para todo, sin contraseñaNombrar las pocas órdenes necesarias
becario ALL=(root) NOPASSWD: /usr/bin/lessless puede abrir una shellUna orden exacta que solo lea ese archivo
web ALL=(root) /usr/bin/systemctl restart tiendaEstrecha: una orden exactaDejarla como está

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un error frecuente

Advertencia

Mucha gente cree que una regla de sudo para un solo programa es estrecha. Solo lo es si ese programa no puede ejecutar otros. Antes de permitir uno, pregunta: ¿puede abrir una shell o abrir otro archivo como root?

Root se fía del script que ejecuta

El cron de root ejecuta un script cada minuto. Si cualquiera puede editar ese script, cualquiera puede hacer que root ejecute sus órdenes.

La regla es sencilla. Un archivo que ejecuta root debe ser de root, y nadie más puede escribir en él. La carpeta donde está también importa.

Busca archivos que cualquiera puede escribir

Comando
find /opt -perm -o+w -type f -exec ls -l {} +

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

¿Lo ejecuta root de verdad?

Comando
sudo crontab -l -u root

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Los tres fallos y cómo cerrarlos

FalloCómo verloCómo cerrarlo
Un programa setuid de root que nadie planeófind con -perm -4000chmod u-s, o borrar la copia
Una regla de sudo demasiado anchagrep NOPASSWD en /etc/sudoers.dNombrar órdenes exactas, o usar sudoedit
Un script de root que cualquiera editafind con -perm -o+wchmod 755 y dueño root

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Haz el laboratorio y luego cierra el hueco

Consejo

El laboratorio te pide usar uno de estos fallos en tu propia máquina y escribir lo que hiciste. Hazlo primero. Después, en tu informe, explica cómo cerrarías el hueco con la tabla de arriba.

Para ir más lejos

Escribe find /opt /usr/local/bin /etc/cron.d -type f -perm /022. El /022 significa "el grupo o el resto pueden escribir".

Por cada línea que imprima, anota tres cosas en tu informe. ¿Quién puede escribir en el archivo? ¿Quién lo ejecuta? ¿Qué orden cierra el hueco?

Sobre este laboratorio y su código: Laboratorio de escalada de privilegios en Linux: un binario setuid, una regla sudo, cron

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.