
読み取り専用のEntra IDアプリ資格情報評価:Graphの権限、Azure RBAC、到達可能なクラウドデータを列挙し、調査結果を権限昇格と横移動の経路にマッピングします。
/ / ______ ___ ___ / /_ / / / /__ _ / / /_____ ____ \ / -) / -) -)/ / \ \ / __/ _ `// / '/ -) / //_/_/_/_/ _/ // _/_,////_\__/_/
╔╦╦╬╬╬╬╬╬╦╦╗
╔╬╬╬╝╝┘ ╚╝╝╬╬╬┐
╬╬╝╚╩╬╗╔ ╚╬╬╬
╬╝ ╚╬╬╗╗ ╔ ╚╬╗ ╬╬ ╔╗ ╚╬╬╬╬╬╬╦ ╬╬ 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. \
**この Entra ID のクライアント ID とシークレットで、実際に何ができるのか?**
あなたは、許可されたエンゲージメントで Entra ID (Azure AD) アプリケーションの資格情報 — クライアント ID とシークレット — を発見しました。
その所属するテナントはスコープ内にあります。
`secret_stalker` はこれら 2 つの値を受け取り、コールドスタートから次のことを教えてくれます。
1. **有効かどうか、そしてシークレットはいつ期限切れになりますか?** — 有効でない場合は、*その理由*
(シークレットの誤り、期限切れのシークレット、テナント内に存在しないアプリなど)。有効なシークレットの場合、
アプリ登録の `passwordCredentials` を読み取り、有効期限の日付と
残り日数を報告します(ディレクトリ読み取りが必要。下記の注を参照)。
2. **どの Microsoft Graph 権限を持ちますか?** — 発行されたトークンから直接読み取られるアプリケーション権限に加え、
保持する **Entra ディレクトリロール**(
トークンの `wids` クレームから受動的に検出されるものも)と **所有するオブジェクト**
(資格情報を追加できるアプリ/SP)。
3. **Azure に対してどのような制御を持ちますか?** — RBAC ロール割り当て(
管理グループとサブスクリプションのスコープ)。
4. **実際のデータに到達できますか?** — オプションの Key Vault(シークレット / キー / 証明書)、
Storage(blob / file / queue / table)、および Cosmos DB データプレーン到達可能性チェック。
5. **影響は何ですか?** — 危険な権限、ロール、所有権、そして到達可能な
データを既知の権限昇格 / 横移動プリミティブにマッピングし、重大度で評価し、
具体的な **攻撃経路** の説明を提供します。
認証は **クライアント シークレット** または **証明書** (`--cert`) のいずれかを使用し、
**商用クラウドとソブリンクラウド** (`--cloud`) で動作します。
デフォルトでは **パッシブ** であり、**何も変更しません** — 読み取り専用の
列挙のみです。
> ⚠️ **許可されたテストのみ。** 実行するのは、あなたが実行を許可されたエンゲージメントで
> 明示的にスコープ内にあるテナントのみです。
---
## インストール```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
唯一のランタイム依存関係は requests です。トークンはローカルでデコードされます(base64 +
JSON)— 署名検証も、暗号ライブラリも、Microsoft SDK も必要ありません。唯一の
例外は証明書認証(--cert)で、JWT クライアントアサーションに署名するためにオプションの cryptography
パッケージが必要です。Python 3.7+ が必要です。
pip install . の後は、python -m secret_stalker … の代わりに
secret_stalker … として呼び出すことができます。
資格情報で何ができるかを最速で確認する方法:```bash
python -m secret_stalker
--tenant contoso.onmicrosoft.com
--client-id 11111111-2222-3333-4444-555555555555
--secret ''
`--tenant` はテナント GUID またはドメインのいずれかを受け入れます。ドメインは公開 OpenID 設定エンドポイントを介して自動的に
テナント ID に解決されます。
### シェルの履歴に秘密情報を残さない
フラグではなく環境変数で認証情報を渡します:```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
Any of --tenant / --client-id / --secret can come from SS_TENANT /
SS_CLIENT_ID / SS_SECRET. Flags take precedence over the environment.
This isn't only about shell history: an argv value is readable by any local
user for the lifetime of the process (ps, /proc/<pid>/cmdline). If --secret
or --cert-password is passed as a flag, the tool prints a one-line reminder to
stderr — it never appears in --json or --export output.
App registrations often use a certificate rather than a secret. Pass --cert
(a PEM holding the private key and certificate, or a .pfx/.p12) and the
tool authenticates with a signed JWT client assertion:```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 ''
証明書認証にはオプションの `cryptography` パッケージが必要です(`pip install '.[cert]'`)。
このツールは、証明書自体の有効期限を報告します(アプリの
`keyCredentials` 内の拇印に一致)。シークレットの場合と同様に、`--cert`/`--cert-password`
は `SS_CERT` / `SS_CERT_PASSWORD` からも読み取られます。
### ソブリンクラウドと政府クラウド
デフォルトでは、secret_stalker は **商用** クラウドを対象としています。ソブリンテナントの場合、
`--cloud`(または `SS_CLOUD`)を渡して、Entra オーソリティと Graph / ARM / Key
Vault エンドポイントが一致するようにしてください — そうしないと、有効な資格情報もアクセス権がないように見えます:```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 オーソリティ | Microsoft Graph | ARM | Key Vault |
|---|---|---|---|---|
public (default) | 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 |
gov、dod、commercial、gcc-high、21vianet などのエイリアスが受け入れられます。
(ストレージ データプレーンのオーディエンスである storage.azure.com は、すべてのクラウドで同じです。)
これにより認証が実行され、テナントのGraph appRoleマップを
~/.secret_stalker/app_roles_cache.json にキャッシュして終了します。
資格情報がサービスプリンシパルを読み取れない場合はスキップしてください — 同梱のマップは
既知の権限を引き続きカバーしています。
Credential status : VALID Tenant : aaaaaaaa-... Client (app) id : 1111... App display name : Recon App SP object id : cccc... Secret : valid — expires 2027-03-01 (in 207 days)
OK graph OK arm NO storage — no storage token
...
[CRITICAL] (GRAPH) Application.ReadWrite.All Can add credentials to any app/SP and impersonate it — tenant-wide pivot. [CRITICAL] (ARM) Owner Full control including granting access to others. [CRITICAL] (DATA) keyvault:secrets Can read Key Vault secret values — connection strings, passwords, tokens. [MEDIUM] (GRAPH) Mail.Read Read all mailboxes — data exposure.