クラウドコンピューティングが必要ですか? 今すぐ始める

DHCP DNS 動的更新を悪用した DNS レコードのスプーフィング

Ori David

執筆者

Ori David

December 07, 2023

Ori David

執筆者

Ori David

Ori David is a Security Researcher at Akamai. His research is focused on offensive security, malware analysis, and threat hunting. 

攻撃者は、まったく認証されていない状態で DNS レコードを上書きできるため、ドメイン内のホストに対して中間者としてのポジションを獲得できることになります。

エグゼクティブサマリー

  • Akamai のリサーチャーが、Microsoft Dynamic Host Configuration Protocol(DHCP)サーバーを使用した、Active Directory ドメインに対する新たな一連の攻撃を発見しました。 

  • この攻撃により、攻撃者は機密性の高い DNS レコードをスプーフィングすることができ、認証情報の窃取から Active Directory ドメインの完全な侵害まで、さまざまな影響が生じる可能性があります。今回の攻撃は認証情報を必要とせず、Microsoft DHCP サーバーのデフォルト設定で機能します。

  • かなり多くの組織が影響を受ける可能性があります。Microsoft DHCP サーバーは広く使用されており、Akamai の監視対象ネットワークの 40% で実行されていることが確認されました。

  • Akamai は調査結果を Microsoft に報告しましたが、修正は予定されていません。

  • このブログ記事では、今回の攻撃を緩和できるよう Microsoft DHCP サーバーを設定するためのベストプラクティスについて詳しく説明 するとともに、高リスクの設定の検知に向けてシステム管理者やブルーチームが使用することを目的とした ツールを共有 します。

  • 今後のブログ記事では、この攻撃の実行に関する攻撃者の視点からの詳しい技術情報をお伝えします。

はじめに

DNS レコードをスプーフィングできる能力は、攻撃者にとって非常に魅力的です。機微な情報の漏えい、認証情報の侵害、さらにはリモートコード実行など、破壊的な影響をもたらす可能性があるからです。

このブログ記事では、調査されたことがほとんどなく、一見無害に見える DHCP 機能によって顕在化する DNS のアタックサーフェスについて考察します。その機能を利用することで、攻撃者が Microsoft DNS サーバーの DNS レコードをスプーフィング可能ないくつかの方法を、Akamai は見つけました。 たとえば、認証されていない任意の DNS レコードの上書きなどです。

攻撃フローに加えて、Microsoft DHCP サーバーの内部動作、DNS や Active Directory とのインタラクション、そしてこれらのインターフェースのセキュリティを適切に確保する方法についても詳しく説明します。オンラインには DHCP に関する断片的(しかも不正確!)なリソースがあふれていますが、本ブログ記事は、このテーマに関し、防御担当者にとって重要な情報がすべてまとめられた正確で包括的なリソースです。

DNS と Active Directory

出発点は Active Directory(AD)です。AD は運用を DNS に大きく依存しています。各ドメインには、Active Directory Integrated DNS(ADIDNS)ゾーンと呼ばれる特殊な DNS ゾーンをホストする DNS サーバーが必要です(図 1)。このゾーンは、すべてのドメイン参加マシンと、AD 内のさまざまなサービスの DNS レコードをホストするために使用されます。

各ドメインには、Active Directory 統合 DNS(ADIDNS)ゾーンと呼ばれる特殊な DNS ゾーンをホストする DNS サーバーが必要です(図 1)。 図 1:デフォルトの ADIDNS

ADI ゾーン内のレコードは、 動的更新という DNS 機能を使用して管理されます。この機能により、各クライアントが各自のレコードに責任を持つことができます。DNS レコードを作成または変更する必要がある場合、クライアントはサーバー上で変更する必要のあるデータを含む特別な DNS リクエストを送信します(図 2)。DNS サーバーは、この要求を受信すると、内容に応じてクライアントのレコードを変更します。

 この機能を使用する場合は、各クライアントが自身のレコードに対する責任を持つことになります。DNS レコードを作成または変更する必要がある場合は、サーバーに対して変更する必要があるデータを含む特別な DNS リクエストを送信します(図 2)。 図 2:DNS の更新内容の例

DNS 動的更新の重要な機能の 1 つが 安全な更新です。これは、ゾーン内の各 DNS レコードを変更できるユーザーを制御することを目的としたものです。 安全な更新の機能がなければ、DNS サーバーはあらゆる更新要求をやみくもに受け入れるため、攻撃者が既存のレコードを簡単に上書きできることになります。この機能により、デフォルトでは、ADI ゾーンの DNS サーバーは安全な更新のみを受け入れるのです(図 3)。

この機能を使用すると、デフォルトで、ADI ゾーンの DNS サーバーによりセキュアな更新のみが受け入れられます(図 3)。 図 3:DNS 動的更新のデフォルト設定

安全な更新を使用すると、サーバーが受信したすべての更新要求に対して認証と承認が行われます。 これについて、ADI ゾーンでは Kerberos を使用して実行されます。サーバーに送信される更新には、ユーザーの認証に使用される Kerberos チケットが含まれます(図 4)。DNS を介した Kerberos 認証プロセスの詳細については、Dirk-Jan Mollema 氏による、 DNS 経由での Kerberos のリレーに関する研究をご参照ください。

更新がサーバーに送信されるときに、ユーザーの認証に使用される Kerberos チケットがその中に含まれます(図 4)。 図 4:DNS 更新内の Kerberos チケット

各 DNS レコードは、各プリンシパルのアクセス権を決定するアクセス・コントロール・リスト(ACL)によって保護されます。このアクセス権は、レコードが最初に作成されるときに決定されます。クライアントが DNS 動的更新を送信して DNS レコードを作成すると、DNS レコードを作成したマシンのアカウントが自動的にレコードの所有者として割り当てられ、そのレコードに対する権限が与えられるのです。通常は、すべての DNS クライアントが各自のマシン・アカウント・チケットを使用して DNS の更新を実行します。更新要求を承認するため、DNS サーバーは認証されたプリンシパルに対してレコードの ACL を検証します。

