
Определите, установлен ли сервис (вслепую) и/или запущен ли он (если он открывает именованные каналы) на удалённой машине, без использования прав локального администратора.
Определяет, установлена ли служба (вслепую) и/или запущена (если она предоставляет именованные каналы) на удалённой машине без использования прав локального администратора.
Если подробнее, при запуске этот скрипт подключается к целевому SMB-сервису (445/tcp) удалённо и выполняет следующее:
Проверяет, установлена ли служба, через [MS-LSAT] RPC-вызов LsarLookupNames(). Для этого не нужна привилегированная учётная запись, но возможен только «слепой» запрос (нельзя получить список служб, можно лишь узнать состояние конкретной службы).
Проверяет, существует ли на цели заданный именованный канал. Службы (процессы) могут предоставлять характерный для службы именованный канал, который может увидеть непривилегированный пользователь. Поэтому проверка именованных каналов, характерных для служб, позволяет сделать вывод о том, запущена ли конкретная служба.
Это автономный скрипт на Python с использованием Impacket, ничего устанавливать не нужно. Протестировано на актуальных Kali и Arch Linux с использованием последних официальных Impacket (0.10.0 и 0.9.24) и Python (3.9 и 3.10).
Службы, имена служб для проверки и характерные для службы именованные каналы указываются в JSON-конфигурациях (или CSV-файлах, если так удобнее, что я понял позже :), поэтому также доступен собственный конвертер csv2json) в папке conf. Чтобы понять формат, смотрите прилагаемые примеры.
Включённые файлы конфигурации:
Варианты использования могут быть расширены дополнительными службами / именованными каналами; конфигурация EDR довольно неполная, не стесняйтесь добавлять больше.
Скрипт использует JSON-формат конфигурации, но позже я понял, что писать CSV гораздо удобнее, поэтому включил скрипт csv2json.py для преобразования CSV в JSON.
Запуск против одной цели для перечисления AV/EDR-служб (или чего-либо ещё) прост:
./serviceDetector.py -conf conf/edr.json evil.corp/johndoe:[email protected]
Также поддерживается аутентификация Kerberos (переменная окружения KRB5CCNAME указывает на файл ccache):
./serviceDetector.py -conf conf/edr.json -k -no-pass server.ecorp.local
Для эффективного запуска против нескольких целей чрезвычайно полезен GNU parallel:
cat targets.txt | parallel -j 50 ./serviceDetector.py evil.corp/johndoe:Passw0rd1@{}
Обратите внимание: перед запуском против множества целей протестируйте на одной, чтобы предотвратить блокировку учётной записи (например, в случае опечатки в пароле).
Примечание по OpSec: имейте в виду, что одновременный массовый вход на разные цели может вызвать срабатывание оповещений SOC.
Обе использованные здесь техники не новы.
RPC-вызов LsarLookupNames() протокола [MS-LSAT] ранее использовался Vincent Le Toux (@mysmartlogon) в модуле Antivirusscanner замечательного инструмента PingCastle.
Идея использования именованных каналов для обнаружения запущенных служб была вдохновлена этим твитом от Lee Christensen (@tifkin_) когда он использовал её для обнаружения службы WebClient. Эта техника для обнаружения AV/EDR также использовалась инструментом NamedPipeTouch из NSA (утечка от группы The Shadow Brokers).