Проблема магнита
Mimikatz заслужил свою легенду — а индустрия потратила десятилетие, чтобы превратить его в растяжку. Бинарь захеширован. Его командные строки матчатся паттернами. sekurlsa::dcsync для современного EDR — практически признание. Даже его легитимные потомки наследуют подозрение: всё, что касается LSASS, запрашивает права репликации, зовётся как креденшел-инструмент, по умолчанию получает второй взгляд. Техника не сгорела — сгорел артефакт. DCSync под всеми слоями — документированный вызов репликации каталога; API никогда не был зловредным, только репутация вызывающего. Инженерный вопрос формулируется так: как сделать вызов, не наследуя репутацию?
Библиотека, а не инструмент
Наш ответ — та же библиотека, с которой аудируют защитники. Модуль discovery встраивает управляемую обёртку вокруг DSInternals — открытой .NET-библиотеки каталога, которой пользуются синие, — и хостит её через тот же неуправляемый CLR-конвейер из заметки N.09: без powershell.exe, без Add-Type, без управляемого бинаря на диске. Сборки путешествуют зашифрованными внутри модуля и расшифровываются только в памяти. Когда оператор таскает DCSync, вызов, достигающий контроллера домена, — это запрос репликации каталога от процесса без наступательного прошлого — разница между известным преступником и вежливым незнакомцем, задающим тот же вопрос. Пять охватов операции: один аккаунт, набор админов, всё, krbtgt для материала золотого билета, или машинные аккаунты.
API никогда не был зловредным. Зловредной была только репутация вызывающего.
Как это исполняется
Сам модуль — ~7 МБ и прибывает через депо — одноразовый токен, ключ на модуль, запрос под прикрытием — со своими CLR-сборками внутри, так что ядро агента остаётся маленьким, а хост тихим, пока не заташковано. Исполнение намеренно сформовано: короткоживущий дочерний процесс, созданный с подменённым родителем и запретом не-Microsoft DLL, делает управляемую работу и возвращает результаты через разделяемую память — без выводных каналов, без временных файлов. Память, державшая секреты, затирается на выходе. Аутентификация — то, чем операция уже владеет: текущий контекст, явные учётные данные, украденный токен или pass-the-hash — модуль распоряжается привилегией, которая у вас есть; он никогда не притворяется, что выдаёт вам её.
Вся поверхность
DCSync — одна строка. Настоящая ценность модуля — вся поверхность от разведки до ключей за одним интерфейсом таскинга; каждая строка ниже — классическая операция, которая исторически означала отдельный инструмент, отдельный бинарь, отдельный набор сигнатур:
| Операция | Что получает оператор |
|---|---|
| Kerberoast | Аккаунты с SPN перечислены, сервисные билеты запрошены (RC4/AES) — вывод готов для hashcat |
| AS-REP roast | Аккаунты без предварительной аутентификации найдены; хеши запрашиваются по требованию |
| Сбор GPP | XML групповой политики SYSVOL распарсен — Groups, Services, Scheduled Tasks, Data Sources, Drives, Printers — на наследие эпохи cPassword |
| Прочёс NETLOGON | Логон-скрипты промыты на встроенные учётные данные |
| Обзор ADCS | CA и шаблоны сертификатов перечислены; условия ESC1–11, ESC13–14 проверены по ACL шаблонов и CA |
| Триада делегирования | Без ограничений, ограниченное (с S4U), ресурсное — одним проходом |
| DCSync | Репликация через управляемую библиотеку: single / admins / all / krbtgt / computers |
| LAPS | Пароли локальных админов читаются там, куда достают права оператора |
| Shadow credentials | msDS-KeyCredentialLink add / list / remove — захват аккаунта без сброса пароля |
| Резервный ключ DPAPI домена | Мастер-ключ всех доменно-защищённых блобов DPAPI, полученный тем же конвейером |
И поскольку разведка стоит ровно столько, сколько можно с ней сделать, модуль заканчивает предложение: к каждой находке генерируется соответствующая команда атаки — вызовы pass-the-hash, запросы билетов, материал золотого билета, — так что оператор переходит от обнаружения к действию без второго тулчейна. Экспорт питает ваши инструменты анализа (формы BloodHound), когда нужен граф, а не список.
Честные пределы
Три свойства, которые мы не будем округлять. Репликации нужны права: DCSync работает, потому что аккаунт, которым вы распоряжаетесь, держит права репликации — модуль делает тише вызывающего, он не может сделать тише вызов; всякий, кто аудирует события репликации, увидит саму операцию. Ребёнок — это рождение: fork-and-run означает одно короткое создание процесса, с подменённым родителем и ограниченными DLL — атрибутировано и минимизировано, но присутствует; аналитика родословной здесь зарабатывает свой хлеб. Выдача — это шов: on-demand загрузка 7 МБ незадолго до поведения, трогающего каталог, — ровно та корреляция, которую мы учим защитников строить в карте телеметрии — мы сузили её токенами и прикрытиями, но не удалили.
Угол защитника
Напишите эти правила — и заметка станет подарком. Репликация с чужого хоста: события репликации каталога (4662 с GUID-ами DS-Replication), исходящие с любой машины, не являющейся контроллером домена, — самое близкое к бесплатному приговору, что предлагает эта индустрия, — легитимная репликация это привычка DC-к-DC. Машинные аккаунты, которые реплицируют — второй маркер. Записи key-credential: тревога на модификации msDS-KeyCredentialLink — shadow credentials тихи ровно потому, что никто не смотрит на атрибут. SYSVOL в масштабе: один хост, разбирающий XML политик по всей шаре, — паттерн сбора, а не привычка админа. Дрейф центра сертификации: изменения ACL шаблонов, за которыми следует необычный выпуск сертификатов, — сердцебиение семейства ESC; аудит шаблонов ловит то, чего endpoint-инструментарий не видит. Артефакт может менять лицо; у операций есть физика, и физика наблюдаема.
Следующая заметка: Сколько ещё стоит каждый обход. Прямые и непрямые сисколлы, разхукивание, подмена стека, обфускация сна, порча ETW — полка обходов с показаниями счётчиков и почему импланты с одним трюком быстро стареют.