Compact
true
担当領域:セキュリティ技術センター
脅威インテリジェンス、内部侵入攻撃対策を専門とする。 大規模国際イベントや官民向けのサイバーセキュリティ対応業務を経て、現在は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実行委員

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

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

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

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

SPNとは

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

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

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

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

SPNの設定方法

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

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

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

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確認の実行結果
setspn.exeによるSPN確認の実行結果
50

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

LDAPによるSPN確認の実行結果
LDAPによるSPN確認の実行結果
100

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

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

SPNの攻撃手法(Kerberoasting攻撃)

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

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

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

取得したチケットの確認
取得したチケットの確認
50

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

サービスチケットをクラックする様子
サービスチケットをクラックする様子
100

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

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

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

Targeted Kerberoasting攻撃

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

Targeted Kerberoasting攻撃のイメージ
Targeted Kerberoasting攻撃のイメージ
100

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

Targeted Kerberoasting攻撃の様子
Targeted Kerberoasting攻撃の様子
50

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

取得したチケットの確認
取得したチケットの確認
50

緩和策

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

まとめ

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

参考文献

[1] Active DirectoryにおけるAttack Path(攻撃パス)| NECブログ
https://group.nec/jp/ja/solutions/cybersecurity/blog/231117

[2] Active Directory Certificate Services (ADCS) におけるAttack Path | NECブログ
https://group.nec/jp/ja/solutions/cybersecurity/blog/240719

[3] 一意の SPN の名前形式 | Microsoft
https://learn.microsoft.com/ja-jp/windows/win32/ad/name-formats-for-unique-spns

[4] How the Kerberos Version 5 Authentication Protocol Works | Microsoft
https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc772815(v=ws.10)#service-principal-names

[5] Service Principal Name (SPN) について
https://azuread.net/archives/1070

[6] Using ActiveDirectory module for Domain Enumeration from PowerShell Constrained Language Mode
https://www.labofapenetrationtester.com/2018/10/domain-enumeration-from-PowerShell-CLM.html

[7] Tim Medin | SANS
https://www.sans-japan.jp/sans_instructor_tim_medin

執筆者プロフィール

執筆者
original
50

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

脅威インテリジェンス、内部侵入攻撃対策を専門とする。
大規模国際イベントや官民向けのサイバーセキュリティ対応業務を経て、現在は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実行委員