
Un'implementazione VBA della tecnica RunPE o come bypassare l'application whitelisting.
Un'implementazione semplice ma efficace della tecnica RunPE in VBA. Questo codice può essere utilizzato per eseguire eseguibili dalla memoria di Word o Excel. È compatibile sia con le versioni a 32 bit che a 64 bit di Microsoft Office 2010 e successive.
Maggiori informazioni qui:
https://itm4n.github.io/vba-runpe-part1/
https://itm4n.github.io/vba-runpe-part2/

Exploit alla fine del codice, imposta il percorso del file che desideri eseguire.strSrcFile = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
/!\ Se stai usando una versione a 32 bit di Microsoft Office su un sistema operativo a 64 bit, devi specificare i binari a 32 bit.
strSrcFile = "C:\Windows\SysWOW64\cmd.exe"
strSrcFile = "C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"
strArguments = "-exec Bypass"
Questo verrà utilizzato per formare una riga di comando equivalente a:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -exec Bypass
(Opzionale) Abilita Visualizza > Finestra Immediata (Ctrl+G) per controllare i log di esecuzione ed errori.
Esegui la macro Exploit!
pe2vba.py per convertire un file PE in VBA. In questo modo, può essere direttamente incorporato nella macro.user@host:~/Tools/VBA-RunPE$ ./pe2vba.py meterpreter.exe
[+] Created file 'meterpreter.exe.vba'.
RunPE.vba con il contenuto del file .vba generato nel passaggio precedente.' ================================================================================
' ~~~ EMBEDDED PE ~~~
' ================================================================================
' CODE GENRATED BY PE2VBA
' ===== BEGIN PE2VBA =====
Private Function PE() As String
Dim strPE As String
strPE = ""
PE = strPE
End Function
' ===== END PE2VBA =====
(Opzionale) Abilita Visualizza > Finestra Immediata (Ctrl+G) per controllare i log di esecuzione ed errori.
Esegui la macro Exploit!
/!\ Quando si utilizza un PE incorporato, la macro passerà automaticamente a questa modalità perché il metodo PE() restituirà una stringa non vuota.
GetThreadContext() fallisce con codice errore 998.Potresti ottenere questo errore se esegui questa macro da una versione a 64 bit di Office. Come soluzione alternativa, puoi spostare il codice in un modulo piuttosto che eseguirlo dai riferimenti dell'oggetto Word. Grazie a @joeminicucci per il suggerimento.
================================================================================
[*] Source file: 'C:\Windows\System32\cmd.exe'
[*] Checking source PE...
[*] Creating new process in suspended state...
[*] Retrieving the context of the main thread...
|__ GetThreadContext() failed (Err: 998)
Non ho idea del perché questa soluzione alternativa funzioni per il momento. L'ho comunque investigata un po'. Questo errore sembra essere causato dal fatto che la struttura CONTEXT non è allineata correttamente nella versione a 64 bit. Ho notato che anche la dimensione della struttura è errata ([VBA] LenB(CONTEXT) != [C++] sizeof(CONTEXT)) mentre va bene nella versione a 32 bit. Ho una soluzione funzionante che permette a GetThreadContext() di restituire correttamente, ma poi rompe altre cose durante l'esecuzione.
Modifica 2019-12-15: la definizione della versione a 64 bit della struttura CONTEXT era effettivamente errata, ma risolvere ciò non ha risolto il bug. Quindi, ho implementato una soluzione alternativa per la versione a 64 bit. Ho sostituito l'argomento della struttura CONTEXT delle funzioni GetThreadContext() e SetThreadContext() con un array Byte della stessa dimensione.
Modifica 2019-12-17: Ho finalmente trovato il problema. La mia prima ipotesi era corretta, la struttura CONTEXT deve essere allineata a 16 byte in memoria. Questo è qualcosa che puoi controllare in C usando align(16) nella definizione della struttura, ma non puoi controllarlo in VBA. Pertanto, GetThreadContext() e SetThreadContext() potrebbero fallire "casualmente". Gli array Byte d'altra parte sembrano essere sempre allineati a 16 byte, ecco perché questa soluzione alternativa è efficace ma non c'è garanzia, a meno che non faccia reverse engineering dell'interprete/compilatore VBA e lo capisca?!
LongPtr - Tipo definito dall'utente non definitoSe ricevi questo errore, significa che stai eseguendo la macro da una versione obsoleta di Office (<=2007). Il tipo LongPtr è stato introdotto in VBA7 (Office 2010) insieme al supporto dell'API Windows a 64 bit. È molto utile per gestire i puntatori senza doversi preoccupare dell'architettura (32 bit / 64 bit).
Come soluzione alternativa, puoi sostituire tutte le occorrenze di LongPtr con Long (a 32 bit) o LongLong (a 64 bit). Usa Ctrl+H nel tuo editor di testo preferito.
@hasherezade - Implementazione completa di RunPE (https://github.com/hasherezade/)
@Zer0Mem0ry - RunPE a 32 bit scritto in C++ (https://github.com/Zer0Mem0ry/RunPE)
@DidierStevens - Incorporamento PE in VBA
Questo codice è stato testato sulle seguenti piattaforme:
Ecco una tabella di corrispondenza tra alcuni tipi Win32 e VBA:
(*) LongPtr è un tipo "dinamico", è lungo 4 byte in Office a 32 bit e 8 byte in Office a 64 bit. https://msdn.microsoft.com/fr-fr/library/office/ee691831(v=office.14).aspx
| C++ | VBA | Arch |
|---|
| BYTE | Byte | 32 & 64 |
| WORD | Integer | 32 & 64 |
| DWORD, ULONG, LONG | Long | 32 & 64 |
| DWORD64 | LongLong | 64 |
| HANDLE | LongPtr(*) | 32 & 64 |
| LPSTR | String | 32 & 64 |
| LPBYTE | LongPtr(*) | 32 & 64 |