Saltar al contenido
Red Team

Escalada de privilegios

Dentro de una máquina con un shell autorizado: enumerar privilegios, encontrar la regla de sudo mal puesta, leer la flag como root y parar ahí.

35 min de lectura

El encargo de hoy es distinto. Los temas anteriores miraban una máquina por fuera: qué puertos, qué versiones, qué publica la web. Hoy ya estás dentro: la Academia Faro te ha dado un shell autorizado en su servidor de aulas (srv-aulas), con una cuenta normal y corriente (auditor), sin privilegios. La pregunta del tema es: desde una cuenta así, ¿se puede llegar a root? Y si se puede, ¿por dónde?

Eso es una escalada de privilegios. No es «entrar» —ya has entrado—, es pasar de una cuenta cualquiera a mandar en la máquina entera. La ventana va de las 18:00 a las 21:00, con las aulas cerradas, y la cláusula de este encargo es la más importante del tema: se demuestra y se para.

El shell autorizado y la enumeración

Dentro de una máquina no se dispara nada: se enumera. Mirar con calma qué cuenta eres, qué grupos tienes, qué puedes leer, qué programas hay con permisos especiales. La mayoría de las escaladas de verdad no son un exploit de película: son un descuido —una regla de más, un permiso mal puesto, una contraseña olvidada en un fichero— que la enumeración saca a la luz.

Lo bueno de enumerar a mano es que es silencioso: un sudo -l, un find, un cat no hacen ruido en los registros. Lo que se oye es la enumeración automática (lo vemos al final).

Mirar qué deja sudo

Lo primero, casi siempre: preguntarle a sudo qué te deja hacer. sudo -l lista las reglas que aplican a tu cuenta.

bash (captura)
auditor@srv-aulas:~$ sudo -l
Matching Defaults entries for auditor on srv-aulas:
  env_reset, mail_badpass, secure_path=/usr/sbin:/usr/bin:/sbin:/bin

User auditor may run the following commands on srv-aulas:
  (ALL) NOPASSWD: ALL

Ahí está. (ALL) NOPASSWD: ALL quiere decir que esta cuenta puede ejecutar cualquier cosa como root y sin contraseña. Es una regla que alguien dejó «para mantenimiento» y que convierte una cuenta normal en administrador total. Es el camino directo a root, y el hallazgo crítico del encargo.

La recomendación para el cliente: quitar esa regla (borrar su fichero de /etc/sudoers.d) y dar por sudo solo las órdenes concretas que de verdad hagan falta, y con contraseña. Ponerle contraseña a la cuenta pero dejar el NOPASSWD: ALL, cambiarlo por un NOPASSWD: /usr/bin/cat o esconder el fichero con un nombre raro no cambia nada: la cuenta sigue siendo root.

Ejercicio

Qué deja hacer sudo

Entras con la cuenta «auditor», sin privilegios. Lo primero dentro de una máquina es ver qué puede tu cuenta: pregunta a sudo con «sudo -l». Si sale «NOPASSWD», puedes hacer eso como root sin contraseña.

Preparando la máquina…

Leer la flag y parar

Con esa regla, demostrar la escalada es un solo gesto. Un usuario normal no puede leer /root:

bash (captura)
auditor@srv-aulas:~$ cat /root/root.txt
cat: /root/root.txt: Permission denied

Pero con la regla de sudo, se lee como root:

bash (captura)
auditor@srv-aulas:~$ sudo cat /root/root.txt
SQ{sudo-abierto-…}

Ese SQ{…} es la flag: el marcador que solo se lee desde root. Pegarlo en el tablero demuestra que llegaste a administrador. Y aquí está la cláusula del tema: se para ahí. No se abre un shell de root (sudo -i), no se toca nada, no se deja nada detrás. El auditor demuestra que se puede y lo documenta; lo que haría alguien con malas intenciones después —cambiar cosas, robar datos, quedarse— no es parte del trabajo. Es el mismo gesto inerte de los temas anteriores: leer el marcador y parar.

El SUID que se enumera y no se explota

Enumerando aparece otra cosa: un binario con el bit SUID. Un programa SUID se ejecuta siempre con el usuario de su dueño, no con el tuyo; si el dueño es root, ese programa corre como root. Se buscan así:

bash (captura)
auditor@srv-aulas:~$ find / -perm -4000 -type f 2>/dev/null
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/mount
/usr/local/bin/reparar-wifi

Los tres primeros son de serie (vienen con el sistema y son SUID a propósito). El último, /usr/local/bin/reparar-wifi, no: alguien lo dejó SUID, y eso es una puerta de más —si ese programa tiene un fallo, se convierte en root—. Es un hallazgo de gravedad alta —no se ha usado, pero le basta un fallo en ese programa a quien llegue—, y la recomendación es quitarle el bit (chmod u-s) si el programa no lo necesita, y revisar por qué lo tenía. Moverlo a otra carpeta conservando el bit, o cambiarle el dueño en vez de quitárselo, deja la puerta igual.

Ejercicio

Los binarios SUID

Los binarios con el bit SUID se ejecutan como su dueño (root). En toda la máquina se buscan con «find / -perm -4000 -type f 2>/dev/null»; aquí, para no toparte con permisos denegados, basta mirar en /usr/local: «find /usr/local -perm -4000 -type f». /usr/local/bin/reparar-wifi no es de serie: es un hallazgo. Se documenta, no se explota.

Preparando la máquina…

Credenciales olvidadas

La enumeración también encuentra lo más humano: una contraseña escrita en un fichero. Un recordatorio en el home, una clave en un script, un .bash_history con un mysql -p…. Aquí, un recordatorio legible guarda la clave del router de las aulas. No da root por sí misma, pero una contraseña casi nunca vale para una sola cosa: se apunta como hallazgo (gravedad media), se recomienda borrarla y cambiarla, y para guardarlas, un gestor de secretos.

La enumeración automática

Todo esto —sudo, SUID, ficheros con claves, cron, el PATH— lo hace a mano quien tiene tiempo. Hay herramientas que lo recorren automáticamente y dejan el mapa entero servido: la más conocida es linpeas. Es cómoda, pero tiene su precio:

  • Se oye. A diferencia de los comandos sueltos, una pasada de linpeas toca media máquina en segundos: deja un rastro enorme, y el SOC del cliente lo nota. En la sala, es lo único que sube el medidor de ruido.
  • Lo deja todo a la vista. Que una cuenta normal pueda recorrer la máquina entera sin que nada la corte es, en sí, un hallazgo (de baja gravedad): media escalada está hecha para quien entre.

La recomendación para ese último hallazgo es vigilar y limitar lo que una cuenta normal puede recorrer, y registrar los barridos raros, para que una enumeración no pase desapercibida. Bloquear la herramienta por su nombre no sirve (se renombra en un minuto), y quitarle a la cuenta el acceso a /usr/bin tampoco es la respuesta: lo que ayuda es verlo y limitarlo.

En la sala del tema

Estás en una sesión de auditor@srv-aulas, sin privilegios, de 18:00 a 21:00. El alcance es esa máquina y esa cuenta: aquí no se barre ni hay otro equipo. En el puesto tienes la terminal (con sudo, find, cat…) y, en el cajón, linpeas para la enumeración automática, para cuando quieras ver —o el cliente te lo pida— qué saca; subirá el medidor de ruido, y con eso entenderás por qué enumerar a mano era más discreto.

Cada hallazgo va al tablero con su evidencia —la salida de un comando o la flag—, su gravedad y su recomendación. Y la cláusula, siempre presente: se demuestra y se para. Al final entregas el informe y te llevas la nota en estrellas.