dimanche 11 juin 2017

"Heaven's Gate" la porte du ciel ou des enfers !

 

I.    Introduction

Le Malware Vawtrak également connu sous le nom de NeverQuest et Snifula détourne la technologie Heaven's Gate pour basculer de l'environnement 32bits à l'environnement 64bits.
Il exploite le fait que sur un système d'exploitation Windows 64 bits, vu que l'ensemble des composants du noyau s'exécute en mode 64 bits que ce soit l'espace d'adressage , les structure essentielles de OS ( PEB / TEB / EPROCESS etc.. ). En fait l'ensemble des processus sur ce type d'OS sont des processus X64.Et il faut voir tous les processus X32 comme des processus X64 brider et commuté en exécution du code 32 bits.

II.          Le loader Windows 64 bits pour les processus 32bits

Le premier bloc de code chargé par le loader Windows en x64 qui aussi appelé en premier dans n'importe quel processus que ce soit un x32 ou x64 est toujours le ntdll.dll(x64)
c'est ntdll.dll(X64) qui prend en charge l'initialisation du processus en mode utilisateur et en temps que processus 64 bits. c'est seulement plus tard que si l'image du binaire de l'exécutable est en x32 qu'il intégrer l'interface Wow64 ( Windows to Windows)  pour lui passer la main pour charge son homologue 32 bits d'ntdll.dll et  commute un segment ou un flag  pour que l'exécution bascule réellement en 32 bits.
En fait il faut voir cette ntdll.dll 32 bits comme un proxy  vers sa jumelle en 64 bits.
De la un processus x32 ne revient plus en 64 bits. de sorte que les appels système sont fait au travers de Ntdll 32 bits qui commute du monde 32 bits vers 64 bits de sorte qu'elle puisse faire l'appel demandé au système en 64 vers OS windows et au retour rebascule de 64bits en 32bits.

III.     Mémoire du processus 32 bits (WOW)

Voici la représentation  mémoire d'un process 32 bits sur un OS windows 64 bits.

IV.        Le sélecteur de segment CS (0x33 / 0x23 )

Tous cela repose sur un sélecteur ( d'un segment ) notre sélecteur de segment CS (0x33 / 0x23 ) est le commutateur pour passer du mode X32(WoW64) au mode 64 bits native dans un processus. En raison de cette propriété spéciale, il a été baptisé sous le nom de « Heaven's Gate »

Cette technique "Heaven's Gate" permet dynamiquement de basculer en x64 et 
d'effectuer des appel de code 64 bits à partir d'un processus de 32 bits.

V. Intérêt pour les Malwares de "Heaven's Gate"

Cela est utilisé par les malwares pour d'autre raison  par exemple d'éviter les hooks sur les APIs utilisées dans les logiciel de protection ou de sortir des sambox.

les malwares utilisent des appels à des Apis native au lieu des Api standard. De même on peut classer Heaven's Gate  dans la catégorie de l'obscuration  du code car les débogueurs de code existants ne sont pas les meilleurs voir incapable d'analyser du  code 64 bits en  exécution  à partir d'un processus de 32 bits. Car celui considère les Opcodes comme étant ce d'un environnement X32 !

Maintenant rien interdit de faire l'inverse "Hells's gate" de passer de X64 vers X32 pour bénéficier des mêmes avantage sur shellcode

VI.        Mise en pratique de la technique

Vous aurez toujours 4 dlls inclus dans votre process X32 sur un OS Windows 64bits. Elles sont Ntdll.dll, wow64.dll , wow64Win.dll et wow64cpu.dll

Nous avons crée un petit programme pour visualiser les différents éléments


Ce programme ArchWOW64.exe permet de disposer de l'adresse du PEB64 et donc d'accéder
au DLL. Nous avons effectué les testes sur Win7(X64) et Win8(X64) . Nous avons trouver plus d'intérêt à l'OX Win8. Car les adresses des de Ntdll.dll(X64) ne sont jamais dans espace adressable par un processus X32 

Un process X32 a un espace d'adressage de 0x00000000 à 0xFFFFFFFF qui contient l'image de l'exécutable et des ses DLLs 32bits

Hors les Dlls X64 étant intégré par le loader Windows en 64 bits avant le basculement en processus 32 bits. Elles peuvent et elles sont souvent dans des plages adresses non accessible par un processus 32 bites en tous cas pour Win8. Ce que l'on voit bien dans exemple au dessus, notre Dll Ntdll.dll en 64 bits ce trouve à l'adresse 0x7FF95A130000

Par contre lors des testes sur Win7 l'adresse reste l'espace d'adressage d'un processus 32bits

En premier pour listes des Dlls via le PEB64, il nous faut connaître  l'adresse  du PEB64 de notre process 32 bits. Cette opération est assez simple pour cela nous utilisons un shellcode dédié


unsigned char ShellCode_AsmGetPebX64[] =
"\x6A\x33"                                            // PUSH 33h  Selector X64
"\xE8\x00\x00\x00\x00"                                    // CALL Next instruction (Conctruction de l'address start code X64)    
"\x83\x04\x24\x05"                              // ADD  DWORD PTR [ESP],5
"\xCB"                                                 // RETF            
"\x65\x48\x8B\x04\x25\x60\x00\x00\x00"  // MOV RAX,QWORD PTR GS:[60h]
"\xE8\x00\x00\x00\x00"                                    // CALL Next instruction (Conctruction de l'address start code X32)    
"\xC7\x44\x24\x04\x23\x00\x00\x00"    // MOV DWORD PTR [ESP+4],23h
"\x83\x04\x24\x0D"                              // ADD WORD PTR [ESP],0Dh
"\xCB"                                                 // RETF
"\xC3";                                                // RET 


Pour l'appel rien non plus de très nouveaux


char szMemory[50];
memcpy((PBYTE)&szMemory[0],&ShellCode_AsmGetPebX64,sizeof(ShellCode_AsmGetPebX64));

DWORD dwflOldProtect=0;        
VirtualProtect(&szMemory, sizeof(ShellCode_AsmGetPebX64), PAGE_EXECUTE_READWRITE, &dwflOldProtect);

DWORD dwAddrPEBX64 =(*((DWORD (__stdcall *)(void))&szMemory))();

std::string sDisplay = "PEB64 pPEB64:0x" + Convert_DWORD64_To_sHex(dwAddrPEBX64) ;
sApi_SetDlgItemText(this->m_hWnd,IDC_ED_REPORT,sDisplay);


Maintenant que nous avons l'adresse du pPEB64, nous allons parcourir les structures LDR_MODULE64 chaîné au travers InLoadOrderModuleList.

Etant dans un environnement 64 bits les offsets sont différents de ce utilisé dans nos autres exemple 32 bits

Nous avons Zoomé sur les parties PEB64 & PEB_LDR_DATA64 et préciser tous les offsets