図 5 は、ホスト「PC.aka.test」の DNS レコードの ACL を示しています。このレコードはコンピューターアカウントによって作成されたため、変更する権限があります。

図 5 に、ホスト「PC.aka.test」の DNS レコードの ACL が確認できます。このレコードはコンピューターアカウントによって作成されたため、変更する権限があります。 図 5:DNS レコードのデフォルト ACL

他のプリンシパル(一部の強力な組み込みグループを除く)には、レコードに対する権限を持たせてはなりません。DNS レコードを所有していない、または DNS レコードへのアクセス権のない別のプリンシパルが変更を行おうとすると、サーバーは更新を拒否します。

ADIDNS ゾーンは攻撃者にとって非常に魅力的なものとなり得る存在です。 NETSPI の Kevin Robertson 氏による過去の調査 で、この DNS ゾーンに対するいくつかの興味深い攻撃が明らかにされています。Akamai は、このアタックサーフェスの解明を進めるために関連する機能をさらに詳しく調べ始め、結果、興味深い対象に行き着きました。それが DHCP DNS 動的更新です。

DHCP DNS 動的更新

DHCP は、IP アドレスやその他のネットワークオプションをクライアントに自動的に割り当てるために使用されるネットワーク管理プロトコルです。クライアントは、新しいネットワークに接続すると、ブロードキャストメッセージを送信してネットワーク設定を要求することで DHCP サーバーに到達しようとします。DHCP サーバーは、この要求を受信すると、割り当てられた IP アドレスをクライアントに返します。

DHCP はほとんどの企業ネットワークで使用される非常に一般的なプロトコルであり、特に Microsoft DHCP サーバーは極めて人気の高いオプションです。 Microsoft DHCP サーバーは、Akamai の監視対象のデータ・センター・ネットワークの 40% で稼働しています。

最新の Windows クライアント(Windows 2000 以降)は通常、DNS 動的更新を送信して独自のレコードを作成しますが、常にそうだとは限りません。DNS レコードは、 DHCP DNS 動的更新と呼ばれる DHCP 機能によって作成される場合もあります。 この機能の目的は、DHCP サーバーがクライアントの代わりに DNS レコードを登録できるようにすることです。DHCP サーバーからクライアントに IP アドレスが与えられれば、DHCP サーバーは DNS サーバーに接続し、クライアントの DNS レコードを更新できます。このような更新を実行するため DHCP サーバーは、何と驚くべきことに、DNS 動的更新を使用します。

名前が似ていてわかりづらいため、明確にしておきましょう。

機能

プロトコル

目的

DNS 動的更新

DNS

DNS クライアントが DNS サーバー上で DNS レコードを作成または変更できるようにします

DHCP DNS 動的更新

DHCP

DHCP サーバーがクライアントに代わって DNS レコードを作成または変更できるようにします。更新は DNS 動的更新を使用して実行されます

DHCP DNS 動的更新のプロセスは図 6 のとおりです。

動的更新プロセス 図 6:DHCP DNS 動的更新プロセス
  1. DHCP クライアントは DHCP サーバーから IP アドレスを取得し、FQDN を通知します。

  2. DHCP サーバーは、DNS サーバーに動的更新要求を送信します。

  3. DNS サーバーは要求を検証し、関連レコードを作成して、DHCP サーバーに動的更新応答で結果を通知します。

DHCP DNS 動的更新機能が有効になっていても、デフォルト設定では、クライアントに代わって DNS レコードの作成が行われることをクライアント自身が明示的に指定する必要があります(図 7)。

DHCP DNS 動的更新機能が有効になっていても、デフォルト設定で、クライアントが自分自身の代わりに DNS レコードを作成するように明示的に指定する必要があります(図 7)。 図 7:DHCP DNS 動的更新のデフォルト設定

これを指定するためには、クライアントが専用の DHCP オプションを送信する必要があります。DHCP オプション(図 8)は、DHCP パケットに追加できる追加フィールドであり、クライアントとサーバーが情報を交換するために使用します。

これを指定するためには、クライアントが専用の DHCP オプションを送信する必要があります。DHCP オプション(図 8)は、DHCP パケットに追加できる追加フィールドであり、クライアントとサーバーの情報交換に使用されます。 図 8:DHCP オプションの例

ここでは、クライアントは FQDN オプションを送信します( RFC 4702で指定したもの)。このオプションにより、DHCP クライアントはサーバーに完全修飾ドメイン名(FQDN)を通知し、クライアントに代わって DNS レコードを登録するかどうかを指定できます。これを行うため、クライアントは FQDN オプションに含まれているサーバーフラグを使用します。1 に設定すると、提供された FQDN に基づいてサーバーがレコードを作成するようになります(図 9)。

 これを 1 に設定すると、サーバーは提供された FQDN に基づいてレコードを作成するようになります(図 9)。 図 9:FQDN オプションありの DHCP リクエスト

この要求を受信すると、DHCP サーバーは DNS 動的更新を送信し、要求されたレコードを作成します(図 10)。

DHCP サーバーは、このリクエストを受信すると、DNS 動的更新を送信し、要求されたレコードを作成します(図 10)。 図 10:新しいレコードが作成された ADI DNS ゾーン

この機能は便利ですが、現在は一般的には使用されていません(前述のとおり、最新の Windows クライアントのほとんどは独自のレコードを作成するだけです)。しかし、 Microsoft DHCP サーバーでは、この機能がデフォルトで有効になっています。つまり、DHCP サーバーは DNS レコードを要求するすべてのクライアントに代わって DNS レコードを登録します。

DHCP DNS 動的更新では DHCP クライアントによる 認証が不要 であることに注意してください。ネットワーク内のすべてのユーザーが DHCP サーバーから IP をリースできるため、攻撃者は基本的に DHCP サーバーを使用して、自身の代わりに DNS サーバーへの認証を行うことができます。 これにより、攻撃者は認証情報なしで ADIDNS ゾーンにアクセスできるようになります。

