Keine Shell? Kein Problem!
Host Enumeration ganz ohne CMD und PowerShell
In gehärteten Windows-Umgebungen mit strikten Sicherheitsrichtlinien sind klassische Angriffsmethoden und selbst legitime Tools oftmals blockiert. Doch auch wenn Powershell, Kommandozeile & Co. nicht mehr ausführbar sind, bietet ein kreativer Ansatz mit Visual Basic for Applications (VBA) und Windows-APIs alternative Wege.
Ausgangssituation
Im Rahmen eines Penetrationstests sollte die Sicherheit einer Microsoft Azure Virtual Desktop-Umgebung überprüft werden. Der Kunde nutzt diese Plattform, um externen Service-Partnern einen eingeschränkten Zugriff auf verschiedene Anwendungen zu ermöglichen – darunter auch einen Browser und Office-Produkte wie Excel, Word und Outlook.
Der Ausbruch aus den einzelnen Anwendungen war in wenigen Minuten erledigt und soll hier auch nicht weiter thematisiert werden – darüber gibt es schon mehr als genug Artikel im Netz.
Wirklich interessant wurde es, als es darum ging, eine Shell (Kommandozeile, PowerShell oder WMIC) zu starten, um sich anschließend einen umfassenden Überblick über die Umgebung zu verschaffen (Situational Awareness) und gezielt nach Schwachstellen für eine Rechteausweitung (Privilege Escalation) zu suchen.
Hierbei wurde schnell klar: Es handelt sich um ein ziemlich gut gehärtetes Windows 11 Enterprise-System, das offensichtlich überwiegend (später dazu mehr) nach dem CIS Level 1 Security Benchmark[1] konfiguriert worden war – inklusive Best-Practice-AppLocker-Regeln (vermutlich nach NSA AppLocker-Guidance) und aktiviertem PowerShell Constrained Language Mode[2].
Konkret bedeutet das:
Ausführung von unbekannten/unsignierten Programmen wird blockiert.
LOLBAS[3] und bekannte Systemtools wie cmd.exe, powershell.exe, regedit.exe, wmic.exe etc. sind gesperrt.
PowerShell läuft nur im Constrained Language Mode:
Nur grundlegende Built-in-Cmdlets erlaubt
Kein Laden/Verwenden von externen Skripts, Modulen, Libraries
Keine COM- oder Win32-API-Aufrufe
Keine dynamische Codeausführung
Strikte GPOs:
Einschränkung weiterer Systemfunktionen und Rechte
Erzwingen sicherer Konfigurationen und Einstellungen
Portable Programme können nicht ausgeführt werden.
SmartScreen aktiv:
Ausführung von „unbekannter“ Software wird unterbunden
Netzwerkzugriffe ggf. limitiert
Erhöhte Protokollierung und Überwachung
Zusammengenommen erschwerten diese Maßnahmen klassische Angriffs- sowie Analysemethoden deutlich und minimierten die Angriffsfläche spürbar.
Versuche der Umgehung
Die Nutzung von Visual Basic bzw. Makros als Angriffsvektor ist längst etabliert und kommt seit vielen Jahren - insbesondere bei Phishing-Kampagnen, aber auch bei Malware zum Einsatz - um initialen Zugriff auf Endgeräte der Opfer und damit auf das interne Unternehmensnetzwerk zu erhalten. Typischerweise werden dafür präparierte Office-Dokumente verwendet, die Markos ausführen.
Die meisten im Internet verfügbaren Beispiele beschränken sich letztendlich jedoch darauf, eine Shell oder die Rechner-App (calc.exe) zu starten, Executables nachzuladen und auszuführen oder laufende Prozesse auszulesen. Spezielle Tools wie macro_pack, BadAssMacros oder OffensiveVBA unterstützen dabei, bösartige Makros zu generieren und Sicherheitslösungen zu umgehen.
Zudem zeigte bereits 2016 Didier Stevens in seinem Blogbeitrag Create Your Own CMD.XLS, wie sich mit einem Excel-Makro eine Kommandozeile starten lässt und auch das Skript VBA-RunPE verfolgt einen ähnlichen Ansatz und ermöglicht es, über Word oder Excel eine Shell zu öffnen.
Beide Ansätze haben allerdings Einschränkungen: Stevens’ CMD.XLS funktioniert ausschließlich mit 32-Bit-Anwendungen und ist daher nicht mehr zeitgemäß. VBA-RunPE ist zwar flexibler und unterstützt sowohl 32-Bit- als auch 64-Bit-Anwendungen, allerdings nutzt es zur Erzeugung der Shell eine Technik (Einfügen von Shellcode in eine neue Instanz eines legitimen Prozesses), die auch von Malware eingesetzt wird. Deshalb stufen viele Sicherheitssysteme das Verhalten von VBA-RunPE als schädlich ein und blockieren dessen Ausführung.
Doch selbst wenn dies nicht der Fall wäre, würde mir diese Methode in meinem Fall kaum weiterhelfen, da mich der Constrained Language Mode, die restriktiven AppLocker-Regeln und Gruppenrichtlinien stark einschränken und selbst viele legitime Systemtools nicht ausgeführt werden dürfen.
Da die genannten Ansätze unter diesen Bedingungen nicht zielführend sind, motivierte mich dies, einen eigenen Bypass zu entwickeln – unabhängig von CMD oder PowerShell und selbst bei restriktiver AppLocker-Policy anwendbar.
Was kann VBA eigentlich noch?
Angesichts der zahlreichen Möglichkeiten, die VBA bietet, stellte ich mir die Frage:
„Was kann ich mit VBA eigentlich noch alles machen?“
Trustedsec zeigte 2020 in einem mehrteiligen Blogbeitrag (Malicious Macros for Script Kiddies), dass VBA viel mehr kann, als nur Payloads nachzuladen oder eine Shell zu starten:
VBA is a powerful scripting language that exposes numerous APIs, objects, and events allowing the programmer to interact with the system from the somewhat privileged context of a trusted application. We can make use of VBA code, COM objects, OLE automation, and Win32 APIs to explore the host, access the filesystem, and run commands.
VBA bietet also weit mehr Möglichkeiten, als ich zuerst vermutet hätte.
Möglicherweise lassen sich mittels Zugriff auf Windows-APIs, Registry und Dateisystem detaillierte Systeminformationen sammeln und potenzielle Schwachstellen zur Rechteausweitung identifizieren?
Eine weitere Tatsache ist, dass die zugrundeliegende Funktionalität von WMI weiterhin nutzbar bleibt, selbst wenn der Zugriff auf wmic.exe, cscript.exe und wscript.exe blockiert ist.
Mithilfe der WMI Scripting API kann über den sogenannten „winmgmts:“-Moniker[4] ein Namespace, eine Klasse oder eine Instanz adressiert werden. Der Windows Script Host nutzt anschließend die WMI-Schnittstelle, um eine Verbindung herzustellen, und liefert als Ergebnis ein SWbemServices-Objekt zurück. Über dieses Objekt kann dann mit WMI-Objekten weitergearbeitet werden.
Das folgende Codebeispiel zeigt, wie sich mit Hilfe des genannten Monikers die auf dem System installierten Hotfixes ermitteln und in der Debug-Konsole ausgeben lassen:
Sub ListHotfixes()
Dim objWMIService As Object
Dim colHotFixes As Object
Dim objHotFix As Object
' Connect to WMI
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
' Query installed Hotfixes
Set colHotFixes = objWMIService.ExecQuery("Select * from Win32_QuickFixEngineering")
For Each objHotFix In colHotFixes
' Print the HotFix ID to the Debug Console
Debug.Print objHotFix.HotFixID
Next
End Sub
Die Summe dieser Überlegungen und Experimente führte schließlich zur Entwicklung von MacroMania.
MacroMania
MacroMania ist im Wesentlichen der Versuch, klassische Prüfungen zur Situational Awareness und Privilege Escalation möglichst ausschließlich mit VBA durchzuführen – ohne CMD, PowerShell, LOLBAS oder das Nachladen von Code.
Stattdessen werden Systemabfragen und Auswertungen ausschließlich über die Windows-API sowie den WMI-Moniker umgesetzt.
Dadurch eignet sich MacroMania besonders für gehärtete Umgebungen, in denen klassische Tools und Shells geblockt sind oder nicht eingesetzt werden können.
Einschränkungen
Folgende Aspekte wurden bewusst ausgeklammert, da der Schwerpunkt auf Machbarkeit und technischem Nachweis lag, weniger auf OPSEC oder Umgehungsstrategien. Für entsprechende Szenarien sollten diese Aspekte jedoch mit in Betracht gezogen werden.
Einschränkungen bei signierten Makros
In manchen Umgebungen dürfen ausschließlich digital signierte Makros ausgeführt werden. Im TrustCenter ist dann die Einstellung „Alle Makros, außer digital signierten Makros deaktivieren“ aktiv.
Für MacroMania ist dies jedoch weniger relevant, da der Code nicht über eine Excel-Datei verteilt, sondern (in einem neuen Dokument) direkt im VBA-Editor eingefügt und ausgeführt wird. In manchen Fällen existieren zudem vertrauenswürdige Speicherorte, in denen Office-Dateien mit Makros uneingeschränkt geöffnet werden dürfen (siehe Microsoft Learn – Trusted Locations for Office files).Attack Surface Reduction-Regeln
Microsoft Defender Attack Surface Reduction[5] (ASR) blockiert das Erzeugen von Child-Prozessen und den Aufruf der Win32 API. Mit aktivierten Regeln würde MacroMania vermutlich nicht mehr (oder nur noch teilweise) funktionieren.
In der Testumgebungen war das Regelwerk jedoch auf „Audit Only“ gesetzt, sodass keine Blockierung stattfand.Sichtbarkeit durch Monitoring
Die Verwendung von WMI und anderen Makrofunktionen kann durch Monitoring-Lösungen (z. B. Sysmon, WMI-Event-Logging, EDR/XDR) erkannt und protokolliert werden. Dies ist insbesondere im Rahmen von Red Teaming Assessments relevant.
Einschränkungen bei der Umsetzung in VBA
Nicht alle Checks lassen sich direkt in VBA umsetzen. Insbesondere gibt es keine einfache API, um die effektiven Rechte aus einer ACL vollständig auszuwerten. Daher wurden teilweise heuristische Prüfungen eingesetzt, die zwar keine exakten Berechtigungen liefern, aber zuverlässig auf potenziell unsichere Konfigurationen hinweisen, ohne dass der Code zu komplex oder die Laufzeit zu lang wird.
Umgesetzte Checks
Die entwickelten Checks basieren auf denen von winPEAS und ermöglichen beispielsweise das Auslesen von Sicherheitseinstellungen, Benutzerberechtigungen, Registry-Werten und weiteren sicherheitsrelevanten Systeminformationen.
Folgende Informationen werden ausgegeben:
Allgemeine Informationen
Systeminfo
Netzwerk Interfaces
Installierte Sicherheitsupdates (KB)
Windows Update History
Festplatten und Netzwerkshares
Installierte Antivirus-Produkte
Umgebungsvariablen
Lokale Benutzer
Lokale Gruppen
Auslesen von Registry-Einträgen
Audit Log Settings
Windows Event Forward
LAPS
WDigest
LSA Protection
Credential Guard
WinLogon Credentials
RDCMan Settings
RDP Saved Connections
Putty Stored Credentials
Putty SSH KNOWN HOSTS
OpenSSH Keys
WinVNC Passwords
SNMP Passwords
TightVNC Passwords
UAC Settings
Recently Run Commands
Always Install Elevated
PowerShell Info
PowerShell Registry Transcript
PowerShell Module Log
PowerShell Script Block Log
WSUS check for HTTP
Internet Settings
Klassische Privilege Escalation Checks
Running processes and user permissions
Vulnerable Service paths
Unquoted Service Paths
Service Registry Permissions
Scheduled Tasks
Installed Applications
Ausgabe der AppLocker Richtlinien
Die Ergebnisse werden sowohl in der Direktfenster (Immediate Window) als auch in entsprechenden Excel-Tabellen ausgegeben. Das Direktfenster ist jedoch nicht für die Analyse oder die strukturierte Auswertung großer Datenmengen geeignet, sondern dient vor allem der schnellen Kontrolle und Fehlersuche während der Entwicklung und beim Testen der Audit-Skripte. Für eine geordnete und übersichtliche Auswertung sollten die erstellten Excel-Tabellen genutzt werden.
HowTo
Öffne Excel mit einer leeren Arbeitsmappe
Drücke ALT+F11, um den VBA-Editor zu starten
Im VBA-Editor: Rechtsklick auf „VBA-Project“ -> „Datei importieren…“ auswählen und die gewünschten Module laden. Alternativ die Module per Drag & Drop in das Projekt ziehen.
Drücke CTRL+G, um das Direktfenster (Immediate Window) anzuzeigen
Starten (F5) und RunMacroMania auswählen, um das Audit-Skript zu starten.
Beispielausgaben
Um zu verifizieren, dass die Checks auch alle korrekt funktionieren, wurde MacroMania auf einem speziell präparierten (verwundbaren) Testsystem ausgeführt.
Die folgenden Screenshots zeigen einige die Ausgaben, wie sie nach Ausführen des Skriptes im Excel-Sheet angezeigt werden.
System Information
Benutzer und Gruppen
Hotfixes und Updates
Verschiedene PrivEsc Checks
Bonus
Durch den Einsatz einer UserForm
lässt sich auch eine minimalistische, textbasierte Kommandozeilenoberfläche umsetzen. In dieser können einfache Dateisystembefehle (wie dir
, cd
, mkdir
, del
), Systemabfragen (etwa whoami
, tasklist
, printenv
) sowie das Ausführen von Programmen (exec
) direkt innerhalb von VBA-Skripten ausgeführt werden – vollständig ohne externe Tools, ausschließlich über das Office-Objektmodell und WMI.
Empfehlungen
Durch die Umsetzung geeigneter Schutzmaßnahmen lassen sich die Auswirkungen einer Angriffssituation, wie sie durch das Tool simuliert wird, wirksam verhindern.
Aktivierung geeigneter Microsoft Defender Attack Surface Reduction-Regeln[6] zur Verhinderung der Ausführung potenziell schadhafter Makros.
Umsetzung der Empfehlungen aus dem CIS Security Benchmark für Microsoft Office[7], angepasst an unternehmensspezifischen Schutzbedarf.
Entfernen oder restriktives Konfigurieren nicht benötigter Office-Funktionen (z. B. Deaktivieren von VBA, sofern nicht erforderlich).
Überwachung und Protokollierung von WMI- und Makroaktivitäten zur schnellen Erkennung von Missbrauch oder Anomalien (Sysmon, WMI Event Logging, EDR/XDR).
Fazit
MacroMania zeigt: Wo klassische Wege (Shells, LOLBAS, Process Injection) blockiert werden, kann ein kreativer Einsatz von Makrofunktionen eine wirksame Alternative darstellen. Gerade in modernen, gut gehärteten Umgebungen lohnt es sich, auch ungewöhnliche Ansätze zu verfolgen und die in Office integrierten Bordmittel gezielt zur Analyse von Security-Kontrollen oder zum Aufspüren von Schwachstellen zu nutzen.
Macromania und die VBA Shell sind ab sofort in unserem GitHub-Repo verfügbar:
https://github.com/mgm-sp/MacroMania
[1] https://www.cisecurity.org/benchmark/microsoft_windows_desktop
[2] https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_language_modes
[3] https://lolbas-project.github.io
[4] https://learn.microsoft.com/en-us/windows/win32/wmisdk/connecting-to-wmi-with-vbscript
[5] https://learn.microsoft.com/en-us/defender-endpoint/attack-surface-reduction
[6] https://learn.microsoft.com/en-us/defender-endpoint/enable-attack-surface-reduction
[7] https://www.cisecurity.org/benchmark/microsoft_office
Autor
Jan Rude ist seit zehn Jahren als Penetrationstester tätig. Bereits während seines Studiums der Technischen Informatik hatte er Kontakt mit Hardware und IT-Sicherheit – Themen, die ihn seither begleiten.
Seit 2018 ist er bei mgm tätig und verantwortet dort unter anderem die Durchführung von Infrastruktur und IoT-Pentests.
Sie haben Fragen, oder wollen sich unverbindlich beraten lassen?
Nehmen Sie Kontakt per E-Mail auf, rufen Sie uns an oder nutzen Sie unser Kontaktformular.
Ihr Ansprechpartner
Thomas Schönrich
Nehmen Sie Kontakt per E-Mail auf, rufen Sie uns an oder nutzen Sie unser Kontaktformular.