Active Directoryのハッキング検証、Kerberoast

今回はActive Directoryの脆弱性を用いた攻撃「Keberoast」を検証します。

Keberoatは、SPNというADの機能を悪用し、ユーザの認証情報を取得することが可能です。

SPNの理解は結構難しいかもしれないので、以下の知識を習得して本記事を読むことをオススメします。
* Active DirectoryにおけるSPNの役割
* ケルベロス認証の知識(特にTGT, TGSのやりとり)

本記事では、できるだけ詳細部分は割愛して、エッセンスをお伝えし、RedTeam入門者の学習を進めるサポートになれればと思います!

ぜひ分からない点や感想などをコメントいただけると助かります。

目次

SPNとは?

SPN(Service Principle Name)とは、Kerberosクライアントがサービスのインスタンスを一意に識別するために使用する名前です。

また、SPNはサービス実行者(サービスアカウント、ユーザアカウント等)に関連付けることが可能です。これによって、他のADリソースは、どのサービスがどのアカウントで実行されているかを認識することが可能です。

SPNは下記のような構成をとっています。

ServiceClass/Hostname:Port
(例)
MSSQLSvc/sqlserver.example.com
MSSQLSvc/sqlserver.example.com:1433
  • ServiceClass・・・サービスクラスを識別する文字列。例えばWebサービスの場合は「www」、ディレクトリサービスの場合は「ldap」が使われます。下記に一覧がありあます。
    SPNs – Active Directory Security
  • HostName・・・サービスが実行されているコンピュータ名です。
  • Port・・・サービスが実行しているTCP/UDPポート番号

以上を踏まえたうえで、SPNは下図の通り、Kerberos認証するときに、アクセスしたいサービスインスタンスについてKDCに伝える際に利用されます。

f:id:yuukoutetu:20210402212841p:plain:w600
ケルベロス認証におけるSPNの役割(簡易モデル)

もっと詳しいことが知りたい方は下記URLが分かりやすかったです。(Keberos認証の知識は前提)

SPNの脆弱性をついたKerberoast

では、SPNにはどのような脆弱性があるのでしょうか。

実はSPNが登録されたユーザがドメイン内にいる場合、他のドメインユーザから、KDCに対してチケットリクエストを行い、サービスチケットを取得することが可能です。

サービスチケットには、SPNに紐づくユーザのパスワードハッシュが含まれているので、これを復号することによって、平文のパスワードを取得することが可能です。

この一連の攻撃のことをKerberoastといいます。

以下では、SPNの設定とKerberoastの検証を行います。

脆弱性の検証

システム環境と前提条件

  • [OS] Windows Server 2016
  • [攻撃側ユーザ] client01u1
  • [攻撃対象ユーザ] client01u10
  • [SPN] cifs/dc.cyberlab.local

SPN設定検証の流れ~BlueTeam側~

まず、Active Directory側でclient01u1の設定を行います。
ダッシュボードからツール>Active Directory ユーザのコンピュータを開きます。
f:id:yuukoutetu:20210402215613p:plain

表示>拡張機能にチェックを押します。
f:id:yuukoutetu:20210322212036p:plain

ドメイン名>Users>client01u10を右クリックし、プロパティを開きます。
f:id:yuukoutetu:20210402215621p:plain

属性エディターを開き、servicePrincipalNameをダブルクリックし、SPNの登録を行います。今回は、cifs/dc.cyberlab.localとしています。
f:id:yuukoutetu:20210402215649p:plain

これで、client01u10にcifs/dc.cyberlab.localのSPNを登録することができました。

Kerberoast検証の流れ~RedTeam側~

攻撃側では、SPNに紐づいたアカウントがドメイン環境に存在することを悪用し、ユーザのパスワードを取得します。

まずは、PowerViewによって、そのようなアカウントを発見します。

f:id:yuukoutetu:20210402215629p:plain

結果、cifs/dc.cyberlab.localというユーザを発見できました。

次に、Invoke-kerberoast.ps1というスクリプトを利用して、SPNに関連付けられたアカウントのパスワードハッシュを取得します。

f:id:yuukoutetu:20210402215632p:plain

その結果、client01u10のパスワードハッシュを取得することができました。

ただ、このフォーマットだとHashcatが使えないので、フォーマット変更します。

f:id:yuukoutetu:20210402215643p:plain

hash.txtの内容は次の通りです。

f:id:yuukoutetu:20210402220850p:plain

ここからHash値のみを取り出し、改行・空白を削除したうえで、新しいファイルhash2.txtに書き込みます。

f:id:yuukoutetu:20210402220933p:plain

hash2.txtに対して、Hashcatを用いて辞書攻撃を行い、パスワードをダンプします。
f:id:yuukoutetu:20210402215651p:plain
結果、client01u10のパスワード「Passw0rd!」(ファイル末尾)を窃取することができました。
f:id:yuukoutetu:20210402215647p:plain
実際の攻撃者はこの情報を用いて、正規ユーザになりすまし、他の端末に横展開を行いながら、侵入拡大を行います。

個人的な見解、リスク低減策

Kerberoastは攻撃が非常に容易であり、また、ユーザの認証情報を取得される恐れがあるため、リスクレベルは高いです。

そのため、下記のような対策を中心に実施されることが望まれます。

  • 使用していないSPNの削除
  • パスワードポリシーの強化
  • SPNは高権限アカウント(Domain Admins等)には紐づけないこと
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

セキュリティコンサルタント【経歴】ベンチャー企業にてセキュリティ研究者として新規事業開発に従事した後、大手外資系企業にてペネトレーションテストやゼロトラストなどの幅広い業務を実施。現在はサイバー人材育成に携わりつつ、グローバル資格の効率的な勉強方法やセキュリティキャリアについて情報発信

コメント

コメントする

目次