¿Preguntas? Llámanos al +34 902 090 084

Cómo alcanzar privilegios de administrador en Ubuntu 20.04

Cómo alcanzar privilegios de administrador en Ubuntu 20.04

En el siguiente artículo exponemos una técnica recientemente encontrada por el equipo de seguridad de GitHub mediante la cual un usuario sin privilegios puede alcanzar privilegios de adiministrador en Ubuntu en su versión 20.04.

Como describe el autor en el mismo, este ataque de escalada de privilegios, aunque necesite de una interacción gráfica con la máquina, sorprende por su sencillez y por lo reciente del sistema afectado. Para la explotación de esta vulnerabilidad no es necesario poseer habilidades para la explotación de código, siendo también, fácil de entender y replicar.

Esta escalada de privilegios tiene implícita la explotación de dos errores en dos componentes del entorno de escritorio GNOME.

El primer error permite a un usuario no privilegiado cerrar el servicio que gestiona las cuentas de usuario en el sistema (accountsservice). Aprovechándose de esta situación un segundo error de programación en el componente que se encarga de gestionar el inicio de sesión (gdm3 – GNOME Display Manager ) nos permitirá crear un usuario con privilegios de administrador.

 

A continuación explicamos en detalle cada uno de los pasos hasta llegar a la explotación final.

Explotación teórica del ataque de escalada de privilegios en Ubuntu 20.04

accountsservice denial of service (GHSL-2020-187, GHSL-2020-188 / CVE-2020-16126, CVE-2020-16127)

El demonio accountsservice ( accounts-daemon ) es un servicio del sistema que maneja las cuentas de usuario en la máquina.

Puede realizar funciones tales como, crear nuevos usuarios o cambiar la contraseña de los mismos, pero también otras cosas a menor nivel de seguridad como pueden ser cambiar el icono del usuario o su lenguaje de preferencia.

Para refrescar la memoria, recordemos que los demonios son programas que se ejecutan en segundo plano y que no poseen su propia interfaz de usuario.

Para que los usuarios puedan modificar sus datos existen ventanas interactivas en la interfaz de usuario que se comunican con el demonio accounts-daemon a través de un mensaje de sistema conocido como D-Bus.

Ejemplos de dichas ventanas interactivas:

GitHub escalada de privilegios ubuntu 20.04 GNOME
Explicación GitHub escalada de privilegios ubuntu 20.04

Para la realización de la explotación usaremos el cambio del lenguaje, siguiendo el mismo ejemplo que el mostrado en el artículo original. Este tipo de cambios se realizan sobre la propia cuenta del usuarios y no requieren permisos administrativos en la máquina.

La ventana que se muestra nos permite cambiar dichas preferencias envía el comando org.freedesktop.Accounts.User.SetLanguage a accounts-daemon vía D-Bus.

Esta versión de Ubuntu usa una variante modificada del servicio accountsservice que incluye código extra que no encontramos en la versión original del servicio mantenida por freedesktop.

El parche añadido por Ubuntu incluye una función llamada is_in_pam_enviroment que busca y lee el fichero .pam_enviroment en el directorio home del usuario.

parche pan enviroment de ubuntu

Puede ver más en detalle sobre el parche añadido por Ubuntu en el enlace.

Teniendo en cuenta esta situación, el primer paso consiste en realizar una denegación de servicio funcional. Para esto lo que debemos de hacer es crear el fichero .pam_enviroment como un link simbólico a /dev/zero. /dev/zero es un fichero especial en sistemas operativos basados en Unix que provee tantos caracteres Null ( ASCII NULL. 0x00 ) como sean solicitados en la operación.

Realizado esto, cuando la función is_in_pam_enviroment trata de leer .pam_enviroment es redirigida a /dev/zero por el enlace simbólico, por lo que queda atrapada en un bucle infinito dado que /dev/zero otorga caracteres 0x00 de forma infinita.

La segunda parte de este bug implica conseguir que el demonio accounts-daemon deje de funcionar enviándole la señal de SIGSEGV que lo cerrará abruptamente.

Un usuario estándar no debería ser capaz de realizar dicha acción, pero accounts-daemon reduce sus privilegios justo antes de que comience a leer el .pam_environment del usuario.

reducción de privilegios pan enviroment ubuntu

Esto significa que el demonio pierde temporalmente sus privilegios de raíz adoptando en su lugar los de menor privilegio del usuario.

