sábado, febrero 08, 2014

Explotar un 0day de Format Strings en mp3blaster para Linux. ¿Vulnerabilidades del pasado?

Hay días en que apetece leer código, mucho código, y dar rienda suelta a la imaginación entre los fuentes de alguna aplicación en busca de fallos de seguridad. Después de pasar 2 horas revisando aplicaciones aleatorias, me tropiezo con mp3blaster, un reproductor de mp3 basado en consola (ncurses). Ya que cualquier día parece bueno para encontrar un format string, instalo la última versión (la 3.2.5) en Ubuntu 13.10 (sudo apt­get install mp3blaster) y me encuentro con una evidente vulnerabilidad en la siguiente función del fichero main.cc.
void
warning(const char *txt, ... )
{

va_list ap;
char buf[1025];
mw_clear();
move(LINES­2,1);
attrset(COLOR_PAIR(CP_ERROR)|A_BOLD);
va_start(ap, txt);
vsnprintf(buf, 1024, txt, ap);
va_end(ap);
addnstr(buf, (COLS > 14 ? COLS ­ 14 : 1));
attrset(COLOR_PAIR(CP_DEFAULT)|A_NORMAL);
refresh();
}
La función vsnprintf() utiliza el parámetro txt como cadena de formato. warning() es llamada desde fw_convmp3(), una función que se invoca cuando el usuario quiere convertir un fichero MP3 a formato WAV:
void
fw_convmp3(const char *tmp, void *args)
{

char **selitems;
...
...
if (!(decoder = new Mpegfileplayer(Fileplayer::AUDIODRV_OSS)) ||
                       !decoder­>openfile(file,
                       file2write, WAV) || !decoder­>initialize(NULL))
     {

sprintf(bla, "Decoding of %s failed.", selitems[i]);
warning(bla);
selitems[i] contiene el nombre del fichero que el usuario desea convertir. El bug puede reproducirse de la siguiente manera: se crea un fichero con nombre “%n.mp3” en blanco, y se pulsa F1 dentro de mp3blaster para seleccionarlo, luego se pulsa F6 para invocar la función de conversión, el programa le solicitará un directorio para guardar el fichero WAV convertido, se pulsa ENTER et voilà!

Figura 1: Se seleccionar el fichero que explota el bug
Figura 2: Cuando se trata de guardar con F6 se produce el bug

Como se ha observado en el último fragmento de código, el fichero mp3 tiene que ser un archivo inválido, puesto que la llamada a warning() sólo se ejecuta cuando la conversión de MP3 a WAV falla. En caso contrario, es decir, con una canción mp3 normal pero con el nombre manipulado se ejecutarían las siguientes instrucciones:
sprintf(bla, "Converting '%s' to wavefile, please wait.", selitems[i]);
mw_settxt(bla);
...que no conducen al punto que nos interesa.

La vulnerabilidad puede ser explotada fácilmente (permitiendo una sobrescritura arbitraria de la memoria) en sistemas y versiones de GCC que no compilen el código con la directiva de seguridad FORTIFY_SOURCE aplicada. Observa en la siguiente ilustración cómo pueden volcarse valores de la memoria con un nombre particularmente diseñado:

Figura 3: Explotando el bug

Es más, para los incrédulos y aquellos que como yo pensaron al principio que el set de caracteres limitados para el nombre de un archivo no permitiría el control del flujo del programa, muestro aquí una prueba de concepto en la que genero un fichero mediante touch y perl en la línea de comandos, con una cadena de formato especialmente manipulada para redirigir el registro EIP de un sistema de 32 bits hacia la famosa dirección 0xdeadbeef.

El PoC escribe los valores adecuados en la dirección de la entrada free() presente en la GOT de la aplicación vulnerable. (Incluso puede verse el archivo generado en la carpeta, en la que se detecta una codificación errónea).

Figura 4: Obteniendo el control del programa

Con lo que obtenemos el control total del programa y por lo tanto la capacidad de ejecutar código arbitrario. El libro Linux Exploiting publicado por 0xWord contiene un capítulo completo dedicado a la explotación de vulnerabilidades de cadena de formato y otro apartado interesante que describe cómo otros exploiters en el pasado han utilizado un bypass para sortear la protección FORTIFY_SOURCE en programas como sudo.

Por lo tanto, ¿son las vulnerabilidades de cadena de formato cosa del pasado? De ninguna manera, y no hacen falta herramientas de análisis estático de código para encontrarlas, tan solo curiosidad y ganas de leer código. He aquí una prueba de que un sencillo fichero mp3 podría tomar control sobre tu sistema. Mi pequeño 0day.

Feliz Hacking!!!
by blackngel, autor del libro Linux Exploiting

3 comentarios:

Anónimo dijo...

Buenos días! ;)
Pero que le echáis al café?

Juan Felipe dijo...

Muy bueno black. La verdad es que no sé de donde sacas esas ganas de enseñar al mundo con tanto amor.
Gracias por ello y un saludo

Daniel dijo...

Interesante análisis. ¿Lo informaste a los desarrolladores?

Saludos desde Buenos Aires!

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares