
Eine VBA-Implementierung der RunPE-Technik oder wie man die Anwendungs-Whitelist umgeht.
Eine einfache, aber effektive Implementierung der RunPE-Technik in VBA. Dieser Code kann verwendet werden, um ausführbare Dateien aus dem Arbeitsspeicher von Word oder Excel auszuführen. Er ist sowohl mit 32-Bit- als auch mit 64-Bit-Versionen von Microsoft Office 2010 und höher kompatibel.
Weitere Informationen hier:
https://itm4n.github.io/vba-runpe-part1/
https://itm4n.github.io/vba-runpe-part2/

Exploit-Prozedur am Ende des Codes den Pfad der Datei, die Sie ausführen möchten.strSrcFile = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
/!\ Wenn Sie eine 32-Bit-Version von Microsoft Office auf einem 64-Bit-Betriebssystem verwenden, müssen Sie 32-Bit-Binärdateien angeben.
strSrcFile = "C:\Windows\SysWOW64\cmd.exe"
strSrcFile = "C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"
strArguments = "-exec Bypass"
Dies wird verwendet, um eine Befehlszeile zu bilden, die Folgendem entspricht:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -exec Bypass
(Optional) Aktivieren Sie Ansicht > Direktfenster (Strg+G), um Ausführungs- und Fehlerprotokolle zu überprüfen.
Führen Sie das Exploit-Makro aus!
pe2vba.py, um eine PE-Datei in VBA zu konvertieren. Auf diese Weise kann sie direkt in das Makro eingebettet werden.user@host:~/Tools/VBA-RunPE$ ./pe2vba.py meterpreter.exe
[+] Datei 'meterpreter.exe.vba' erstellt.
RunPE.vba durch den Inhalt der .vba-Datei, die im vorherigen Schritt erstellt wurde.' ================================================================================
' ~~~ EINGEBETTETES PE ~~~
' ================================================================================
' VON PE2VBA GENERIERTER CODE
' ===== BEGINN PE2VBA =====
Private Function PE() As String
Dim strPE As String
strPE = ""
PE = strPE
End Function
' ===== ENDE PE2VBA =====
(Optional) Aktivieren Sie Ansicht > Direktfenster (Strg+G), um Ausführungs- und Fehlerprotokolle zu überprüfen.
Führen Sie das Exploit-Makro aus!
/!\ Bei Verwendung eines eingebetteten PE wechselt das Makro automatisch in diesen Modus, da die Methode PE() einen nicht leeren String zurückgibt.
GetThreadContext() schlägt fehl mit Fehlercode 998.Dieser Fehler kann auftreten, wenn Sie dieses Makro aus einer 64-Bit-Version von Office ausführen. Als Workaround können Sie den Code in ein Modul verschieben, anstatt ihn aus den Word-Objektverweisen auszuführen. Danke an @joeminicucci für den Tipp.
================================================================================
[*] Quelldatei: 'C:\Windows\System32\cmd.exe'
[*] Überprüfung des Quell-PE...
[*] Erstellen eines neuen Prozesses im angehaltenen Zustand...
[*] Abrufen des Kontextes des Hauptthreads...
|__ GetThreadContext() fehlgeschlagen (Fehler: 998)
Ich habe keine Ahnung, warum dieser Workaround momentan funktioniert. Ich habe das jedoch etwas untersucht. Dieser Fehler scheint dadurch verursacht zu werden, dass die CONTEXT-Struktur in der 64-Bit-Version nicht richtig ausgerichtet ist. Mir ist aufgefallen, dass die Größe der Struktur ebenfalls falsch ist ([VBA] LenB(CONTEXT) != [C++] sizeof(CONTEXT)), während sie in der 32-Bit-Version korrekt ist. Ich habe eine funktionierende Lösung, die ein korrektes Zurückgeben von GetThreadContext() ermöglicht, aber dann bricht sie andere Dinge im weiteren Verlauf der Ausführung.
Bearbeitung 15.12.2019: Die Definition der 64-Bit-Version der CONTEXT-Struktur war tatsächlich falsch, aber die Behebung hat den Fehler nicht behoben. Daher habe ich einen Workaround für die 64-Bit-Version implementiert. Ich habe das CONTEXT-Strukturargument der Funktionen GetThreadContext() und SetThreadContext() durch ein Byte-Array derselben Größe ersetzt.
Bearbeitung 17.12.2019: Ich habe das Problem endlich gefunden. Meine erste Annahme war richtig: Die CONTEXT-Struktur muss im Speicher 16-Byte-ausgerichtet sein. Das kann man in C mit align(16) in der Definition der Struktur steuern, aber in VBA kann man das nicht steuern. Daher können GetThreadContext() und SetThreadContext() "zufällig" fehlschlagen. Byte-Arrays hingegen scheinen immer 16-Byte-ausgerichtet zu sein, daher ist dieser Workaround effektiv, aber es gibt keine Garantie, es sei denn, ich reverse-engineere den VBA-Interpreter/Compiler und finde es heraus?!
LongPtr – Benutzerdefinierter Typ nicht definiertWenn Sie diesen Fehler erhalten, bedeutet dies, dass Sie das Makro aus einer alten Version von Office (<=2007) ausführen. Der Typ LongPtr wurde in VBA7 (Office 2010) zusammen mit der Unterstützung der 64-Bit-Windows-API eingeführt. Er ist sehr nützlich für die Handhabung von Zeigern, ohne sich um die Architektur (32-Bit/64-Bit) kümmern zu müssen.
Als Workaround können Sie alle Vorkommen von LongPtr durch Long (32-Bit) oder LongLong (64-Bit) ersetzen. Verwenden Sie Strg+H in Ihrem bevorzugten Texteditor.
@hasherezade – Vollständige RunPE-Implementierung (https://github.com/hasherezade/)
@Zer0Mem0ry – 32-Bit-RunPE in C++ geschrieben (https://github.com/Zer0Mem0ry/RunPE)
@DidierStevens – PE-Einbettung in VBA
Dieser Code wurde auf folgenden Plattformen getestet:
Hier ist eine Tabelle der Entsprechungen einiger Win32- und VBA-Typen:
(*) LongPtr ist ein "dynamischer" Typ, er ist 4 Bytes lang in Office 32 Bit und 8 Bytes lang in Office 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 |