Microsoft はこの機能がもたらす潜在的なリスクを認識し、そのいくつかを認めているようですが、このアタックサーフェスは依然として攻撃者や防御担当者にほとんど知られていない状況です。

次のセクションでは、DHCP DNS 動的更新の悪用によって実行され得る攻撃について詳しく説明します。

DHCP DNS スプーフィング

前述の ADIDNS スプーフィング攻撃により、 ADIDNS が武器として使用されるようになり、従来の LLMNR/NBNS スプーフィング 攻撃が強化されました。攻撃者は、失敗した名前解決の試み(「デッドホスト」)を特定したあとに、ADI ゾーンにその名前を登録し、今後の名前解決の試みが攻撃者のマシンに向けられるようにします。

この攻撃は非常に大きな影響を及ぼす可能性がありますが、重要な要件が 1 つあります。それは、有効なドメイン認証情報です。 しかし、DHCP サーバーを使用することで、この要件を回避し、認証情報なしで実行することができます。ADI ゾーンに FQDN が存在しない場合、DHCP DNS 動的更新を送信するだけで、DHCP サーバーによって FQDN が作成されます。このような攻撃を DHCP DNS スプーフィングと呼びます。この手法は、TrustedSec の Hans Lakhan 氏の ブログ記事 でも取り上げられています。

この攻撃にはどの DNS 名を使用できるのでしょうか。前述の Robertson 氏の調査によると、明らかに機能しない DNS 名があります。

この 2 つが利用できなくても、ネットワーク固有のデッドホストを特定するオプションが残されています。ネットワークをスニッフィングして、リンクローカルマルチキャスト名前解決(LLMNR)または NetBIOS ネームサービス(NBT-NS)経由で名前解決ブロードキャストを傍受することで、これらを識別できるのです。潜在的なデッドホストを特定したら、DHCP DNS 動的更新を送信し、一致する DNS レコードを作成できます(図 11)。

 到達不能ホストになっている可能性があるホストを特定したら、DHCP DNS 動的更新を送信して、一致する DNS レコードを作成できます(図 11)。 図 11:DHCP DNS 動的更新を使用して到達不能ホスト名にスプーフィング
  1. ネットワーク内のホストが「PC.aka.test」という名前の解決を試み、DNS サーバーにクエリーを送信します。

  2. この DNS サーバーは「PC.aka.test」を知らないため、「No such name」と応答します。

  3. 次に、ホストは LLMNR マルチキャストを送信して、LAN 内で「PC.aka.test」を探します。

  4. 攻撃者はこの試みを確認し、「PC.aka.test」を FQDN として使用して DHCP サーバーからの IP リースを要求します。

  5. DHCP サーバーが動的更新要求を DNS サーバーに送信し、レコードが作成されます。

これで、今後ネットワーク内のホストが「PC.aka.test」を解決しようとすると、攻撃者にリダイレクトされるようになります。攻撃者は ntlmrelayx.py を起動し、認証が試行されるのを待つだけです。

この方法は、標準的な手法の LLMNR/NBNS スプーフィングと変化形の ADIDNS スプーフィングのどちらよりも優れています。 

  • 従来の LLMNR/NBNS スプーフィングでは認証は不要ですが、被害者は同じ LAN 内に限定されます(LLMNR/NBNS はブロードキャストベースであるため)。

  • ADIDNS スプーフィングでは、LAN 外の被害者を標的にすることができますが(DNS はサブネット間で機能するため)、認証済みユーザーが必要です。

DHCP DNS 動的更新を使用すると、両方の利点が手に入ります。攻撃は LAN 外の被害者に対して機能し、認証は必要ないのです。

これは非常に優れた手口ですが、さらなる進化も可能です。

既存レコードの上書き

存在しない DNS レコードを作成するのは賢いやり口ですが、ここからさらに別の選択肢が浮かんできました。もし、既存のホスト名のレコードを作成するとどうなるでしょうか?何らかの方法で上書きできるのではないでしょうか?理想としては、そんなことが可能であってはなりません。しかし...

未認証の攻撃者が既存のレコードを上書きできるケースが確認されました。私たちはこの手法を DHCP DNS オーバーライトと呼びます。このケースについて説明する前に、DHCP 動的更新プロセスについてさらに詳しく説明します。

DNS レコードタイプとその所有者

DHCP DNS 攻撃という文脈においては、2 種類の DNS レコードを区別することが重要です(図 12)。ここからは次の用語を使用します。

  • クライアントレコード:Windows クライアントによって直接作成されたレコード

  • マネージドレコード:クライアントの代わりに DHCP サーバーによって作成されたレコード

DHCP DNS 攻撃では、2 種類の DNS レコードを区別することが重要です(図 12)。 図 12:DNS レコードタイプ

両クライアントの決定的な違いは、所有者です。前述の とおり、DNS 更新が実行されると、クライアントレコードが作成され、更新要求を送信したプリンシパルがレコード所有者として割り当てられます。通常の Windows クライアントの場合、このプリンシパルはクライアントのマシンアカウントです。

マネージドレコードの所有者も要求元のクライアントだと思う方もいるかもしれませんが、そうではありません。DHCP サーバーがクライアントに代わって DNS 更新を送信すると、認証も DHCP サーバー のマシンアカウントを使用して行われ、DHCP サーバーがレコード所有者になるのです。

この違いは図 12 で確認できます。PC2 はクライアントが所有するクライアントレコード、PC1 は DHCP サーバーが所有するマネージドレコードです。

アクセス・コントロール・リストが DHCP DNS オーバーライトを制限

既存のレコード(このケースでは「PC.aka.test」)で DHCP DNS 動的更新を実行しようとすると、失敗します。その際、興味深い挙動が確認されます。DHCP サーバーは実際には 供給された FQDN を使用して DNS 更新を送信しますが、更新はサーバーによって拒否されるのです(図 13)。

