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.

  1. 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).

  2. 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.

  3. 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.

  4. 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

  1. Öffne Excel mit einer leeren Arbeitsmappe

  2. Drücke ALT+F11, um den VBA-Editor zu starten

  3. 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.

  4. Drücke CTRL+G, um das Direktfenster (Immediate Window) anzuzeigen

  5. 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