Cómo obtener Root en Ubuntu a través del engaño de su GDM

Iniciado por AXCESS, Noviembre 17, 2020, 05:16:39 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

El pasado 10 de noviembre, el investigador inglés llamado Kevin Backhouse da a conocer una falla en el GNOME Display Manager (gdm) de Ubuntu que, permite a un usuario estándar crear cuentas con mayores privilegios, brindando así una ruta para ejecutar código con permisos de administrador (root).

Este error afecta a: Ubuntu 20.10, Ubuntu 20.04, Ubuntu 18.04 y Ubuntu 16.04; y se clasifica con una puntuación de gravedad alta de 7,2 sobre 10.

Ya ha sido reportada a los mantenedores de Ubuntu y GNOME el  pasado 17 de octubre, y las correcciones están disponibles en el código más reciente:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Lo interesante de esta vulnerabilidad, quizás radica en su sencillez, cosa rara de presenciar a día de hoy. Como el propio descubridor declara, y se verá, a través de unos simples comandos, un usuario sin privilegios puede crearse una cuenta de administrador para sí.

De cualquier modo, es importante destacar:

-Que se hace una traducción e interpretación del método, en aras de una curiosidad para el pentesting, si se es investigador o auditor de seguridad informática. No para andar tonteando en los centros de estudios, o laborales. Funciona, y funciona bien, habiendo sido probado.

-De igual forma, solo es válido poder explotar esta vulnerabilidad, si se tiene acceso a la sesión gráfica del desktop del sistema Ubuntu.

Pasos para la Explotación

Se traducirá el reporte y PoC original de su descubridor, pues me parece lo correcto, y así evitar malos entendidos con una recreación propia.

Vídeo PoC (Proof of Concept) de Kevin Backhouse:



Primero, se abrirá una terminal y se creará un Enlace Simbólico o Symbolic Link en su directorio de inicio:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

(Si esto no funciona es porque ya existe un archivo llamado .pam_environment; simplemente cambie el nombre del archivo anterior temporalmente para poder restaurarlo más tarde).

A continuación, abra "Región e idioma" en la configuración del sistema e intente cambiar el idioma.
El cuadro de diálogo se congelará así que, ignórelo y vuelva a la terminal. En este punto, un programa llamado "accounts-daemon" estará consumiendo el 100% del núcleo de la CPU, por lo que el Pc puede volverse lento y comenzar a calentarse.

En la terminal, elimine el Enlace Simbólico. De lo contrario, podría excluirse de su propia cuenta.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

El siguiente paso es enviar una señal SIGSTOP al daemon de cuentas (accounts-daemon) para evitar que destruya el núcleo del CPU. Pero para hacer eso, primero se necesita conocer al identificador de proceso (PID) del daemon de cuentas. En el vídeo, se hace ejecutando top, que es una utilidad para monitorear los procesos en ejecución.
Debido a que el daemon de cuentas está atascado en un bucle infinito, rápidamente pasa a la parte superior de la lista. Otra forma de encontrar el PID es con la utilidad pidof:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Ya armado con el PID de accounts-daemon, se puede usar kill para enviar la señal SIGSTOP:


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

La computadora puede tomarse un respiro ahora.

Este es el paso crucial.

Se va a cerrar sesión en su cuenta, pero primero se necesita configurar un temporizador para restablecer el demonio de cuentas, después de haber cerrado la sesión. De lo contrario, quedará bloqueado y el proceso fallará. (No se preocupe si esto sucede: todo volverá a la normalidad después de reiniciar).

Así es como se configura el temporizador:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

La utilidad nohup es una forma sencilla de dejar un script en ejecución después de cerrar la sesión. Este comando le dice que ejecute un script bash que hace tres cosas:

     -Duerme 30 segundos. (Solo necesita darse el tiempo suficiente para cerrar la sesión. Se configuró  en 10 segundos para el vídeo).
     -Envíe al demonio de cuentas una señal SIGSEGV, que hará que se bloquee.
     -Envíe a accounts-daemon una señal SIGCONT para desactivar SIGSTOP, que envió anteriormente. El SIGSEGV no entrará en vigor hasta que se reciba el SIGCONT.

Una vez completado, cierre la sesión y espere unos segundos hasta que el SIGSEGV detone.
Si el proceso ha tiene éxito, se le presentará una serie de cuadros de diálogo que le permitirán crear una nueva cuenta de usuario. La nueva cuenta de usuario es una cuenta de administrador. (En el video, se ejecuta id para mostrar que el nuevo usuario es miembro del grupo sudo, lo que significa que tiene privilegios de root).

Explicación de los errores involucrados

Hay dos errores involucrados.

El primero es el servicio de cuentas, que es un servicio que administra las cuentas de los usuarios en la computadora. El segundo está en GNOME Display Manager (gdm3), que, entre otras cosas, maneja la pantalla de inicio de sesión.

Se explicará cada uno de estos errores por separado a continuación.

Servicio de cuentas denegación de servicio (GHSL-2020-187, GHSL-2020-188 / CVE-2020-16126, CVE-2020-16127)

El daemon de servicio de cuentas (accounts-daemon) es un servicio del sistema que administra las cuentas de usuario en el Pc.
Puede hacer cosas como crear una nueva cuenta de usuario o cambiar la contraseña de un usuario, pero también puede hacer cosas menos sensibles a la seguridad como cambiar el ícono de un usuario o su idioma preferido.
Los daemons son programas que se ejecutan en segundo plano y no tienen su propia interfaz de usuario. Sin embargo, el cuadro de diálogo de configuración del sistema puede comunicarse con el daemon de cuentas a través de un sistema de mensajes conocido como D-Bus.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

