
Valutazione in sola lettura delle credenziali delle app di Entra ID: enumera le autorizzazioni di Graph, l'RBAC di Azure e i dati cloud raggiungibili, quindi mappa i risultati sui percorsi di privilege escalation e lateral movement.
/ / ______ ___ ___ / /_ / / / /__ _ / / /_____ ____ \ / -) / -) -)/ / \ \ / __/ _ `// / '/ -) / //_/_/_/_/ _/ // _/_,////_\__/_/
╔╦╦╬╬╬╬╬╬╦╦╗
╔╬╬╬╝╝┘ ╚╝╝╬╬╬┐
╬╬╝╚╩╬╗╔ ╚╬╬╬
╬╝ ╚╬╬╗╗ ╔ ╚╬╗ ╬╬ ╔╗ ╚╬╬╬╬╬╬╦ ╬╬ 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. \
**Cosa può realmente fare questo client ID + secret di Entra ID?**
Hai trovato una credenziale applicativa di Entra ID (Azure AD) — un client ID e un secret —
durante un impegno autorizzato, e il tenant a cui appartiene è in scope.
`secret_stalker` prende questi due valori e ti dice, a partire da zero:
1. **È valido e quando scade il secret?** — e se non è valido, *perché*
(secret errato, secret scaduto, app non presente nel tenant…). Per un secret valido
legge le `passwordCredentials` della registrazione dell'app e riporta la data
di scadenza + i giorni rimanenti (richiede la lettura della directory; vedi nota sotto).
2. **Quali diritti Microsoft Graph porta con sé?** — autorizzazioni applicative lette
direttamente dal token emesso, più **ruoli di directory Entra** che detiene (anche
rilevati passivamente dalla dichiarazione `wids` del token) e **oggetti che possiede**
(app/SP a cui puoi aggiungere credenziali).
3. **Che controllo ha su Azure?** — assegnazioni di ruolo RBAC a livello di
gruppo di gestione e sottoscrizione.
4. **Può raggiungere dati reali?** — controlli opzionali di raggiungibilità del data-plane
per Key Vault (segreti / chiavi / certificati), Storage (blob / file / coda / tabella)
e Cosmos DB.
5. **Qual è l'impatto?** — permessi pericolosi, ruoli, proprietà e dati raggiungibili
mappati su primitive note di privesc / movimento laterale, valutati per gravità,
con narrazioni concrete di **attack-path**.
Si autentica con un **client secret** o un **certificato** (`--cert`),
e funziona con **cloud commerciali e sovrani** (`--cloud`).
È **passivo per impostazione predefinita** e **non modifica mai nulla** — solo
enumerazione in sola lettura.
> ⚠️ **Solo test autorizzati.** Eseguilo esclusivamente contro tenant che sono
> esplicitamente in scope per un impegno che sei autorizzato a svolgere.
---
## Installazione```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
L'unica dipendenza runtime è requests. I token vengono decodificati localmente (base64 + JSON) — nessuna verifica della firma, nessuna libreria crittografica, nessun SDK Microsoft. L'unica eccezione è l'autenticazione tramite certificato (--cert), che richiede il pacchetto opzionale cryptography per firmare l'asserzione client JWT. Richiede Python 3.7+.
Dopo pip install . puoi invocarlo come secret_stalker … invece di python -m secret_stalker ….
Il modo più veloce per scoprire cosa può fare una credenziale:```bash
python -m secret_stalker
--tenant contoso.onmicrosoft.com
--client-id 11111111-2222-3333-4444-555555555555
--secret ''
`--tenant` accetta un GUID tenant o un dominio — un dominio viene risolto automaticamente nel relativo ID tenant tramite l'endpoint pubblico di configurazione OpenID.
### Tieni il segreto fuori dalla cronologia della shell
Passa le credenziali tramite variabili d'ambiente invece che tramite flag:```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
Ognuno di --tenant / --client-id / --secret può provenire da SS_TENANT /
SS_CLIENT_ID / SS_SECRET. I flag hanno precedenza sull'ambiente.
Non si tratta solo della cronologia della shell: un valore argv è leggibile da qualsiasi utente
locale per l'intera durata del processo (ps, /proc/<pid>/cmdline). Se --secret
o --cert-password viene passato come flag, lo strumento stampa un promemoria di una riga su
stderr — non compare mai nell'output di --json o --export.
Le registrazioni delle app spesso usano un certificato anziché un segreto. Passa --cert
(un PEM contenente la chiave privata e il certificato, o un .pfx/.p12) e lo
strumento si autentica con un'asserzione client JWT firmata:```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 ''
L'autenticazione tramite certificato richiede il pacchetto opzionale `cryptography` (`pip install '.[cert]'`).
Lo strumento riporta la scadenza del certificato stesso (identificata in base al relativo thumbprint presente in
`keyCredentials` dell'app), esattamente come fa per un segreto. `--cert`/`--cert-password`
vengono letti anche da `SS_CERT` / `SS_CERT_PASSWORD`.
### Cloud sovrani e governativi
Per impostazione predefinita secret_stalker si rivolge al cloud **commerciale**. Per i tenant sovrani,
passa `--cloud` (o `SS_CLOUD`) affinché l'autorità Entra e gli endpoint Graph / ARM / Key
Vault corrispondano — altrimenti credenziali valide sembrano non avere accesso:```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 | Entra authority | Microsoft Graph | ARM | Key Vault |
|---|---|---|---|---|
public (predefinito) | 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 |
Sono accettati alias come gov, dod, commercial, gcc-high e 21vianet.
(L'audience del data-plane di Storage, storage.azure.com, è la stessa in ogni cloud.)
Questo autentica, memorizza nella cache la mappa delle appRole Graph del tenant in
~/.secret_stalker/app_roles_cache.json, e esce. Salta questo passaggio se le
credenziali non possono leggere i service principal — la mappa inclusa copre comunque le
autorizzazioni note.