興味深いふるまいが観察されました。DHCP サーバーは実際に、指定された FQDN に基づく DNS 更新を送信しますが、その更新はサーバーに拒否されます(図 13)。 図 13:DHCP DNS 更新をサーバーが拒否

これが発生するのは、DHCP サーバーがレコードの変更を許可されていないためです。

「PC.aka.test」は クライアント レコードであり、それを所有するプリンシパルは「 PC$ 」です。DHCP サーバーが DNS 更新を送信すると、DHCP サーバーのマシンアカウント「 DHCP$」を使用して認証が行われます。このアカウントにはレコードに対する権限がないため、更新は拒否されます(図 14)。

このアカウントにはレコードに対する権限がないため、更新は拒否されます(図 14)。 図 14:DNS レコードの上書きが失敗

要約すると、攻撃者は DHCP サーバーを使用して任意の DNS 更新を送信することができますが、DNS レコードは ACL によって上書きから守られています。

上書きを防止するメカニズムを理解したところで、それでも上書きを実行する方法を考えてみましょう。

マネージドレコードの上書き

ACL による制限があるため、既存のクライアントレコードの上書きは機能しませんが、マネージドレコード(DHCP によって作成されたレコード)の上書きは 機能します。なぜなら、認証を行うマシンがレコード所有者でもあるからです(図 15)。

これが可能なのは、DHCP サーバーが DNS レコードの所有権を検証せず、要求された FQDN の DNS 更新を送信するためです。

既存のクライアントレコードを上書きしようとしても、ACL の制限により上書きできませんが、管理対象レコード(DHCP によって作成されたレコード)は、認証マシンもレコードの所有者になるため、上書きできます(図 15)。 図 15:DHCP サーバーが所有するレコードの DHCP DNS 上書き

ご覧のとおり、DHCP サーバーはレコードの所有者であるアカウント(DHCP サーバー自体のアカウント)を使用して更新を実行するため、更新は成功します。

1 つの例を見てみましょう。Ubuntu サーバーを起動しますが、このサーバーはドメインの一部ではないため、独自の DNS レコードを登録できません。そこで、DHCP サーバーに代行させます(図 16)。

そのサーバーは、自身に代わって DHCP サーバーに実行するよう求めます(図 16)。 図 16:DHCP サーバーが Ubuntu サーバーの代わりに DNS レコードを登録

このレコードは、DHCP サーバーのマシンアカウントによって所有されています。そして、攻撃者のマシンはリースプロセスにおいて DHCP サーバーから同じ FQDN を要求します。DNS ゾーンを確認すると、上書きが正常に行われたことがわかります。レコードは、攻撃者にリースされた IP に向けられています(図 17)。

DNS ゾーンを確認すると上書きは成功しており、レコードは、私たちにリースされた IP を参照していることがわかります(図 17)。 図 17:上書きされた Ubuntu サーバーの DNS レコード

この攻撃は成功しましたが、影響を受けるのはマネージドレコードのみであり、影響はかなり限定的です。前述のとおり、マネージドレコードは、この攻撃の影響を受けないクライアントレコードに比べてかなりの少数派です。しかし、マネージドレコードは、クライアントが独自のレコードを登録できない場合にも使われています。たとえば、次のようなクライアントです。

  • Windows 以外のクライアント

  • 旧式の Windows クライアント 

  • クライアント DNS 更新が無効になっている Windows クライアント

DHCP 自己上書き

影響力を高めるためには、ADI ゾーンに存在するレコード、すなわちクライアントレコードを上書きできるようにする必要があります。問題は、このレコードを作成したマシンがレコードの所有者であること、そして DHCP サーバーのマシンアカウントを使用しないと認証を行えないことです。

しかし、 DHCP サーバーの DNS レコードはどうでしょうか。 DHCP サーバーが独自の DNS レコードを作成すると、そのマシンアカウントがレコード所有者になります。そのため、 DHCP サーバー自体に DHCP DNS オーバーライトを実行させることができるのです。 DHCP サーバー名を FQDN として供給すると、DHCP サーバーは自身のクライアントレコードの DNS 更新を送信します。そして、この上書きは成功することになります。

DHCP を使って DHCP を破壊 図 18 は、この攻撃の流れを示した図です。
DHCP DNS 上書き 図 18:DHCP サーバーの DNS レコードの DHCP DNS 上書き

この攻撃は有効性がより優れています。Microsoft DHCP サーバーがネットワークに存在する場合、それに適合するクライアントレコードが確実に存在しますが、一方でマネージドレコード(これまでの上書きシナリオで必要とされていたレコード)は稀にしか存在しません。

影響力はどうかと言うと、攻撃者は DHCP サーバー宛てのあらゆる通信を傍受できます。重大度は、このトラフィックの性質によって異なります。ほとんどの場合、DHCP サーバー宛ての通信を傍受する機能には、認証情報を傍受してリレーしたり、サーバーにインストールされている可能性のある他のサービスの機密トラフィックを取得したりするために悪用されるおそれがあります。

機微なサービスの場合、ドメインコントローラー(DC)に DHCP サーバーがインストールされていたら、どうなるでしょうか。DC レコードを上書きできるでしょうか。なんと、できることがわかりました。

任意の DHCP DC オーバーライト

DHCP サーバーが DC にインストールされている場合、DC のレコードに DHCP DNS オーバーライトを実行できます(理由は前述のとおりです)。これは非常に有用ですが、実行可能な内容は他にもあります。

すでに説明したとおり、DHCP サーバーが DC にインストールされている場合、DNS 更新を送信する際に DC のマシンアカウントが使用されます。興味深いことに、任意の DNS レコードのデフォルトの ACL を調べると、 ENTERPRISE DOMAIN CONTROLLERS 」というプリンシパルに、ゾーン内のすべての DNS レコードに対する書き込み権限があることがわかります。レコードの作成者を問わず、です (図 19)。

