
Beacon Object File (BOF)によるdnscmd.exe機能の実装。MS-DNSPを利用してServerLevelPluginDllのエッジを悪用し、ADIDNSサーバー上でリモートコード実行を取得するために使用されます。
dnscmd.exe の機能をBeacon Object File (BOF)として実装したもので、MS-DNSP1を利用してServerLevelPluginDllエッジ2 3 4を悪用し、ADIDNSサーバー上でリモートコード実行を取得するために使用されます。悪用にはDnsAdminsグループのメンバーであるユーザーアカウントへのアクセスが必要です。
[!NOTE] BOFはC例外をネイティブにサポートしていないため、この拡張機能は
RtlRaiseExceptionメソッドにフックし、RPC呼び出し中に制御フローをBOFに戻します。この方法はハッキーですが、MicrosoftのRPC実装が制御フローにRpcTryExceptを多用しているため必要です。テスト環境では問題なく動作しましたが、この手法はビーコンの不安定性を引き起こす可能性があることに注意してください。
プロジェクトをコンパイルするには、MinGWがインストールされたシステムでmakeを使用するか:
make
あるいは、WindowsでVisual Studioのx64 Native Tools Command Promptを使用している場合は.\build.batを使用します:
.\build.bat
どちらのコンパイル手順でも、ラボ環境でBOF機能を試すための.oファイルと.exeファイルの両方が生成されます。
ADIDNSサーバーと対話するために以下のBOFが作成されています:
dnsrpc_probe - ADIDNSサーバーが稼働しているか確認しますdnsrpc_info - 現在のADIDNSサーバー設定を取得しますdnsrpc_coerce_write - ADIDNSサーバーにネットワーク共有へのファイル書き込みを強制し、dnsrpc_set_plugin_dllプラグインでサーバーを破壊する前にDCが指定のネットワーク共有に到達できるかテストするユーティリティですdnsrpc_set_plugin_dll - サーバー再起動時に読み込むDLLを設定しますdnsrpc_restart_server - ADIDNSサーバーに再起動を発行しますdnsrpc_cleanup - dnsrpc_coerce_writeおよびdnsrpc_set_plugin_dllコマンドによって残されたレジストリアーティファクトをクリーンアップします。ドメインコントローラー自体で実行する必要があります。これに加えて、dnssrv_plugin.cにサンプルのペイロードが提供されています。
[!WARNING] 何らかの理由でDCが
dnsrpc_set_pugin_dllで指定したDLLペイロードに到達できない場合、DCは再起動を拒否し、ドメイン全体を機能不全にする可能性があります。誤ってターゲットを破壊する前に、dnsrpc_coerce_writeを使用してDCが実際に共有に接続できるかテストすることを検討してください。DNSがダウンすると人々は怒る傾向があります。さらに、
dnsrpc_restart_serverは2分間のDNSダウンタイムを引き起こします。BOFを複数回呼び出すとタイムアウトが毎回増加するため、控えめに使用してください。
開発環境でBOFをテストするには、TrustedSecのCOFFLoaderのようなツールを使用できます。これはWindowsで以下のようにコンパイルできます:
cl.exe /W4 /DCOFF_STANDALONE /DDEBUG beacon_compatibility.c COFFLoader.c /Fe:COFFLoader.exe /link advapi32.lib
次にBOF(例: dnsrpc_info BOF)を実行するには、引数を生成してCOFFLoaderに渡します:
> python beacon_generate.py
Beacon Argument Generator
Beacon>addWString DC01
Beacon>generate
b'0e0000000a00000044004300300031000000'
Beacon> exit
> cl.exe /c /GS- dnsrpc_info.c /Fo:dist\dnsrpc_info.o
> COFFLoader.exe go dist\dnsrpc_info.o 0e0000000a00000044004300300031000000
...
$SG77912
: Section: 3, Value: 0xA08
$SG77914H
: Section: 3, Value: 0xA48
$SG77915X
: Section: 3, Value: 0xA58
.chks64: Section: 11, Value: 0x0
X: Section: 0, Value: 0x0
Back
Returning
Ran/parsed the coff
Outdata Below:
server name: DC01.research.lan
server version: 4F7C000A (10.0 build 20348)
rpc structure version: 2 (longhorn)
directory services available: yes
admin configured: yes
allow update: yes
is read-only domain controller: no
boot method: 3 (registry)
no recursion: no
round robin: yes
secure responses: yes
forward timeout: 3
recursion retry: 3
recursion timeout: 8
max cache ttl: 86400
directory services polling interval: 180
scavenging interval: 0
log level: 0x00000000
directory services container: cn=MicrosoftDNS,cn=System,DC=research,DC=lan
domain name: research.lan
forest name: research.lan
log file path: (none)
server addresses: fe80:0000:0000:0000:4cbe:0281:82dd:76ed, 172.16.50.107
listen addresses: (none)
forwarders: 8.8.8.8, 1.1.1.1
IDL定義を再コンパイルするには、以下のコマンドを使用できます:
midl /W1 /char signed /env x64 /target NT100 /Oicf dnsrpc.idl
開発中、_DEBUGフラグは最終バイナリにwmainを追加し、_VERBOSEフラグは追加のデバッグログを含めるために使用されます。詳細については、build.batおよびMakefileを参照してください。
このプロジェクトはMITライセンスの下でライセンスされています - 詳細についてはLICENSEファイルを参照してください。このツールの使用によって生じる誤用や損害について、私は一切の責任を負いません。明示的な許可がある環境でのみ使用してください。
https://raw.githubusercontent.com/paradoxis/dnsrpc-bof/HEAD/%3Chttps:/learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/9500a7e8-165d-4b13-be86-0ddc43100eef%3E ↩
https://raw.githubusercontent.com/paradoxis/dnsrpc-bof/HEAD/%3Chttps:/medium.com/@esnesenon/feature-not-bug-dnsadmin-to-dc-compromise-in-one-line-a0f779b8dc83%3E ↩
https://raw.githubusercontent.com/paradoxis/dnsrpc-bof/HEAD/%3Chttps:/www.semperis.com/blog/dnsadmins-revisited/%3E ↩
https://raw.githubusercontent.com/paradoxis/dnsrpc-bof/HEAD/%3Chttps:/www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/from-dnsadmins-to-system-to-domain-compromise%3E ↩