Explotar un Buffer Overflow con "limitaciones" (0day en VDJ)

Iniciado por AlexAltea, 26 Marzo 2013, 03:46 AM

0 Miembros y 1 Visitante están viendo este tema.

AlexAltea

Muy buenas! Acabo de encontrar en un programa un buffer overflow algo gracioso:

Se leen todos los bytes de un archivo y se guardan en un buffer en la dirección 0x088399C8. Hasta ahí todo bien. Luego se comprueban cuáles de todos esos bytes están en el rango 'A'-'Z' y si es así, se meten en un segundo buffer de caracteres en el stack. Si rellenamos el archivo con muchos bytes 'A'-'Z', este segundo buffer peta y acabamos con varios registros modificados, incluido el EIP.

El problema es cómo desviar la ejecución a la dirección que me interesa si solo soy capaz de meter bytes de la 'A' a la 'Z' en el EIP, es decir, solo puedo lograr cosas como 0x41414141, 0x41424344, 0x534E4F50, ... En el EAX o ECX creo que aún podría hacer un apaño para que cogiese un valor arbitrario.
¿Alguna idea de por donde seguir? ¿Es esto una limitación imposible de saltar al diseñar un exploit?

Tan solo bastaría lograr de alguna manera un salto a 0x088399C8 para lograr la queridísima "ejecución de código arbitrario", por desgracia 0x08, 0x83, 0x99 y 0xC8 no son "letras mayúsculas".
:-\

int_0x40

¿Notaste si puedes modificar la dirección de retorno de la función en cuestión? Vuelve a releer con atención este clásico sobre el tema--->

http://www.phrack.org/issues.html?issue=49&id=14&mode=txt

Saludos.
"The girl i love...she got long black wavy hair "

AlexAltea

#2
Todo solucionado.
Aprovechando que EDI apuntaba a un buffer que contenía todos los bytes (y no solo las mayúsculas), me bastó con buscar una dirección de la memoria representable con letras mayúsculas que contuviese un CALL EDI.

Al final lo encontré en 0x44465346 ("FSFD"), que correspondía en este programa a "urlmon.dll". Luego me encontré con que el cabrón del programa metía un 0xC3 (RETN) delante de cada byte no imprimible en ASCII, así que tuve que hacer algunas cosa más, pero bueno fue fácil.

El resultado es éste (podeis considerarlo el PoC de un 0day si quereis):

[youtube=560,315]http://www.youtube.com/watch?v=PJeaWqMJRm0[/youtube]

Belial & Grimoire

felicidades, lo resolviste bien

una pregunta, dejame ver si lo entendi

lo que hiciste fue, buscar un buffer que aceptara ascii y en este caso fue mediante el lector de Tag que invocaba un Call para guardar el buffer en EDI,  sobreescribiste el buffer guardado en EDI para llegar al ret y brincar a la direccion de memoria que buscabas y como Call suma el siguiente registro, lograste sobreescribir el buffer de la direccion que buscabas junto la EIP,  logrando despues la ejecucion de la shell?

otra pregunta, podrias poner tu codigo, seria inetresante saber como lo hiciste, todavia me cuesta trabajo entender las direcciones de memoria, lo estoy aprendiendo con el uso de PEB y lo poco que llevo de ASM

saludos y nuevamente felicidades por tu exploit 0day
.                                 

AlexAltea

Hola! No he entendido muy bien eso XD..
Pero he escrito un post en mi blog sobre la vulnerabilidad y como explotarla:
http://functionmixer.blogspot.com.es/2013/03/vulnerabilidad-virtualdj-prohome-73.html

Me refiero es que hay dos buffers que toman el valor del título del MP3:

  • El primero almacena todos los caracteres ASCII imprimibles del título (si no lo son, mete un RETN delante "por si acaso"). Este primer buffer no es vulnerable
  • El segundo, de longitud 4100, almacena caracters ASCII de la A a la Z que contenga el título y es en este donde esta el problema.

...el resto lo explico en el artículo de antes y mi mensaje anterior.  ;)
Incluyo el código también así que puedes explotarlo y con algun depurador ver lo que sucede.

AlexAltea

#5
Aunque corrigieron la vulnerabilidad que dije, resulta que acabo de encontrar otra más en la última versión del programa (VirtualDJ Pro/Home v7.4). Vuelve a ser un buffer overflow por culpa de los tags ID3. Se produce cuando el programa intenta buscar automáticamente una caráctula en Google Imágenes para un archivo MP3 malintencionado. El buffer que contiene la request a Google ("http://images.google.com/images?q=[Tag_ID3_'Título]") puede resultar "pequeño" y dado que el programa no comprueba si el título que se va a meter después de "?q=" es demasiado grande, pues pasa lo que pasa.
;D

Si quereis más info podeis entrar aquí:
http://functionmixer.blogspot.de/2013/04/virtualdj-prohome-74-buffer-overflow.html

Y la demo la teneis aquí:
[youtube=560,315]http://www.youtube.com/watch?v=Yini294AR2Q[/youtube]


PD: He puesto el mensaje en este hilo porque en la demo vuelvo a enseñar como bypassear los filtros de caracteres que es al fin y al cabo de lo que iba el hilo al principio.

Saludos!!