興味深いことに、任意の DNS レコードのデフォルト ACL を調べてみると、誰が作成したかに関係なく ENTERPRISE DOMAIN CONTROLLERS プリンシパルは、ゾーン内のすべての DNS レコードに対する書き込み権限を持っていることがわかります(図 19)。 図 19:ENTERPRISE DOMAIN CONTROLLERS グループを含むすべてのドメインレコードのデフォルト ACL

これは大発見です。DHCP サーバーが DC である場合、ゾーン内のすべてのレコードに対する権限があるため、攻撃者はそれを利用し、 未認証ユーザーであるにもかかわらず ADI ゾーン内の DNS A レコードを上書きし得るのです。 図 20 はこの攻撃を表しています。

これは非常に大きな問題です。DHCP サーバーが DC の場合、このサーバーはゾーン内のすべてのレコードに対する権限を持つため、攻撃者がこれを悪用し、認証されていない状態で ADI ゾーン内の任意の DNS A レコードを書き換える恐れがあります。図 20 は、この攻撃の様子を示した図です。 図 20:DHCP サーバーが DC の場合の、任意の DHCP DNS 上書き

Akamai のデータによると、この危険な構成は非常に一般的です。Akamai が調べたところ、Microsoft DHCP サーバーを使用しているネットワークのうち 57% が DC に DHCP サーバーをインストールしています。これらのドメインはすべて、デフォルトで脆弱な状態です。

このリスクについて Microsoft は文書で認めています が、この不適切な設定は影響力があるにもかかわらず十分に認知されていないと、Akamai は考えています。

DHCP DNS 攻撃に対する緩和策と回避方法

ここまで説明してきたすべての攻撃は、Microsoft DHCP サーバーのデフォルト設定で機能します。しかし、その一部を緩和するうえで役立つ設定が 2 つあります。その内容と、それによって攻撃を回避する方法を見てみましょう。

DHCP 名前保護

ご存知のとおり、DHCP サーバーが DNS レコードを作成する場合、他のクライアントが同じ FQDN を要求してサーバーに上書きを行わせないようにすることはできません。 名前保護 は、これを防止するための機能です。

名前保護は、特別な DNS レコードタイプである DHCID(DHCP クライアント識別子)を使用して実行されます。名前保護を有効にすると、DHCP サーバーがクライアントに代わってレコードを登録するたびに、追加の DHCID レコードが作成されます(図 21)。

名前保護が有効になっている場合、DHCP サーバーがクライアントに代わってレコードを登録するたびに、追加の DHCID レコードが作成されます(図 21)。 図 21:名前保護が有効になっている状態で、DHCP サーバーによって作成された DHCID レコード

ご覧のとおり、DHCID レコードの値は Base64 でエンコードされたデータ群です。この値(この記事で後ほど分析します)は、レコードの作成または更新を要求した DHCP クライアントを識別するための一意のシグネチャーです。

DHCP サーバーは、DNS レコードの変更を要求されると、クライアントの DHCID 値を計算し、更新されたデータとその DHCID 値を含む DNS 更新を送信します。 

DHCP サーバーは、レコードが DNS サーバー上に存在しない場合は、レコードと、一致する DHCID レコードを作成しますが、ホスト(A)レコードと DHCID レコードが存在する場合は、既存の DHCID 値と DHCP サーバーから送信された DHCID 値との比較が行われ、更新は値が一致する場合にのみ実行されます。

したがって、基本的に、DHCID レコードは DNS レコードを作成したクライアントに DNS レコードを関連付けます。そしてこの関連付けが行われると、元のクライアントのみがレコードの変更を実行できるようになります。

名前保護の回避

しかし、DHCP リリースメッセージを使用して名前保護を回避する方法が見つかりました。DHCP リリースメッセージとは、リースされた IP アドレスが不要になったときに、DHCP クライアントがサーバーにそれを通知するために送信するメッセージです。リースしたアドレスを追跡するために、DHCP サーバーは、さまざまなアドレス、その有効期限、リース先のクライアントの一意の識別子を格納するテーブルを保持します(図 22)。

DHCP サーバーは、それぞれのアドレス、その有効期限、リースしたクライアントの一意の識別子を格納するテーブルを保持して、リースしたアドレスを追跡できるようにします(図 22)。 図 22:DHCP サーバーのリーステーブルのエントリ

一意の識別子は、クライアントの MAC アドレスです。クライアントからリリースメッセージを受信すると、DHCP サーバーは一致するアドレスと ID を持つ既存のエントリーを検索し、見つかった場合は削除します。DHCP DNS 動的更新が有効になっている場合は、IP アドレスを解放するだけでなく、DHCP サーバーは DNS 動的更新の送信も行い、クライアントの関連 DNS レコードを削除します。

ターゲットの ID と一致する一意の ID(MAC アドレス)を含む DHCP リリースを送信できれば、DHCP サーバーがレコードを削除するため、攻撃者はそれを登録できるようになります。 名前保護を回避するために必要なものは、被害者の MAC アドレスだけなのです。 (実際の MAC を変更する必要はありません。値は DHCP ヘッダーから取得されます。)

ターゲットと同じ LAN 上にいる場合、MAC の検出は非常に簡単です。たとえば、ARP 要求を送信すれば検出できます。では、同じ LAN にいない環境ではどうでしょうか。その場合は別の選択肢があります。

総当たり攻撃で DHCID レコードを把握し、名前解決を回避

