Escalacion de privilegios con SUID en Linux

Escalacion de privilegios con SUID en Linux

Los recursos en un sistema con permisos SUID nos permiten ejecutar dicho recurso con los permisos de su propietario, eso no es del todo un problema, de hecho, en temas de administración es bastante útil cuando los usuarios necesitan usar un recurso con permisos, por ejemplo, del usuario root, pero, a su vez, no se les quiere dar acceso como este usuario (algo lógico), el problema viene cuando ese recurso nos permite hacer acciones que puedan comprometer el sistema, es decir, si tenemos un binario, por ejemplo nano con permiso suid del usuario root, eso significa que podemos editar/crear cualquier fichero del sistema como root (todos porque root tiene acceso a todos), teniendo por ejemplo este binario, es sencillo escalar privilegios desde un usuario común hasta el usuario root, editando el fichero passwd como lo explique en este artículo, u otras formas, en realidad es un avanico de posibilidades, en este caso veremos un ejemplo aplicado al binario find, que es un binario usado comúnmente para la búsqueda de directorios/ficheros en el sistema a base de filtros de búsqueda.

Configuración de entorno de pruebas

En este caso podría usar mi máquina ColddBox: Easy para probar el binario con permiso suid find, ya que, es una forma que tiene esa máquina de escalar privilegios, pero lo vamos a hacer de forma manual, en mi propio Kali, para ello debemos generar ese binario suid como root, voy a copiar el binario find a mi directorio actual y le asignare los permisos, esto lo hago para no darle directamente el permiso suid al binario que está dentro del path y cuando se termine esta practica borrar sin más el que generé, para todo esto, ejecuta:

cp /usr/bin/find /tmp/find  && cd /tmp && chmod +s find && ls -l

Creación de binario suid

En este punto ya el binario tiene permisos suid de root, porque copie el binario como root y soy su propietario, entonces cualquier usuario que ejecute este binario find automáticamente lo hará con los permisos de su propietario, en este caso root.

Seguidamente, iniciaré una shell como un usuario del sistema, que en mi caso es c0ldd y, con el buscaré recursos en el sistema con permisos suid.

Búsqueda de recursos con permisos suid

Para hacer esta labor, usaremos el binario find, igualmente que lo usaremos para ver el abuso de permisos suid, lo usaremos para buscar recursos con permisos suid, irónico, para ello ejecuta:

find / -perm -u=s -user root -type f -exec ls -l {} \; 2>/dev/null

Te explicaré los parámetros:

/ = le indicamos que busque desde la raíz ( es decir en todo el sistema)

-perm = Establecemos que solo busque los recursos donde el permiso del usuario propietario “-u” sea igual a suid “s”.

-user = Le indicamos a su vez, que solo busque recursos donde el propietario sea root (es útil cuando se quiere escalar privilegios a root como tal, se puede quitar tranquilamente pero también saldrían recursos con permisos suid de otros usuarios y no de root)

-type = Le indicamos el tipo de recurso que queremos, en este caso una f de file ya que no nos interesan directorios.

exec ls -l {} \; = Con el parámetro -exec podemos ejecutar comandos que reciben como parámetro el resultado de la búsqueda, en este caso le decimos que en base a todos los resultados de la búsqueda que hizo (que serán rutas absolutas) les haga un ls -l, dentro de las llaves se sustituirá por cada resultado que vaya encontrando find y por ende se le irá ejecutando el comando que hayamos indicado y, el \; es algo obligatorio para finalizar los comandos realizados a través del parámetro -exec, ni no lo pones te saldrá un error.

2>/dev/null = Por último, redirigimos el estándar error al /dev/null para que no muestre errores por pantalla, por ejemplo, avisos de permisos denegados por intentar buscar en directorios a los que no podemos acceder.

Al hacerlo, veremos que al final nos sale el binario que está en tmp, con permisos de root:

busqueda de binarios suid

Abuso de permisos suid del binario find

En este punto ¿qué podemos hacer?, simplemente usar el parámetro -exec para ejecutar, en lugar de un ls, una shell por ejemplo sh, pero claro, si nosotros ejecutamos find como nuestro usuario, estaríamos ejecutando el find que está en /usr/bin/, ya que, estamos ejecutando los recursos que se encuentran dentro del path, en este punto podríamos agregar la ruta de tmp al path y cuando ejecutemos find, ejecute primero el que tiene el permiso suid, pero para hacerlo más simple, podemos ejecutar el find de /tmp/ desde su ruta absoluta y ahí usar el parámetro -exec para que ejecute una shell como su propietario, es decir, root, para ello ejecuta:

/tmp/find . -exec /bin/sh -p \; -quit

El parámetro -p lo necesitamos usar puesto que nuestro UID y GID no coincide con nuestros EUID EGID, puesto que estamos abusando de este tipo de permiso, de hecho, si haces un id en la shell obtenida, veras que nuestro UID y GID es de c0ldd pero nuestro EUID y EGID es de root, por ende es el que se está aplicando:

Y el parámetro -quit lo usamos para que el comando se detenga después de la primera ejecución, de no poner este parámetro, se ejecutaría el comando el número de veces de los resultados que encuentre y, puesto que no le estamos dando ningún parámetro de filtro, nos va a buscar todos los ficheros y directorios desde el directorio que le indiquemos, por ende, en este caso que le indicamos que nos ejecute una sh, nos ejecutará una sh, encima otra sh, encima de otra sh y así, provocando algo como esto:

Si, por ejemplo, lo ejecuto en un directorio que no tenga nada, pues solo se ejecuta una vez y, en ese caso, no es necesario el -quit, aunque igual tenlo presente:

Posible solución

Lo mejor en estos casos es, siempre asegurarse de hacer una buena gestión en los permisos, un binario con SUID no representa un riesgo solo con tener el permiso, el problema viene cuando el binario que tiene el permiso permite, por ejemplo, ejecutar comandos del sistema, incrustar código, entre otras cosas, por eso es recomendable plantearte todas las posibilidades que puede tener un usuario al usar un binario con SUID antes de asignar el permiso.

Finalmente, lo que puedes hacer es hacer una búsqueda de todos los binarios SUID con el comando que vimos anteriormente y, los que veas sospechosos, removerles el permiso con el comando:

chmod -s (ruta_recurso)

Sobre el Autor

C0ldd

Founder of Coldd Security

1 comentario

  1. Avatar

    Entonces, si un dia no me encuentro en una maquina el binario find sino que me encuentro otro, como puedo saber como se escala con ese?

    Responder

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información adicional sobre protección de datos:
Responsable: Martin Frias.
Finalidad: Moderar los comentarios de este sitio web.
Cesión: NO se cederán a nadie, salvo obligación legal.
Derechos: Acceso, rectificación, cancelación y borrado de tus datos.
Legitimación: Tu consentido expreso.

Sponsor By

Coldd Security

REDES SOCIALES

Newsletter

Estadísticas

  • 55.938
  • 43

TheHackerSnow

0

Share This