“Ты — спящий гений, степень пробуждения которого зависит от количества твоих осознанных действий.”
Введение
Доброго всем времени суток! Зачастую, получается так, что изобретать свой велосипед нет никакой необходимости, и намного удобнее взять уже чье-то готовое решение, а уж тем более если это решение «прошло огонь, воду, и медные трубы». При этом, есть великий соблазн использовать его, не тратя времени на понимание принципа работы, руководствуясь истиной: «Я под капот не полезу, все равно я в этом ничего не понимаю! Работает? Ну и отлично!»
В сегодняшней статье речь пойдет о всем знакомой утилите из пакета Impacket под названием secretsdump. Безусловно, эта статья не раскроет всех теоретических аспектов работы данного скрипта, но нацелена на повышение осознанности при его использовании! В любом случае, нет предела совершенству, и, при желании, можно еще больше углубить свои знания, начав разбираться самостоятельно! (будем считать, что это «своего рода» трамплин)
Ссылочка на сам проект, если вдруг у вас возникнет непреодолимый интерес покопаться в строках программного кода!
И для чего нам все это?
«Утилита позволяет сдампить хэши с удаленного Domain Controller без запуска на нем каких-либо агентов.» Конечно, это не единственный путь для достижения похожего результата. Но secretsdump любят и используют по всему миру, за возможность удаленного дампа чувствительной информации с контроллера домена!
Ссылочка на плеяду методов дампа хэшей с Windows
После корректной работы impacket-secretsdump, у нас появляется возможность осуществить атаки: Pass-the-Hash (для Lateral Movement), Golden Ticket (поставив галочку напротив пункта «осуществить persistence») да и вообще, по сути взять домен под свой контроль и «чувствовать себя вольготно».
А что делается то?
SAM и LSA secrets + cached creds считываются из реестра, затем «кусты реестра» [hives – о боже как я не хочу переводить] сохраняются на целевой системе в папке %SYSTEMROOT%\\Temp и уже оттуда происходит считывание всех оставшихся данных.
С NTDS.dit действует опционально:
2.1) Извлекает имена доменных пользователей и хэши их паролей + ключи Kerberos используя [MS-DRDS] вызов процедуры DRSGetNCChanges(), при этом репликация происходит только необходимых нам атрибутов (об этом чуть ниже)
2.2) Извлекает NTDS.dit с помощью vssadmin [подробнее по той самой ссылочке про методы дампа хэшей], при этом его запуск происходит с помощью smbexec.
Что получается на выходе?
Теперь настало время для детального анализа «выходной продукции» после работы (успешной) данной утилиты!
Сперва происходит извлечение ключа загрузки целевой машины. Он находится в SYSTEM hive в HKLM\SYSTEM. Конечно если мы хотим выполнить это действие вручную, то для этого мы просто выполняем команду reg save HKLM\SYSTEM после чего копируем его с целевой машину любым доступным для нас способом. Ключ загрузки понадобится позже для расшифровки файла ntds.dit.
Далее осуществляется дамп файла SAM находящегося в HKLM\SAM. The Security Account Manager (SAM) – это файл реестра, который хранит пароли локальных пользователей компьютера. Хранятся они, конечно, в зашифрованном виде.
Когда пользователь домена проходит аутентификацию на контроллере домена при входе в систему, его учетные данные сохраняются на локальном компьютере по умолчанию (Cached Credentials: username:hash). Это позволяет пользователю входить под своей учетной записью на компьютер из домена даже в том случае, если Контроллер недоступен (проблема с сетью, или DC выключен)
Сохраненные пароли хранятся в ветке реестра HKEY_LOCAL_MACHINE\Security\Cache
LSA secrets
LSA секреты - это специальное защищенное хранилище важной информации, которая используется системой Local Security Authority (LSA) в Windows. LSA предназначено для управления локальной политикой безопасности системы, аудита, авторизации, входа пользователей в систему, хранения приватных данных. Чувствительные данные пользователей и системы хранятся в Secrets. Доступ ко всем секретным данным имеет только SYSTEM, но при желании в properties мы можем выставить доступ к ним, для того чтобы ознакомиться с содержимым папки Security.
HKLM/Security/Policy/Secrets
Именно эти ветки реестра impacket-secretsdump успешно извлек и расшифровал.
Стоит сказать, что зашифрованы они на system bootkey.
В данном случае это секрет машинной учетной записи, который сменяется каждые 30 дней. Существует возможность использования хэша машинной учетной записи в атаках, связанных с делегацией.
DPAPI используется для защиты учетных данных пользователей, хранящихся на Windows хосте.
DPAPI используется при защите следующих персональных данных:
Пароли и данные автозаполнения форм в Internet Explorer, Google Chrome
Пароли учетных записей почты в Outlook, Windows Mail, Windows Mail, и т.д.
Пароли учетных записей встроенного менеджера FTP
Пароли доступа к общим папкам и ресурсам
Пароли и ключи учетных записей беспроводной сети Ключи шифрования в Windows CardSpace и Windows Vault
Пароли соединений удаленного доступа к рабочему столу, .NET Passport
Приватные ключи Системы Шифрования Файлов (EFS), шифрования почты S-MIME, другие сертификаты пользователя, SSL/TLS в Internet Information Services EAP/TLS и 802.1x (VPN и WiFi аутентификация)
Сетевые пароли в Credential Manager
Персональные данные любого приложения, программно защищенные при помощи API функции CryptProtectData. Например, в Skype, Windows Rights Management Services, Windows Media, MSN messenger, Google Talk и др.
Список поражает, не так ли?!)
Использовать добытый DPAPI key можем, например, для того, чтобы расшифровать пароли, сохраненные в Google Chrome.
Секрет NL$KM содержит ключ шифрования кэшированных паролей домена.
Кроме секретов LSA так же происходит дамп ключей Kerberos
NTDS.dit ?
Ну вот мы и дошли до дампа файла ntds.dit, в котором хранится информация об объектах домена, и содержащего в том числе и имена пользователей + хэши паролей.
Думаю, что всем уже понятно, что мы можем делать с NT hash, поэтому я лишь хотел бы пролить свет на DRSUAPI method. Как уже было отмечено ранее, по сути то, что делает impacket-secretsdump принято называть репликацией контроллера домена, а в контексте атаки на домен – DCSync.
Скажу лишь в двух словах как работает DCSync:
Происходит обнаружение контроллера домена по доменному имени (так как мы указали ip адрес, то поиски не долгие)
Происходит запрос на репликацию учетных данных пользователей к контроллеру домена через функцию GetNCChanges() [используя Directory Replication Service (DRS) Remote Protocol]
«Сетевая инфраструктура организации часто нуждается в наличии более чем одного контроллера домена для Active Directory. Таким образом для полноценного функционирования двух и более контроллеров домена необходимо, чтобы AD объекты могли быть реплицированы на все контроллеры домена»
Процесс репликации возложен на DRS Remote Protocol. DRSUAPI - API Microsoft которая реализует процесс репликации. Как и любая API у нее есть ряд функций.
В данном случае мы остановимся лишь на функции DSGetNCChanges(). Клиентский DC отправляет запрос DSGetNCChanges на сервер, когда первый хочет получить обновления объектов AD от второго. Ответ содержит набор обновлений, которые клиент должен применить к своей реплике NC. В случае если, набор обновлений слишком велик для одного ответного сообщения, то выполняется несколько запросов и ответов DSGetNCChanges. Этот процесс называется циклом репликации или просто циклом.
Подробнее о DCSync вы можете почитать тут и тут
Заключение
Таким образом, разобравшись с выводом, и немного углубившись в то, что значит каждый символ, мы теперь по достоинству можем оценить тот функционал, который заложили создатели в secretsdump. Безусловного знания не бывает, и возможно, я упустил определенные вещи в данной статье (постарался обильно снабдить ссылками на полезные ресурсы для дальнейшего изучения).