lunes, octubre 24, 2016

Cómo convertirse en root en un GNU/Linux explotando el bug de DirtyCOW

La semana pasada se publicó un exploit que se aprovecha de una vulnerabilidad para lograr ejecutar código en un contexto privilegiado. DirtyCOW es una vulnerabilidad de condición de carrera que puede provocar la ejecución de código y lograr una escalada de privilegios en un kernel de Linux. Afecta a todas las versiones del sistema operativo y podemos encontrar un mayor nivel de detalle en su CVE-2016-5196. Además, DirtyCOW va camino de vulnerabilidad mediática, por lo que tiene su propio sitio web y su propia imagen.

Figura 1: Cómo convertirse en root en un GNU/Linux explotando el bug de DirtyCOW

¿En qué consiste la vulnerabilidad? Realmente es una condición de carrera que se encontró en la forma en la que el subsistema de memoria del kernel de Linux gestiona COW, Copy-On-Write. En otras palabras, un usuario local sin privilegios podría utilizar esta vulnerabilidad para escribir y tener acceso a partes del sistema que son de otros usuarios, incluido el root. En el instante que se puede acceder a la escritura a partes pertenecientes a root, se puede escribir código que, al ser ejecutado, por ejemplo, con setuid, permiten ejecutar código con dicha identidad consiguiendo la escalada de privilegio.

Figura 2: Copy-on-Write en la Wikipedia

Como curiosidad hay que decir que la vulnerabilidad ha estado presente durante muchos años, desde la versión 2.6.22 del kernel de Linux, la cual fue liberada allá por el año 2007. Incluso el propio Linus Torvalds comentó en su día que la vulnerabilidad existía, pero todo era de forma teórica y no se conocía la forma de explotar. De hecho se dejó porque el parche que se había previsto afectaba al funcionamiento de Linux en los equipos IBM S390. Hoy día, ya tenemos un exploit público que se aprovecha de la vulnerabilidad para lograr ejecutar código con privilegio, y lograr la escalada.

Figura 3: Exploit para DirtyCOW que usaremos en la PoC

Para verificar que mi sistema es vulnerable o no a esta vulnerabilidad podemos ejecutar la siguiente instrucción en un terminal: uname -a. Si la versión del kernel está entre la 2.6.22 y la 3.9, tendremos un problema. El exploit público está preparado para arquitecturas x86 y x64, solo hay que descomentar la parte que no nos interesa.

Figura 4: Comprobación de versión del Kernel de Linux vulnerable a DirtyCOW

En exploit-db encontramos una de las pruebas de concepto de las varias que hay en Internet sobre el exploit. Para nuestra prueba de concepto utilizaremos la que hemos visto en exploit-db, pero os recomendamos que echéis un ojo a las distintas pruebas de concepto que se han ido publicando en Internet. En Github, se ha montado un repositorio sobre todas las pruebas de concepto.

Figura 5: Repositorio en GitHub para las PoCs de DirtyCOW

Una vez descargado el exploit, vamos a editar el exploit para, en función de nuestra arquitectura, amoldarlo a las necesidades. Si estamos en un sistema x86, debemos comentar el payload generado con msfvenom de Metasploit para x64, y si nos encontramos en un sistema x64, sería justamente al revés.

PoC: Escalando privilegios con DirtyCOW

Una vez tengamos claro esto, debemos compilar el exploit escrito en Lenguaje C. Para ello ejecutamos la siguiente instrucción gcc [exploit.c] -o [exploit binario] -pthread. Esto llevará a cabo la compilación del exploit y lo tendremos disponible.

Figura 6: Configuración del exploit de DirtyCOW para nuestra arquitectura

Si pensamos en el hardening de servidores GNY/Linux tenemos que pensar que tener disponible el compilador en un servidor o máquina dónde no se lleven a cabo este tipo de tareas no es una buena práctica de seguridad. Imaginemos que en un servidor disponemos de gcc u otros compiladores, estamos dando un arma a los atacantes, que hayan llegado hasta aquí.

Figura 7: Ejecución del exploit de elevación de privilegios gracias a DirtyCOW

Una vez compilado, lanzamos el binario y podremos ver que el exploit tiene éxito. En el momento que tiene éxito, disponemos de una sesión como root en la máquina local. Lógicamente, este tipo de escaladas de privilegios, pueden ir ligadas con un ataque previo remoto, en el que un atacante o un auditor consigue acceso al sistema, para posteriormente lograr la escalada de privilegio. No sería extraño ver en poco tiempo este exploit migrado al famoso framework de explotación Metasploit.

Figura 8: Vídeo de la explotación de DirtyCOW

Por último, os dejamos el video sobre la explotación local de la vulnerabilidad en un sistema Ubuntu 14.04. Existen ramas en el kernel de Linux que ya están parcheadas, que no son vulnerables a DirtyCOW, por lo que recomendamos a todos los equipos de IT que verifiquen que sus versiones de kernel de los sistemas Linux no sean vulnerables. Este es un claro ejemplo de cómo explotar vulnerabilidades en Linux, así que analízalo que se entiende muy fácil.


Autor: Pablo González Pérez (@pablogonzalezpe)
Escritor de los libros "Metasploit para Pentesters", "Ethical Hacking", "Got Root" y “Pentesting con Powershell

2 comentarios:

  1. Pablo, muy buena prueba de concepto para ejemplificar el ataque!

    Saludos.

    ResponderEliminar
  2. En ubuntu 16.04 no funciona, esta testeado.

    ResponderEliminar