
Комбинация BOF KillDefender и Backstab
6/28/2022: Microsoft выпустила патч, который предотвращает открытие дескриптора к токену MsMpEng.exe, поэтому часть KillDefender этого инструмента больше не работает. Backstab по-прежнему должен работать. Не уверен в ID патча, возможно, будет работать на старых незаплатированных системах. Проверено на Win10 21H2 и Win11.
Это реализация в формате Beacon Object File, объединяющая Backstab от Yaxser и KillDefender от pwn1sher для использования с Cobalt Strike.

KDStab — это инструмент пост-эксплуатации для подавления Windows Defender (теоретически может работать и с другими решениями, но не проверялось), чтобы другие инструменты пост-эксплуатации можно было использовать с меньшим страхом обнаружения. Для этого он использует Backstab и KillDefender, оба из которых вызываются при необходимости командой kdstab в Cobalt Strike.
KDStab успешно протестирован на x64 Windows 10, Windows 11 и Server 2019.
KDStab требует прав администратора или системы.
Основные функции:
Определение уровня целостности процесса
Лишение процесса привилегий и установка его целостности в Untrusted
Завершение PPL-защищённого процесса
Вывод списка дескрипторов PPL-защищённого процесса
Закрытие определённого дескриптора PPL-защищённого процесса
Проверка уровня целостности процесса

Лишение процесса привилегий и установка его токена в Untrusted

Результат команды /STRIP

Завершение PPL-защищённого процесса

Я наткнулся на KillDefender от pwn1sher вскоре после его выхода и подумал, что это потрясающе; помимо того, что он делает MsMpEng.exe (Defender) бесполезным, он оставляет процесс работающим, что кажется желательным с точки зрения OPSEC (плюс тот факт, что поведение службы WinDefend по умолчанию — перезапускать MsMpEng.exe при сбое — что пригодится позже).
Хотя ослепление Defender отлично подходит для работы, как профессионалы мы несём ответственность за восстановление активов клиента в исходное состояние; к тому же мы не хотим оставлять их системы уязвимыми для других злоумышленников только потому, что мы убили (или «убИли») Defender.
Проблема в том, что «восстановить» MsMpEng.exe до рабочего состояния сложно. KillDefender работает, лишая целевой процесс привилегий (SeDebugPrivilege и т.д.) и устанавливая целостность токена в Untrusted. Нельзя просто «повысить» токен до System и восстановить привилегии — процесс нужно убить и запустить новый экземпляр. Конечно, MsMpEng.exe также является процессом PsProtectedSignerAntimalware-Light, поэтому даже под System мы не можем просто завершить процесс. К сожалению, группа TrustedInstaller недавно была удалена из MsMpEng.exe (есть другие исследования на эту тему), что сделало неэффективным этот метод истинного уничтожения процесса MsMpEng.exe (или службы WinDefend), который использовался много лет. В результате единственным жизнеспособным вариантом кажется перезагрузка машины, что может вызвать проблемы у клиента, если речь идёт о серверах и контроллерах домена.
Вооружившись этой проблемой, я начал искать и быстро нашёл Backstab от Yaxser. Backstab способен убивать PPL-защищённые процессы с помощью драйвера ProcExp; это драйвер, подписанный Microsoft из Sysinternals, что играет нам на руку. Backstab выполняет некоторые небезопасные с точки зрения OPSEC действия: он сбрасывает драйвер на диск и создаёт ключи реестра. Однако, если Defender уже ослеплён… :)
Я решил портировать оба этих инструмента в формат BOF, чтобы их можно было использовать через Beacon в Cobalt Strike без необходимости сохранять их на диск (оригинальный бинарник Backstab блокировался Defender во время выполнения).
Я новичок как в C/C++, так и в написании BOF’ов, и за время процесса многому научился. Вы можете заметить некоторые несоответствия в коде (например, Backstab_bof написана и скомпилирована в Linux с помощью gcc, а KillDefender_bof — в Visual Studio) из-за того, что я учился в процессе создания, но я провёл достаточно тестирования, чтобы обеспечить функциональность, а также встроил много «рельсов» в aggressor-скрипт для правильного использования и ввода данных в BOF’ы. Надеюсь, этот инструмент окажется полезным.
В исходный код инструментов были внесены некоторые заметные изменения, а также были приняты определённые программные решения, о которых будет сказано здесь:
Драйвер ProcExp больше не хранится/загружается как ресурс — это жёстко заданный массив байт в backstab_src/resource.c
В оригинальном коде Backstab было несколько утечек памяти, которые я нашёл и устранил
POC KillDefender завершается ошибкой, если пользователь не является System; я добавил фрагмент для определения текущего пользователя и получения прав System через олицетворение токена Winlogon при необходимости.
KillDefender был изменён, чтобы позволить пользователю указывать, какой процесс атаковать; кроме того, был добавлен режим "Check" для определения уровня целостности процесса (что может подтвердить, что процесс был успешно лишён привилегий и целостности).
Backstab использует достаточно разных API и вызовов C, поэтому Cobalt Strike не смог самостоятельно разрешить все динамические функции — на помощь пришёл Trustedsec! Я реализовал их динамическое разрешение функций в дополнение к CS, чтобы можно было вызывать все необходимые API.
В оригинальном Backstab есть несколько конструкций switch/case, которые вызвали проблемы при портировании, поэтому они были заменены на if/else. Кроме того, были устранены практически все глобальные переменные по аналогичным причинам.
Знаю, что странно, что один инструмент написан для Visual Studio, а другой — для GCC; это жертва моих трудностей при успешном портировании и множества «болезней роста» на этом пути. Надеюсь, будущие инструменты извлекут пользу из многих уроков, которые я усвоил здесь.
И KillDefender_bof, и Backstab_bof существуют как отдельные репозитории. ОБРАТИТЕ ВНИМАНИЕ, ЧТО КОД В ОТДЕЛЬНЫХ РЕПОЗИТОРИЯХ ОТЛИЧАЕТСЯ ОТ ЭТОГО ИНСТРУМЕНТА. Это было сделано, чтобы сделать их более гибкими и позволить интегрировать их в единый пакет.
Я не пытался скомпилировать какой-либо из инструментов для x86; если вам действительно нужна версия для этой архитектуры, я оставлю это вам.
Для компиляции Backstab_bof с помощью gcc:
x86_64-w64-mingw32-gcc -o backstab.x64.o -Os -c main.c -DBOF -D_UNICODE
Убедитесь, что вы обновили mingw до последней версии! У меня были проблемы, когда моя версия содержала устаревшие заголовочные файлы, однако в последней версии заголовочные файлы корректны.
Для компиляции KillDefender_bof с помощью x64 Native command prompt:
cl.exe /c /GS- /TP killdefender_bof.cpp /FoKillDefender.x64.o
Yaxser и его инструмент Backstab: https://github.com/Yaxser/Backstab
pwn1sher и его инструмент KillDefender: https://github.com/pwn1sher/KillDefender
Trustedsec за его репозиторий CS-Situational-Awareness-BOF, который очень помог в процессе портирования. Я использовал фрагменты его кода в этом проекте и настоятельно рекомендую всем, кто начинает писать BOF’ы, ознакомиться с этим репозиторием: https://github.com/trustedsec/CS-Situational-Awareness-BOF