En el proceso, se utilizó el cuadro de diálogo de configuración del sistema para cambiar el idioma.
Un usuario estándar puede cambiar esa configuración en su propia cuenta; no se requieren privilegios de administrador.
Bajo el capó, el cuadro de diálogo de servicios del sistema envía el comando org.freedesktop.Accounts.User.SetLanguage a accounts-daemon, a través de D-Bus.

Resulta que Ubuntu usa una versión modificada de servicio de cuentas que incluye un código adicional, que no existe en la versión original mantenida por freedesktop.

El parche de Ubuntu agrega una función llamada is_in_pam_environment, que busca un archivo llamado .pam_environment en el directorio de inicio del usuario y lo lee.
La vulnerabilidad de denegación de servicio funciona al convertir .pam_environment en un enlace simbólico a / dev / zero. / dev / zero, es un archivo especial que en realidad no existe en el disco. Lo proporciona el sistema operativo y se comporta como un archivo infinitamente largo en el que cada byte es cero.
Cuando is_in_pam_environment intenta leer .pam_environment, el enlace simbólico lo redirige a / dev / zero y luego se atasca en un bucle infinito porque / dev / zero es infinitamente largo.

Hay una segunda parte de este error.

El exploit implica bloquear al demonio de cuentas enviándole un SIGSEGV.
Sin lugar a dudas, un usuario estándar no debería poder bloquear un servicio del sistema como ese.
No debería, pero el daemon de cuentas lo permite inadvertidamente, al eliminar privilegios, justo antes de que comience a leer el .pam_environment del usuario.

Eliminar los privilegios significa que el demonio pierde temporalmente sus privilegios de root, adoptando en su lugar los privilegios inferiores del usuario.
Irónicamente, eso pretende ser una precaución de seguridad, cuyo objetivo es proteger al demonio de un usuario malintencionado, que hace algo como vincular su .pam_environment a / etc / shadow, que es un archivo muy sensible que los usuarios estándar no pueden permitir leer.
Desafortunadamente, cuando se hace incorrectamente, también otorga permiso al usuario para enviar las señales del demonio, por lo que podemos enviar un demonio de cuentas un SIGSEGV.

Escalada de privilegios gdm3 debido al accounts-daemon que no responde (GHSL-2020-202 / CVE-2020-16125)

GNOME Display Manager (gdm3) es un componente fundamental de la interfaz de usuario de Ubuntu.
Maneja cosas, como iniciar y detener sesiones de usuario cuando inician y cierran sesión. También gestiona la pantalla de inicio de sesión.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Otra cosa manejada por gdm3 es la configuración inicial de una nueva computadora.
Cuando se instala Ubuntu en un Pc nuevo, una de las primeras cosas que se debe hacer es crear una cuenta de usuario.
La cuenta de usuario inicial debe ser de administrador para que pueda continuar configurando al Pc, haciendo cosas como configurar el wifi, instalar aplicaciones. etc.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

El cuadro de diálogo que ve en la captura de pantalla es una aplicación separada, llamada gnome-initial-setup. Se activa por gdm3 cuando no hay cuentas de usuario en el sistema, que es el escenario esperado durante la configuración inicial de una nueva computadora. Gdm3 comprueba cuántos usuarios hay en el sistema preguntando al accounts-daemon.

Utiliza el D-Bus para preguntar a accounts-daemon cuántos usuarios hay, pero dado que accounts-daemon no responde, la llamada al método D-Bus falla debido a un tiempo de espera. (En mis pruebas, el tiempo de espera tomó alrededor de 20 segundos). Debido al error de tiempo de espera, el código no establece el valor de priv-> have_existing_user_accounts.
Desafortunadamente, el valor predeterminado de priv-> have_existing_user_accounts es falso, no verdadero, por lo que ahora gdm3 piensa que no hay cuentas de usuario y lanza gnome-initial-setup.

Fuente:
Kevin Backhouse:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Vaya, excelente post AXCESS, y genial que haya hecho el tutorial, además de dejar la información.

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

Wow, interesante falla y muy sencilla de explotar. Gracias por compartir!  :D :D

-Kirari

Noviembre 18, 2020, 11:45:00 AM #3 Ultima modificación: Noviembre 18, 2020, 11:13:27 PM por AXCESS
Gracias a ambos por la apreciación.

Me doy cuenta que pudiera existir la interrogante de si aplica la vulnerabilidad a otros sistema similares en Linux.

Según declara el propio investigador, solo la halla en Ubuntu, y  no encontró esta malfunción en los repos mantenidos por freedesktop o Debian.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Noviembre 19, 2020, 03:33:16 PM #4 Ultima modificación: Noviembre 20, 2020, 10:34:52 PM por AXCESS
@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

También es interesante que el investigador haya dicho eso, pero rebuscando el nombre de la vulnerabilidad, pude toparme con esto: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta; que indica que posiblemente también la vulnerabilidad puede estar presente en otros derivados o la misma madre de ubuntu (debian), y puede que sí, ya que el factor determinante es gdm3.

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

Noviembre 20, 2020, 05:59:07 PM #5 Ultima modificación: Noviembre 20, 2020, 10:35:28 PM por AXCESS
@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Lo de la vulnerabilidad en otras distros pudiera ser, pues tiene sentido.
Siempre es bueno probar  ;)
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta