
Microsoft Self-Service Password Reset (SSPR) ポータルを介してユーザーアカウントと登録済みの認証方法を列挙する
Microsoftのセルフサービスパスワードリセット(SSPR)エンドポイントをプローブし、登録済みの確認方法を列挙して、強力な第二要素を欠くものをフラグ付けします。ユーザー列挙と、Entraアカウント全体のMFA態勢の概算を提供します。
[!NOTE] 2026年8月現在、MicrosoftはSSPRフローからレガシーCAPTCHAを削除し、バックエンドのスロットリングと行動ベースの不正利用検知に置き換えました(MC1400824を参照)。Microsoftの立場は、バックエンドの制御が自動化された不正利用を検知・ブロックするのに十分であるというものです。
# Install pipx if needed
apt install pipx && pipx ensurepath
# From a local clone
git clone https://github.com/mlcsec/ResetSpy.git
cd ResetSpy
pipx install .
python3 -m venv .venv
pip install -r requirements.txt
# Single acc
resetspy [email protected]
# Email file (one per line)
resetspy emails.txt
# Proxy
resetspy emails.txt --proxy http://127.0.0.1:8080
# Export to CSV with increased delay
resetspy emails.txt --csv results.csv --delay 4
# Full HTTP debug — request/response headers and bodies printed to stderr
resetspy [email protected] -v
すべてのリクエスト間に --delay に加えてランダムなジッターが追加されます。
429 レスポンスおよびネットワークエラー時には指数バックオフ(最大 --retries 回)が適用されます。デフォルトの遅延は2秒です。大規模なバッチでは4〜6秒に増やしてください。User-Agentは16種類の一般的なエージェント(Windows、macOS、iOS、Android)のプールからリクエストごとにローテーションされます。
2020年以降デフォルトで有効化されているMicrosoftの統合セキュリティ情報登録エクスペリエンスは、SSPRとMFAの両方の認証方法を単一のフローで登録します。実際には、これはほとんどの最新のEntra IDテナントにおいて、SSPRを通じて表示される方法がサインインを保護する方法と同じであることを意味します。強力なSSPR方法が登録されていないアカウントは、強力なMFA方法が登録されていないアカウントである可能性が非常に高いです。
参考資料:
SSPRとMFAは別々のレジストリです。 統合登録によりほとんどの場合で重複しますが、同じものではありません。統合登録が有効化される前に登録された場合、または管理者がSSPRポリシーから除外した場合、MFA用に存在する方法がここに表示されないことがあります。
FIDO2セキュリティキーと証明書ベースの認証はSSPRでサポートされていません。 Microsoftはこれらの方法をSSPRフローに追加したことがありません。唯一の登録要素がFIDO2キーやスマートカードであるユーザーは、ここでは方法がないものとして表示されます — 偽陰性です。実際にはこれは標準ユーザーでは稀ですが、高セキュリティまたはパスワードレス環境ではより一般的です。
参考資料:
方法ごとのポリシーの不一致。 管理者はMFAサインインに対して方法を許可しつつ、SSPRポリシーから除外することができます。またはその逆も可能です。例えば、組織がサインインには認証アプリのプッシュを許可するが、パスワードリセットには許可しない場合があります。このツールはSSPRが提供を許容するものだけを見ます。
SSPRが完全に無効化されている場合(SSPR_0011)。 SSPRがライセンスされていない、またはユーザーに対して有効化されていない場合、エンドポイントは ViewSsprNotEnabledInUserPolicy を返し、方法情報は利用できません。アカウントは存在し、おそらくMFAが構成されていますが、このツールではそれが何であるかを判断できません。
ゲストおよびフェデレーションアカウント。 外部ユーザーとB2Bゲストはホームテナントを通じて認証します。リソーステナントのSSPRエンドポイントはホームテナントのMFA登録を可視化できず、ViewFeatureNotAvailable を返します。彼らのMFA態勢はこのエンドポイントからは見えません。
テナント全体の方法制限。 管理者がSSPRポリシーで方法クラスを無効化している場合、個々の登録に関係なくどのユーザーにも提供されず、「方法が登録されていない」と「方法が無効化されている」を区別することが不可能になります。
管理者アカウントは常にSSPRが有効です。 MicrosoftのSSPRポリシー設定は標準エンドユーザーにのみ適用されます。管理者アカウントはテナントのSSPRポリシーに関係なく常にセルフサービスパスワードリセットが有効であり、Microsoftは2つの認証方法を登録することを要求しています。これはプラットフォームレベルで強制され、テナント管理者が無効化することはできません。
参考資料: SSPR policy documentation
[!IMPORTANT] これは偵察において有用な意味を持ちます。テナントの標準ユーザーに対してSSPRが無効化されている場合(
ViewSsprNotEnabledInUserPolicyを返す)、方法選択画面に正常に到達するアカウントは特権ロールのメンバーである可能性が高いです。テナント全体のポリシーが無効化されているときにSSPR経由でクリーンに列挙されるアカウントは、管理者アカウントの可能性が高いものとして際立ち、標準ユーザーの方法が見えない場合でも登録された方法が可視化されます。これにより、さらなる標的型攻撃のために選別できる高価値ターゲットと特権アカウントの特定が可能になります。
CurrentViewName レスポンスフィールドが結果のグラウンドトゥルースとして使用される — HTMLボディのマッチングではないMicrosoftのSSPRポータル(passwordreset.microsoftonline.com)は、有効なユーザー名を受け入れた後に連絡方法選択画面(MultigateAuthenticationControl)を表示します。返されるHTMLは、登録されたすべての確認方法を MultigateAuthenticationControl_RadioTable 内のラジオボタンとしてリストします。<tr> 行が display:none である方法はそのユーザーに登録されておらず、スキップされます。
各ターゲットに対して、ツールは2つのリクエストを実行します。まず、ランディングページへのGETでセッションを確立し、サーバーがPOSTを受け入れるために必要なASP.NETフォームトークン(__VIEWSTATE、__EVENTVALIDATION、WorkflowConsistencyCheck)を抽出します。これらのトークンはセッションCookieに暗号学的にバインドされており、予測したりセッション間で再利用することはできません。次に、ユーザーが次へをクリックしたときにブラウザが実行する非同期UpdatePanelポストバックを再現して、それらのトークンとともにメールアドレスを送信するPOSTです。
ASP.NETのワイヤレスポンス内の CurrentViewName 隠しフィールドが、HTMLボディの部分文字列マッチングではなく、サーバーが何を決定したかの権威あるシグナルとして使用されます。
代替メールとセキュリティの質問は、フィッシング可能であり第二要素の意図を満たさないため、弱としてフラグ付けされます。弱い方法のみを持つアカウント、または方法がまったくないアカウントはフラグ付けされます。
[!NOTE] MicrosoftはSSPR用にソフトウェアOATHトークンとハードウェアOATHトークン(プレビュー)の両方をサポートしています。認証アプリ経由で入力されたソフトウェアOATHトークンは、おそらくTOTPと同じ
AppCodeRadioボタンを通じて表示されます — どちらも6桁のコード入力として提示されるため — 別個のラジオIDなしでおそらくすでにカバーされています。ハードウェアOATHトークン(物理的なキーフォブ)は別個のデバイスクラスですが、同様に時間ベースのコードを生成します。それらは同じボタン、またはこのプロセスのテスト中にまだ観察されていない別のボタンを通じてレンダリングされる可能性があります。
| フラグ | デフォルト | 説明 |
|---|
--delay SECONDS | 2.0 | リクエスト間の基本遅延。ジッターが自動的に追加される |
--retries N | 1 | 一時的なエラー時のアカウントごとの最大リトライ回数 |
--proxy URL | プロキシ。SSL検証を自動的に無効化する | |
--csv FILE | すべての結果をCSVにエクスポート | |
-v / --verbose | 完全なリクエスト/レスポンスヘッダーとボディをstderrに出力 |
| 機能 | 対応 |
|---|
| ユーザー列挙(アカウントの存在有無) | はい |
| SSPR方法の列挙 | はい |
| MFA方法の推測(統合登録経由) | 概算 — ほとんどの標準テナントで信頼性あり |
| FIDO2 / 証明書ベースのMFA検出 | いいえ |
| ゲスト / フェデレーションアカウントのMFA | いいえ |
| SSPRが無効化されたアカウント | いいえ(アカウントの存在は確認、方法は不明) |
| 管理者アカウントの特定 | 部分的 — 管理者は常にSSPRが有効なため、テナントのSSPRがそれ以外で無効化されている場合に際立つ可能性がある |
| ラジオID | 方法 | 強度 |
|---|
MultigateAuthenticationControl_AltEmailRadio | 代替メールOTP | 弱 |
MultigateAuthenticationControl_SecurityQuestionsRadio | セキュリティの質問 | 弱 |
MultigateAuthenticationControl_AppCodeRadio | 認証アプリ(TOTP) | 十分 |
MultigateAuthenticationControl_MobileAppNotificationRadio | 認証アプリのプッシュ通知 | 十分 |
MultigateAuthenticationControl_PhoneRadio | 電話 / SMS | 十分 |
MultigateAuthenticationControl_OfficePhoneRadio | オフィス電話 | 十分 |
| ステータス | 意味 |
|---|
MFA OK | アカウントが見つかった。SSPRに少なくとも1つの強力な第二要素が登録されている |
NO MFA | アカウントが見つかった。強力な要素がない(弱い方法のみ、または方法が登録されていない) |
NOT FOUND | ユーザー名がディレクトリに存在しない |
SSPR DISABLED | アカウントは存在するが管理者ポリシーがSSPRをブロックしている(例: SSPR_0011) — 方法は不明 |
SSPR N/A | SSPRでサポートされていないアカウントタイプ — ゲスト、外部、またはフェデレーションユーザー |
CAPTCHA | サーバーがCAPTCHAを提示した。手動介入が必要 |
ERROR | 予期しないレスポンスまたはネットワーク障害 |