
Evaluación de solo lectura de credenciales de aplicaciones de Entra ID: enumera los permisos de Graph, el RBAC de Azure y los datos de nube accesibles, y mapea los hallazgos con rutas de escalada de privilegios y movimiento lateral.
/ / ______ ___ ___ / /_ / / / /__ _ / / /_____ ____ \ / -) / -) -)/ / \ \ / __/ _ `// / '/ -) / //_/_/_/_/ _/ // _/_,////_\__/_/
╔╦╦╬╬╬╬╬╬╦╦╗
╔╬╬╬╝╝┘ ╚╝╝╬╬╬┐
╬╬╝╚╩╬╗╔ ╚╬╬╬
╬╝ ╚╬╬╗╗ ╔ ╚╬╗ ╬╬ ╔╗ ╚╬╬╬╬╬╬╦ ╬╬ we found your secret... ╔╬┤ ╬╬╬ ╬╬╬╬╬╬╬╬╝╝╝╬╬╗ ...now let's see what it ╬╬┤ ╚╩┘ ╚╬╬╬╬╬╩ ╠╬╬ can REALLY do. ( o_o)>=|= ╬╬┤ ╠╬╬ ╬╬ ╦╗ ╗╗ ╬╬ [ client_id + secret -> total recall ] └╬┐ ╚╬╗╗ ╔╬╬╝ ╔╬┘ └╬╗ ╚╩╩╬╬╬╩╩╝╝ ╔╬╬ ╚╬╬╬╗ ┌╗╬╬╝┘ ╚╩╬╬╬╦╦╦╦╦╦╬╬╬╝╝ ╚╚╝╝╝╝ // pst... that app registration talks too much. \
**¿Qué puede hacer realmente este ID de cliente + secreto de Entra ID?**
Has encontrado una credencial de aplicación de Entra ID (Azure AD) — un ID de cliente y un secreto —
en un compromiso autorizado, y el tenant al que pertenece está dentro del alcance.
`secret_stalker` toma esos dos valores y te dice, desde cero:
1. **¿Es válido y cuándo expira el secreto?** — y si no es válido, *por qué*
(secreto incorrecto, secreto caducado, aplicación no presente en el tenant…). Para un secreto válido,
lee los `passwordCredentials` del registro de la aplicación e informa de la
fecha de expiración + días restantes (necesita lectura de directorio; ver nota más abajo).
2. **¿Qué derechos de Microsoft Graph tiene?** — permisos de aplicación leídos
directamente del token emitido, más los **roles de directorio de Entra** que posee (incluso
detectados pasivamente desde el claim `wids` del token) y **objetos que son de su propiedad**
(apps/SPs a los que puedes añadir credenciales).
3. **¿Qué control tiene sobre Azure?** — asignaciones de roles RBAC a nivel de
grupo de administración y ámbito de suscripción.
4. **¿Puede acceder a datos reales?** — comprobaciones opcionales de Key Vault (secretos / claves / certificados),
Storage (blob / file / queue / table) y comprobaciones de alcance en el plano de datos de Cosmos DB.
5. **¿Cuál es el impacto?** — permisos peligrosos, roles, propiedad y datos
accesibles asociados a primitivas conocidas de privesc / movimiento lateral, clasificados por severidad,
con narrativas concretas de **rutas de ataque**.
Se autentica con un **secreto de cliente** o un **certificado** (`--cert`),
y funciona con **nubes comerciales y soberanas** (`--cloud`).
Es **pasivo por defecto** y **nunca modifica nada** — únicamente
enumeración de solo lectura.
> ⚠️ **Solo pruebas autorizadas.** Ejecútalo únicamente contra tenants que estén
> explícitamente dentro del alcance de un compromiso que estés autorizado a realizar.
---
## Install```bash
pip install -r requirements.txt # just runs it from source
# — or —
pip install . # installs the `secret_stalker` command
pip install '.[cert]' # + certificate (--cert) auth support
pip install '.[dev]' # + pytest for the test suite
La única dependencia de ejecución es requests. Los tokens se decodifican localmente (base64 +
JSON): no hay verificación de firmas, ni biblioteca criptográfica, ni SDK de Microsoft. La única
excepción es la autenticación por certificado (--cert), que necesita el paquete opcional cryptography
para firmar la aserción de cliente JWT. Requiere Python 3.7+.
Después de pip install . puedes invocarlo como secret_stalker … en lugar de
python -m secret_stalker ….
La forma más rápida de descubrir qué puede hacer una credencial:```bash
python -m secret_stalker
--tenant contoso.onmicrosoft.com
--client-id 11111111-2222-3333-4444-555555555555
--secret ''
`--tenant` acepta un GUID de inquilino o un dominio — un dominio se resuelve a su
ID de inquilino automáticamente mediante el endpoint público de configuración de OpenID.
### Mantén el secreto fuera del historial de tu shell
Pasa las credenciales mediante variables de entorno en lugar de flags:```bash
export SS_TENANT=contoso.onmicrosoft.com
export SS_CLIENT_ID=11111111-2222-3333-4444-555555555555
export SS_SECRET='<client-secret>'
python -m secret_stalker
Cualquiera de --tenant / --client-id / --secret puede provenir de SS_TENANT /
SS_CLIENT_ID / SS_SECRET. Las opciones tienen prioridad sobre el entorno.
Esto no solo se trata del historial del shell: un valor de argv es legible por cualquier
usuario local durante toda la vida del proceso (ps, /proc/<pid>/cmdline). Si --secret
o --cert-password se pasa como una opción, la herramienta imprime un recordatorio de una línea en
stderr — nunca aparece en la salida de --json o --export.
Los registros de aplicaciones suelen usar un certificado en lugar de un secreto. Pasa --cert
(un PEM que contiene la clave privada y el certificado, o un .pfx/.p12) y la
herramienta autentica con una aserción de cliente JWT firmada:```bash
python -m secret_stalker --tenant contoso.onmicrosoft.com
--client-id --cert ./app.pem # or app.pfx
python -m secret_stalker ... --cert app.pfx --cert-password ''
La autenticación con certificado requiere el paquete opcional `cryptography` (`pip install '.[cert]'`).
La herramienta informa la caducidad del propio certificado (coincidiendo con su huella digital en
`keyCredentials` de la aplicación), igual que hace con un secreto. `--cert`/`--cert-password`
también se leen de `SS_CERT` / `SS_CERT_PASSWORD`.
### Nubes soberanas y gubernamentales
Por defecto, secret_stalker se dirige a la nube **comercial**. Para inquilinos soberanos,
pasa `--cloud` (o `SS_CLOUD`) para que la autoridad de Entra y los endpoints de Graph / ARM / Key
Vault coincidan; de lo contrario, las credenciales válidas parecen no tener acceso:```bash
# US Government (GCC High)
python -m secret_stalker --cloud usgov --tenant contoso.onmicrosoft.us ...
# US DoD (L5)
python -m secret_stalker --cloud usdod ...
# Azure operated by 21Vianet (China)
python -m secret_stalker --cloud china --tenant contoso.partner.onmschina.cn ...
--cloud | Autoridad de Entra | Microsoft Graph | ARM | Key Vault |
|---|---|---|---|---|
public (predeterminado) | login.microsoftonline.com | graph.microsoft.com | management.azure.com | vault.azure.net |
usgov (GCC High) | login.microsoftonline.us | graph.microsoft.us | management.usgovcloudapi.net | vault.usgovcloudapi.net |
usdod (DoD) | login.microsoftonline.us | dod-graph.microsoft.us | management.usgovcloudapi.net | vault.usgovcloudapi.net |
china (21Vianet) | login.chinacloudapi.cn | microsoftgraph.chinacloudapi.cn | management.chinacloudapi.cn | vault.azure.cn |
Se aceptan alias como gov, dod, commercial, gcc-high y 21vianet.
(La audiencia del plano de datos de Storage, storage.azure.com, es la misma en todas las nubes.)
Esto autentica, guarda en caché el mapa de appRoles de Graph del inquilino en
~/.secret_stalker/app_roles_cache.json y sale. Omítelo si la
credencial no puede leer los service principals; el mapa incluido sigue cubriendo los
permisos conocidos.