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-5195. Además, DirtyCOW va camino de vulnerabilidad mediática, por lo que tiene su propio sitio web y su propia imagen.
¿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.
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, LInus Torvalds comentó en su día que la vulnerabilidad existía, pero todo era de forma teórico. 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.
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.
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.
PoC: Escalando privilegios con 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.
Una vez tengamos claro esto, debemos compilar el exploit escrito en 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. Si pensamos en el hardening de servidores 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í.
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. Ya lo tenemos migrado al famoso framework de explotación Metasploit.
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.