Irónicamente, esto está planteado como una medida de seguridad, ya que su objetivo es proteger al demonio de un usuario malicioso que haría algo como vincular su entorno .pam a ficheros de acceso privilegiado (p.e. /etc/shadow) con el fin de poder leerlos aún no teniendo privilegios para tal acción. Es por esto, que cuando se realiza de esta forma, también concede permisos al usuario para enviar señales al demonio, por lo que por esto podemos enviar SIGSEGV en dicho momento.

gdm3 privilege escalation due to unresponsive accounts-daemon (GHSL-2020-202 / CVE-2020-16125)

GNOME Display Manager ( gdm3 ) es un componente fundamental dentro de la interfaz de usuario de Ubuntu. Como hemos comentado, se encarga de la gestión de las sesiones de los usuarios de una máquina. Es el servicio responsable de la pantalla de login.

secuora-ciberseguridad-ubuntu

Cuando instalamos Ubuntu por primera vez, la creación del usuario inicial es gestionada por gdm3 usando sus privilegios administrativos.

creacion-usuario-incial-gdm3-ubuntu

Este diálogo que se nos muestra, es el denominado gnome-initial-setup. Es lanzado por gdm3 cuando detecta que no existen cuentas de usuario en el sistema, que es el escenario esperado cuando realizamos la instalación en un nuevo equipo.

Para detectar cuántos usuarios hay en el sistema, gdm3 lo comprueba preguntando al accounts-daemon que vimos en la sección anterior mediante D-Bus.

gdm3 accounts-daemon d-bus

Puede ver más detalle en este link

En la situación descrita en la primera sección el accounts-daemon está caído y la llamada de la linea 522 devuelve un error de time-out. En la gestión de este error (Lineas 530-532) no se establece un valor para la variable  priv->have_existing_user_accounts por lo que se le asigna el valor por defecto (False). 

escalada de privilegios ubuntu 20.04 time out error

Teniendo en cuenta que priv->have_existing_user_accounts está en False, entonces wants_initial_setup devuelve true (Linea 573). En este caso gdm3 considera que no hay cuentas de usuario en el sistema y lanza gnome-inital-setup, permitiendo así crear un nuevo usuario administrador.

Explotación práctica sobre Ubuntu 20.04

Para realizar dicha explotación la realizaremos sobre una máquina virtual con Ubuntu 20.04 instalado en su versión de 64 bits.

detalles maquina virtual ubuntu 20.04 para explotación práctica

Detalles del sistema

En dicha máquina contamos con un usuario “secuora” con privilegios de administrador y desde la cual crearemos un usuario “low” con permisos de usuario de bajo nivel.

usuarios actuales sistema ubuntu captura

Detalle de los usuarios actuales en el sistema

A continuación nos logueamos en la máquina como dicho usuario con bajos privilegios y creamos el enlace simbólico a /dev/zero con el nombre .pam_environment

enlace simbólico pan_enviroment
configuración del lenguaje del usuario ubuntu accounts-daemons

Nos dirigimos a la sección de configuración del lenguaje del usuario y lo modificamos, esto activará al accounts-daemons

daemon ubuntu

Vemos como el demonio consume mucho recursos al entrar en el bucle infinito anteriormente comentado.

kill sigstop 712

En este momento nuestro usuario es capaz de poder parar el servicio dado la pérdida de permisos durante la primera parte de su ejecución.

enviar señales sigsev y sigcont escalada de privilegios ubuntu 20.04

Para finalizar enviaremos las señales SIGSEGV y SIGCONT a dicho demonio para producir el error que nos permitirá engañar a gdm3 y cerramos nuestra sesión de usuario antes del tiempo establecido en nuestro último comando.

Al cargar de nuevo, en vez de mostrarnos el menú donde podemos seleccionar usuarios nos saldrá el mensaje de bienvenida.

GitHub alcanzar privilegios de adiministrador Ubuntu versión 20.04
usuario privilegios de administrador ubuntu 20.04

Finalmente nos saldrá el mensaje como si fuéramos los primeros usuarios en la máquina y se nos solicitará crear un nuevo usuario el cual tendrá privilegios de administrador.

privilegios de adiministrador en sistemas Ubuntu en su versión 20.04
privilegios administrador

Remediación. ¿Cómo protegerse cocntra la técnica de escalada de privilegios de administrador en Ubuntu 20.04?

Realizar una actualización del sistema operativo mediante la actualización de la lista de repositorios y actualización de la paquetería instalada.

Si te ha ressultado útil este post, no dejes de visitar nuestra sección de actualidad, donde encontrarás más informaciones sobre ciberseguridad y vulnerabilidades

Aitor del Castillo
Últimas entradas de Aitor del Castillo (ver todo)