LabF nfsAxe 3.7 — Buffer Overflow

En la búsqueda de algunas herramientas básicas para levantar unos servicios encontré nfsAxe versión 3.7, donde mas aya de su instalación y ver su funcionamiento me puse a probar suerte y buscar algunas vulnerabilidades.
 
 Primero que todo busque si existía algún exploit publico para la versión que estaba utilizando, donde encontré un par de ellos y eran de tipo remoto así que no era necesario buscar si tenia una vulnerabilidad de este tipo. Entonces mi enfoque fue encontrar algo mas local que remoto en realidad alguna vulnerabilidad en sus campos que me permitiese ejecutar código en el sistema.

Bueno para no seguir aburriendo pasemos a lo practico.

Lo primero que se me ocurrió fue probar algunas configuraciones de un servicio de Tftp el cual me permitió generar un crash en el binario.

A partir de este crash el siguiente paso fue analizar e identificar las funciones donde se producía el error de desbordamiento. Así que procedemos a ejecutar el binario y atachamos con IDA para buscar algunos indicios y ver hasta donde podríamos llegar.
 
 Después de atachar y revisar sus funciones podemos identificar donde se ejecuta el programa que nos levanta el dialogo para introducir la strings, donde después de cerrar la ventana de dialogo procede con el flujo a la función sub_402BB0.

Podemos observar que tenemos 4 campos para introducir valores que serán almacenados en uno o distintos buffer, es aquí donde esta el crash y la supuesta vulnerabilidad que nos permitiría ejecutar código.

Aquí me encuentro con una función que copia todos los bytes del campo File(s) en un buffer [Dest] length 80h luego cuenta cuantos bytes fueron copiados y el resultado es 0x4E = 78 bytes de modo que aquí no se produce ningún desbordamiento porque hay otra función que filtra la cantidad de bytes ingresados.

seguimos con el flujo y nos encontramos con un bucle que verifica el valor de [Dest] sea menor a 0x3A de no ser así se incrementa ESI hasta igualar a EBP con 0x4E, cuando esta condición no se cumpla tomara el flujo de la flecha roja a la identificada función vulnerable. Eso si hay que tomar bien en cuenta que la llamada función vulnerable no es todo ya que como esto se divide en 4 buffer distintos es necesario tener control de cada uno de ellos para mas adelante poner algún shellcode.

El loc_4021B6 contiene la vulnerabilidad de desbordamiento, donde aquí pasamos varios argumentos hacia la función sprintf() 0x004021DC y a strcpy() 0x004021F2.
 
 En la función sprintf() enviamos 5 argumentos como buffer de destino [var_120] length 80h mas otros valores como format “%s:%s%s” y los strings ingresados en los input.
 
 Después de pasar por sprintf() el buffer [var_120] queda con toda la data ingresada. donde seguidamente se copiara en otro buffer [ArgList] length 80h utilizando strcpy(), que es aquí cuando se pisan las demás variables llegando a tomar el control de EIP.

Data almacenada en buffer llamado [var_120].

Data almacenada en buffer llamado [ArgList].

Ejecución y control del retorno registro EIP.

Lista de buffer desbordados.

Creación de Exploit
 
 
En esta ocasión no mostrare el paso a paso de la creación del exploit pero mencionare que se hizo una alineación del registro ESP para posicionar la shellcode en un espacio mas grande, ademas desarrolle una shellcode muy simple como prueba de concepto, la cual ejecutara un MessageBox y abrirá la calculadora del sistema.
 
 Video Poc:

Source Exploit:
 
 https://github.com/s1kr10s/Exploit_LabF-nfsAxe/blob/master/nfsAxe.py
 
 https://www.exploit-db.com/exploits/43930/