Japan

関連リンク

関連リンク

関連リンク

関連リンク

サイト内の現在位置

Active DirectoryにおけるAttack Path(攻撃パス)SPN編

NECセキュリティブログ

2025年3月28日

NECサイバーセキュリティ戦略統括部セキュリティ技術センターの松井です。

今回の記事は、過去にAttack Pathについて記載したブログ[1][2]の続編となります。

Attack Pathとはアイデンティティベースの攻撃の連鎖のことであり、内部侵害において攻撃者が好んで利用する攻撃手法です。企業ネットワークでよく利用されるActive DirectoryやEntra IDが攻撃の標的となる場合、アイデンティティベースの攻撃の連鎖を行うことで横展開や権限昇格を進めていく事例が多く見られます。

今回は、Attack Pathにおいて着目されることが多いService Principal Name(以降、SPNと記載します)について考察していきたいと思います。

目次

SPNとは

SPNとはドメイン環境においてサービスを一意に識別する仕組みです。SPNは、サービスの一般的な名称であるサービスクラス、サービスが実行されるホスト名、ポート番号(オプション)、サービス名(オプション)を用いて以下の構文で表現されます。new window[3]

<service class>/<host>
<service class>/<host>:<port>
<service class>/<host>:<port>/<service name>

ビルトインのサービスクラスについてはMicrosoftのドキュメントnew window[4]で一覧化されています。なお、SPNのサービスクラスでよくみられるHOSTやLDAP、MSSQLSvcがリストされておらずこのリストは網羅的でないと考えています。

ビルトインのサービスクラス一覧

SPNの設定方法

SPNを設定する際は、サービスの一般的な名称であるサービスクラスと、サービスが実行されるホスト名に加えて、当該サービスを実行するサービスアカウントを指定して設定します。サービスとしてSPNを設定するメリットについては、国井氏のブログnew window[5]で分かりやすく説明されています。

SPNを設定する際に必要な要素

  • サービスクラス
  • サービスが実行されるホスト名
  • サービスを実行するサービスアカウント

SPNの設定には、setspn.exeがよく用いられます。Domain Admins権限を持つユーザで以下の情報がマッピングされたSPNを構成してみます。

  • サービスクラス:MSSQLSvc
  • サービスが実行されるホスト名:sql01.contoso.local:1433
  • サービスを実行するサービスアカウント:ServiceAccount01

setspn.exeによる設定コマンドは次のようになります。
setspn.exe -S MSSQLSvc/sql01.contoso.local:1433 ServiceAccount01

もしくは、Set-ADUserコマンドレットを用いた方法も可能です。
Set-ADUser -Identity "ServiceAccount01" -ServicePrincipalNames @{Add="MSSQLSvc/sql01.contoso.local:1433"}

設定済みの全てのSPNは、setspn.exeを-Qオプションで*/*を指定して実行することで確認することができます。

setspn.exeによるSPN確認の実行結果

または、Active Directoryモジュールnew window[6]とLDAPクエリを利用して確認することもできます。ここではLDAPクエリの詳細については説明を割愛します。

zoom拡大する
LDAPによるSPN確認の実行結果

今回設定したSPNとサービスアカウントの関係性イメージは以下の通りです。

SPNとサービスアカウントのイメージ

SPNの攻撃手法(Kerberoasting攻撃)

SPNは攻撃者にとって興味深い攻撃面になることがあります。ケルベロス認証において、ユーザはサービスにアクセスする際にドメインコントローラから受け取ったサービスチケット(ST)を利用します。このサービスチケットはサービスに紐づくサービスアカウントのパスワードから生成されたNTLMハッシュによって暗号化されています。そのため、仮にサービスアカウントのパスワードの強度が低い場合、攻撃者は取得したサービスチケットをローカルでクラックし、平文のパスワードを得る可能性があります。以下は、ケルベロス認証によるサービスへのアクセスの様子を簡単に表現したもので

ケルベロス認証によるサービスへのアクセス

ユーザにキャッシュされたサービスチケットはklistコマンドで確認することができます。以下の実行結果では、MSSQLSvcのサービスチケットがキャッシュされていることが分かります。

取得したチケットの確認

サービスアカウントであるServiceAccount01のパスワードの強度を意図的に低く設定したうえで、ドメインコントローラのTGTサーバから受け取ったサービスチケットをクラックし、平文パスワードを解析してみます。

zoom拡大する
サービスチケットをクラックする様子

クラックツールと辞書ファイルを用いて簡単にパスワードを取得することができました。この攻撃はKerberoasting攻撃と呼ばれるよく知られた攻撃手法です。Kerberoasting攻撃は、Red Siege社の創業者でSANS講師でもあるTim Medin氏new window[7]によって開発されました。

仮に、ServiceAccount01がDomain Adminsグループに所属している場合、攻撃者はほんの数ステップからなるAttack Pathで特権に権限昇格ができてしまう可能性があります。

ServiceAccount01がDomain Adminsグループに所属するイメージ

Targeted Kerberoasting攻撃

次に、Kerberoasting攻撃の応用として、興味深い攻撃手法について紹介します。Kerberoasting攻撃では、SPNによって紐づいたサービスアカウントのパスワードを解析しましたが、Domain Usersのユーザであっても他のユーザアカウントに対してGenericALLもしくはGenericWriteの権限が付与されている場合、既存のユーザアカウントに対して任意のSPNの設定が可能となります。そのため、本来SPNが設定されていないユーザアカウントに対して強制的にKerberoasting攻撃を行うことが可能です。

Targeted Kerberoasting攻撃のイメージ

user01がuser02に対してGenericWrite権限を持つ場合、user02に対してSPNの設定が可能となります。指定するサービスクラスとホスト名は環境に存在しない任意の文字列でも機能します。ここでは分かりやすくサービスクラスにHack、ホスト名にHackとデタラメなSPNを設定しています。

Targeted Kerberoasting攻撃の様子

このようなデタラメなSPNであっても、user02のパスワードから生成したNTLMハッシュで暗号化したサービスチケットを発行させることで、ローカルクラックを試行することが可能になります。

取得したチケットの確認

緩和策

Kerberoasting攻撃の緩和策には次の対策が考えられます。

  • SPNの棚卸を行い設定の必要性を確認する
  • SPNにマッピングされているサービスアカウントの権限、パスワードを確認する
  • グループ管理サービスアカウント(gMSA)を使用する
  • 強度の弱いチケットの暗号化方式(RC4-HMAC)を規制する
  • RC4-HMACでのチケットリクエストの監視や脅威ハンティングを行う

まとめ

今回は、Attack Pathでの攻撃面として興味深いSPNについてご紹介しました。アイデンティティベースの攻撃は正規の機能を悪用するためステルス性が高く検知が難しくなります。Attach Pathに特徴的な攻撃手法を知り、緩和策に取り組むことが重要と考えます。最後まで読んでいただきありがとうございました。

参考文献

執筆者プロフィール

松井 祐輔(まつい ゆうすけ)
セキュリティ技術センター

脅威インテリジェンス、内部侵入攻撃対策を専門とする。
大規模国際イベントや官民向けのサイバーセキュリティ対応業務を経て、現在はNEC CSIRT Cyber Threat Intelligenceなどの業務に従事。

CISSP、CISA、2×SANSメダル、5×Splunk Botsトロフィー、Offensive Securityメダル、3×Taniumメダルを保持。
YamatoSEC上忍、AD Hack WGリード、Hardening Project Kuromame6 メンバー、Offensive Security Lab Japan実行委員

執筆者の他の記事を読む

Escキーで閉じる 閉じる