DHCID レコードは RFC 4701で定義されており、そのアルゴリズムは次のとおり非常にシンプルです。

  1. 次の値を連結します

    • DHCP HTYPE(ハードウェアタイプ)。イーサネットの場合、値は 01 です。 

    • DHCP クライアント ID オプション

    • レコード FQDN(DNS ワイヤー形式

  2. その結果を SHA256 とします

  3. DHCID データビットを追加します(Windows 実装では、この値は一定です)

  4. その結果を Base64 でエンコードします

図 23 は DHCID の計算例を表しています。

図 23 は、DHCID の計算例です。 図 23:DHCID の計算例

FQDN とデータビットは一定であることがわかっているため、唯一の変数はクライアント ID で、今回もこれはクライアントの MAC アドレスです。

DHCID レコードは通常の DNS レコードであり、どのクライアントも DNS サーバーに値を問い合わせることができます。DHCID レコードを計算するアルゴリズムは把握済みなので、考え得るすべての MAC アドレスを反復処理し、DHCID 値を計算して、それぞれの結果をターゲットレコードと比較することができます。一致したら、正しい MAC アドレスが見つかったということです。このように、攻撃者は総当たり攻撃によってそれほど時間をかけずに MAC アドレスを把握可能です。最新の専用コンピューターなら、考え得る 248 の MAC アドレスを数日で解読できることもあります。一般的なベンダー ID のみを使用すれば、この時間は大幅に短縮されます。図 24 はこのプロセスの例を表しています。

 一般的なベンダー ID のみを使用すれば、この時間を大幅に短縮できます。図 24 は、このプロセスの例です。 図 24:名前保護によって保護された DNS レコードの削除

参照 コード を、指定されたパラメーターに基づいて DHCID 値を計算するために使用できます。

名前保護による副作用的な緩和効果

DHCP 名前保護は、マネージドレコードへの対処用です。基本的に、DHCP サーバーは、DHCP サーバーによって作成されたレコードが任意のクライアントによって変更されないように保護します。名前保護は、クライアントレコードとは無関係です。

ただし、場合によっては、名前保護によってクライアントレコードへの攻撃を緩和することが可能です。

名前保護を有効にして DNS レコードを更新する場合、DHCP サーバーには DHCID レコードの存在が必要です。通常の DNS クライアントは DHCID レコードを作成しないため、クライアントレコードには DHCID レコードが付属しません。その結果、DHCP サーバーからクライアントレコードを更新しようとすると失敗します(図 25)。

DHCP サーバーからクライアントレコードを更新しようとすると失敗します(図 25)。 図 25:DHCID レコードが存在しない場合は DNS の更新が失敗

これが発生する原因は、名前保護の実装方法です。名前保護が有効になっている DHCP サーバーが DNS 更新を送信すると、要求に Prerequisites(前提条件)フィールドが追加されます。このフィールドは、DNS 更新を実行するために DNS サーバーで満たす必要がある条件を指定します。図 26 では、DHCP サーバーから送信された DNS 更新に DHCID 値の前提条件が含まれていることがわかります。

 図 26 を見ると、DHCP サーバーから送信された DNS 更新に DHCID 値の前提条件が含まれていることがわかります。 図 26:DNS 更新の前提条件

これは、一致する値が存在しない場合に更新が失敗することを意味します。クライアントレコードには DHCID レコードがないため、名前保護が有効になっている場合は、DHCP DNS オーバーライトの回避策が講じられていなくても、クライアントレコードは DHCP DNS オーバーライトから保護されます。 そのはずです

これは本来、名前保護機能の一部ではなく、副産物のようなものです。なぜなら、名前保護機能は定義上、マネージドレコードのみを保護することを目的としているからです。しかし、前述の論理により、クライアントレコードも保護される可能性があります。とはいえ、このような偶発的な防御でさえ回避されるかもしれません。

DHCP スコープが光明?

DHCP サーバーは、複数のスコープを定義する機能をサポートしています。スコープとは、DHCP がリースできる特定のサブネット内の定義済み IP アドレスのセットです(図 27)。 

DHCP サーバーは、複数のスコープを定義する機能をサポートしています。スコープとは、特定のサブネット内で DHCP がリースできる定義済みの IP アドレスのセットのことです(図 27)。 図 27:DHCP スコープの例

スコープに分割することで、アドレスの割り当て状況をより適切に管理できるようになります。また、サブネットごとに別々のポリシーを適用することも可能になります。名前保護はこれらのポリシーの 1 つであり、スコープレベルで有効にできるため、スコープごとに設定することができます。

今回の記事で前述したように、クライアントレコードに対して DHCP DNS の上書きを実行しようとしたとき、リース元が 名前保護が適用されている DHCP スコープであったため、失敗しました。しかし、次のことを理解することが重要です。スコープは DHCP の世界の話です。クライアントレコードはスコープを認識しておらず、どのスコープにも関連付けられていません。

そのため、名前保護が無効になっている別のスコープからリースを取得できれば、この緩和を「バイパス」できます(名前保護が無効になっている別のスコープからリースを取得する方法は、本記事の範疇から外れるため説明を省きますが、 DHCP リレーオプションでご確認いただけます)。

このことは、サーバーの 1 つのスコープで名前保護が無効になっていても、(前述の設定ミスが 1 つでもあれば)攻撃者にとってクライアントレコードを上書きする条件が十分に整っている可能性が高いことを意味します。

DNS 認証情報

DHCP サーバーで設定できるもう一つの設定は DNS 認証情報です。この設定により、ドメインユーザーの認証情報を提供し、レコードの作成および更新時に、マシンアカウントではなく、DHCP サーバーにこの設定を使用させることができます(図 28)。

この設定により、ドメインユーザーの認証情報を提供し、レコードの作成および更新時に、マシンアカウントではなく、DHCP サーバーにこの設定を使用させることができます(図 28)。 図 28:DHCP DNS 認証情報の設定

DHCP サーバーが DC に設置された場合の例に戻りましょう。DNS レコードを更新する際に、DC マシンアカウント、つまりゾーン内のすべてのレコードに対して権限を持つアカウントが使用されました。DNS 認証情報が設定されている場合に、代わりに権限の弱いアカウントを使用するようにすれば、攻撃は機能しなくなります。

DNS 認証情報を設定することは、DHCP サーバーに生じるアタックサーフェスを小さくすることができるため、非常に重要です。前述した最も深刻な攻撃を緩和できるはずです。

ただし、この機能を使用する際には、以下の 2 つの詳細事項を考慮する必要があります。

  • 設定する認証情報は、権限の弱いユーザーであること。たとえば、私たちがドメイン管理者として設定したとしても、DHCP サーバーには依然として任意のレコードを上書きする権限があります。

  • DHCP サーバーによって作成された DNS レコードは、依然として同じ認証情報によって所有され、DHCP DNS 上書きに対して脆弱です。

DNSUpdateProxy グループ

Microsoft の DHCP と DNS との相互作用を調査しているうちに、悪用される可能性のある別の機能が見つかりました。 DNSUpdateProxy グループです。このグループは、クライアントのアップグレードに関する問題と、複数の DHCP サーバーの問題という、管理対象レコードの権限関連の 2 つの問題を解決することを目的としています。

クライアントのアップグレードに関する問題

まず、クライアントのアップグレードに関する問題について考えてみましょう。レガシークライアントは、最初に DHCP サーバーを使用して DNS レコードを登録しますが、その後、DNS 動的更新をサポートする新しい OS にアップグレードされます。レコードは、レコードを作成した DHCP サーバーによって所有されるため、クライアントはレコードを直接変更できません。

この問題を解決するためには、DHCP サーバーを DNSUpdateProxy グループに追加する方法があります。

このグループには 2 つの効果があります。1 つ目の効果は、そのメンバーが DNS レコードを作成する際、レコードの ACL が通常の管理対象レコードと異なり、 認証ユーザー グループにレコードに対する書き込み権限が与えられることです。これは、ドメイン内のすべてのクライアントを変更できることを意味します(図 29)。

1 つ目の効果は、そのメンバーが DNS レコードを作成する際、レコードの ACL が通常の管理対象レコードと異なり、認証ユーザーグループにレコードに対する書き込み権限が与えられることです。これは、ドメイン内のすべてのクライアントを変更できることを意味します(図 29)。 図 29:DNSUpdateProxy レコードの ACL

2 つ目の効果は、「レコード引き継ぎ」という機能です。DNSUpdateProxy メンバーが作成したレコードを変更した最初のクライアントには、そのレコードの所有権が付与され、認証されたユーザーの書き込み権限が削除されます。これにより、必要なときに、クライアントが自分のレコードを変更し、それを引き継げるようになるため、クライアントのアップグレードの問題が解決されます。

複数の DHCP サーバーの問題

2 つ目の問題は、複数の DHCP サーバーが連携する必要がある場合に発生します。この例では、 DHCP1DHCP2という 2 台の DHCP サーバーがあり、クライアント PC1 は DHCP1 を介して DNS レコードを登録します。

ここで DHCP1 が何らかの理由でオフラインになり DHCP2 に処理が移ったとします。クライアントのリースが期限切れになるため、DHCP2 に対して新しいリースを要求します。DHCP2 が新しい IP をリースし、クライアントの DNS レコードを変更しようとしても、そのレコードは DHCP1 が所有しているために失敗します(図 30)。

2 つ目の問題は、複数の DHCP サーバーが連携する必要がある場合に発生します。この例では、DHCP1 と DHCP2 の 2 台の DHCP サーバーがあり、クライアント PC1 は DHCP1 を介して DNS レコードを登録します。 図 30:複数の DHCP サーバー設定の例

この問題も、DNSUpdateProxy グループの新しい機能を活用して解決することができます。DNSUpdateProxy のメンバーが別のメンバーが所有するレコードを変更しようとした場合、ACL のおかげで更新が成功しますが、 このケースでは ACL と所有権は変わりません。 これにより、複数のサーバーでレコードを「共同所有」できるようになります。

セキュリティリスクとバグ

ここまでの説明で、DNSUpdateProxy グループがセキュリティリスクをもたらすことを理解できたと思います。 このグループのメンバーによって作成されたレコードは、認証されたユーザーであれば「盗む」ことができることになります。これは脆弱性ではなく、機能の仕組みの悪用です。Microsoft はこのリスクを認識しています。

このリスクに加えて、私たちは DNSUpdateProxy 機能の実装でバグと見られる問題に起因する別の問題を検出しました。グループのメンバーが それ自身 の DNS レコードを作成するときに、同じ権限の弱い ACL で作成され、認証されたユーザーが書き込み権限を持つことになります。

図 31 は、その例を示しています。DHCP サーバーの dhcp1.aka.test レコードの ACL は、当初は安全な状態です。

図 31 は、その例を示しています。DHCP サーバーの dhcp1.aka.test レコードの ACL は、当初は安全な状態です。 図 31:DHCP サーバーの最初の ACL

マシンアカウントにそのレコードに対する権限があり、認証ユーザーグループがどこにもないことがわかります。次に、サーバーを DNSUpdateProxy グループに追加し、DNS レコードが再作成されるようにします。再作成は、サーバー名が変更された場合など、いくつかの理由で発生する可能性があります。DNS レコードが再作成された後に、その新しい ACL を調べます(図 32)。

再作成は、サーバー名が変更された場合など、いくつかの理由で発生する可能性があります。DNS レコードが再作成された後に、その新しい ACL を調べます(図 32)。 図 32:DHCP サーバーの脆弱な ACL

新しい DNS レコードがドメインユーザーによって書き込みできる状態になったことがわかります。これは明らかに、この機能の意図されたふるまいとは異なります。サーバーによって作成された管理対象レコードは、変更された ACL を持つことを意図していますが、サーバー自身のクライアントレコードに影響を与えるべきではありません。

DHCP DNS 攻撃の緩和

DHCP DNS 動的更新には多くのリスクがあります。さまざまなサーバー構成を要約し、先ほど説明した攻撃を緩和する方法について説明します。

ここでは、DHCP サーバーによって作成された管理対象レコードと、Windows クライアントによって直接作成されたクライアントレコードの 2 種類のレコードを見ていきます。

概要は以下の通りです。

  • 必要がなければ、DHCP DNS 動的更新を無効にする

  • 権限の弱いユーザーを DNS 認証情報として設定すれば、クライアントレコードは安全

  • 管理対象レコードは、どのような構成でもスプーフィングから保護できないため、可能であれば、機密性の高い Windows 以外のホストには静的な DNS レコードを使用する

  • DNSUpdateProxy を使用せず、代わりにすべての DHCP サーバーで同じ DNS 認証情報を使用する

DNS 認証情報

これは、クライアントレコードに対する DHCP DNS 上書きを緩和する最良の方法です。この目的に限定して、強いパスワードを持つ権限の弱いユーザーを設定します。 DC で DHCP サーバーを実行する場合は、これが重要です。 この設定では、管理対象レコードの DHCP DNS 上書きが停止されることはありません。

名前保護

名前保護は理論的には管理対象レコードを保護するはずですが、実際には攻撃者はこれをいともたやすく回避します。とはいえ、簡単に上書きされないように、名前保護を有効にする必要があります。

名前保護はクライアントレコードを保護するためのものではありませんが、サーバー上のすべてのスコープで有効になっていれば、上書き攻撃は緩和されます。

Microsoft DHCP で名前保護を設定する場合、 方法は 2 つあります。サーバーレベルで適用する方法と、スコープレベルで適用する方法です。サーバーレベルで名前保護を有効にしているのであれば、サーバーレベルで名前保護が有効になっていると思うかもしれません。しかし、実際にはそうではありません。サーバーレベルで名前保護を有効にした場合、 新規 スコープのみが、有効に設定された状態で作成され、既存のスコープでは有効になりません。サーバーの各スコープのスコープレベルで、名前保護が有効になっているか確認することが重要です。

DNSUpdateProxy

このグループは使用すべきではありません。このグループのメンバーによって作成されたすべてのレコードが上書きされる可能性があるため、セキュリティ上のリスクになります。

複数の DHCP サーバーがあり、それらを連携させる場合は、代わりに DNS 認証情報を使用する必要があります。すべての DHCP サーバーに同じ DNS 認証情報を設定するだけで、サーバーが互いのレコードを編集できるようになります。

DNSUpdateProxy は、すぐにアップグレードする予定の Windows NT 4.0 以前のクライアントがある場合にのみ有用です。しかし、そのような旧式の製品があるとすれば、DNSUpdateProxy より大きい問題になります。

何らかの理由で DNSUpdateProxy を使用する必要がある場合は、グループメンバーごとに静的 DNS レコードを作成することをお勧めします。静的レコードは、それを作成したアカウントが所有することになるため、このアカウントは、各サーバーのマシンアカウントとは異なるものにする必要があります。そうすることで、サーバーによる安全でない権限を持つレコードの作成を防ぐことができます。

DHCP DNS スプーフィング

認証されていない攻撃者が存在しない DNS のレコードを作成することを防ぐことは、基本的には不可能です。唯一の対策として、すべての DHCP サーバーの DHCP DNS 動的更新を無効にする方法があります。一般的に、環境上、DHCP DNS 動的更新機能が必要ない場合は、これを無効にするとよいでしょう。そうすれば、ある程度のリスクが排除され、アタックサーフェスを小さくすることができます。

Invoke-DHCPCheckup を使用した設定ミスの検知

どの DHCP 設定に問題がありそうなのか混乱しないようにするため、 Invoke-DHCPCheckup という PowerShell ツールをリリースしています。このツールは、DHCP DNS 動的更新に関連するリスクを特定します(図 33)。

どの DHCP 設定に問題がありそうなのか混乱しないようにするため、Invoke-DHCPCheckup という PowerShell ツールをリリースしています。このツールは、DHCP DNS 動的更新に関連するリスクを特定します(図 33)。 図 33:Invoke-DHCPCheckup の出力例

このツールが検出する設定ミスは以下の通りです。

DNS 認証情報

  • DNS 認証情報が設定されていない

  • 設定された DNS 認証情報が権限の強いユーザーになっている

名前保護

  • スコープに対して名前保護が有効になっていない

  • 新しいスコープに対して、名前保護がデフォルトで有効になっていない

DNSUpdateProxy

  • グループメンバーを表示する 

  • メンバーが DHCP サーバーであるかどうかを示す

脆弱なレコード ACL

  • DHCP サーバーが所有するレコード(管理対象レコード)をリストする

  • 認証されたユーザーによって上書きされる可能性があるレコードをリストする

このツールは DHCP サーバー管理 API に依存しており、権限の強いユーザーが実行する必要があるため、このツールは主にブルーチームが使用することを想定しています。 

まとめ

私たちは、すべての調査結果を Microsoft に報告しましたが、Microsoft は、上記のすべての問題が仕様上の問題であるか、または修正すべき問題として受け取るほど深刻なものでないと回答してきました。

しかし、当社としては同意しかねます。私たちが警鐘を鳴らした攻撃の影響は非常に大きいものです。攻撃者は、まったく認証されていない状態で DNS レコードを上書きできるため、ドメイン内のホストに対して中間者としてのポジションを獲得できることになります。その結果、機密情報や認証情報が簡単に漏れ出し、リレー攻撃が可能になるため、攻撃者が AD ドメインに侵入したり、権限を昇格させたりする恐れがあります。今回の記事で紹介した統計情報は、多くのデータセンター・ネットワークに対する脅威がいかに強固なものであるかを表しています。

このような問題は修正される目途が立っていないため、防御を担当される方には、私たちが発見した危険な設定ミスを見つけるために、Invoke-DHCPCheckup を使用して環境をスキャンすることを強くお勧めします。ネタばれ注意 - デフォルトの設定を変更していなければ、あなたの環境は脆弱です。

今後の情報提供

今後のブログに投稿する予定の記事は DDSpoof (DHCP DNS スプーフィング)です。これは、今回の記事で説明したすべての攻撃を実装するツールです。認証されていない攻撃者が、どのように DHCP サーバーから必要なデータを収集し、脆弱な DNS レコードを特定して上書きし、そこで得た能力を駆使して AD ドメインを侵害するのかについて説明します。



Ori David

執筆者

Ori David

December 07, 2023

Ori David

執筆者

Ori David

Ori David is a Security Researcher at Akamai. His research is focused on offensive security, malware analysis, and threat hunting.