DFSCoerce NTLM Relay Attack to Domain Admin

Write by mane, 請勿轉載

0x0 介紹

近年來 AD 經常被大佬們搞,在今年 5 月份微軟修復的漏洞中,其中最離譜的是 ADCS,CVE-2022-26923,只需要修改 SPN 就可以拿到 Domain Admin 的權限。在這個星期内又爆出了一個針對 RPC 攻擊的工具,DFSCoerce

現在已經有很多針對 RPC 攻擊的工具,這些工具通常都是做 NTLM Relay 攻擊,NTLM 攻擊可大可小,通常都是視環境而定,有一些工具無需密碼就拿下 Domain Admin。

0x1 DFSCoerce 原理

根據文檔,它使用了 NetrDfsRemoveStdRootNetrDfsAddStdRoot 的 RPC 接口 MS-DFSNM 來主動請求第三方服務器,這樣可以把第三方服務器設定爲攻擊機,就可以拿到這臺機器的 NTLM,從而做些壞事,RPC 接口具體參考這裏

0x2 準備環境 && 要求

隔壁借張圖,具體原理看上面的圖)

有三臺機器

  • 第一個是 AD(我的環境叫 DC:192.168.182.139),做 Domain Controller 。

  • 第二個是 CA 機(我的環境叫 MANECA:192.168.182.140),裏面跑 ADCS 服務,join 了上面 AD 的 domain。

  • 第三個是 Kali:192.168.182.132。

設定的環境比較苛刻:

  • 由於這個工具使用了 NetrDfsRemoveStdRootNetrDfsAddStdRoot,所以要在 DC 上安裝 Distributed File System (DFS): Namespace Management.

  • DC 和 ADCS 要分開兩臺機器,如果把服務都集成在 DC 裏面會攻擊失敗,kali 做中間人攻擊。

  • ADCS 服務器上要跑醜陋的證書注冊網頁,比如:http://CA/certsrv/,只能是 HTTP,而且沒有啓用 NTLM 中继保护。

  • 如果啓用了 smart card 或者 winrm 的 https 版就可以直接省去後面 Add computer 的動作,懶的話直接用 Certipy 獲取 NT hash。

  • 一個在 DC 裏面的低權限的賬號。

備注: 我用的 AD 和 ADCS 都是 Windows Server 2019,3 月份的補丁檔。

神奇的檔案名:en_windows_server_2019_updated_march_2019_x64_dvd_2ae967ab.iso

0x3 在 DC 上安裝 Distributed File System

0x4 在 CA 機上安裝 ADCS

  1. 首先先跟著這篇文章設置,下面的 Login in a normal user 開始不需要理會。

  2. 上面設置好了只需要設置這篇文章配置证书模板,其他的請不要設置,包括下面的激活證書服務

如果遇到灰色的,請換 Enterprise AdminsDomain Admins 的用戶去登錄,不要使用 local admin。

0x5 檢查 CA 機上的配置

用 IE 打開 http://127.0.0.1/certsrv,如果彈出驗證,就説明配置成功了:

或者檢查一下 IIS 有沒有這個文件夾出現:

0x6 在 DC 上創建低權限的賬號

0x7 使用 DFSCoerce 看看 RPC 是否工作

Responder 的結果:

可以看到這個 RPC 是工作的,請求的也是這臺機器的機器賬戶,這個時候就可以使用 NTLMv2 進行 Relay Attack。

0x8 中繼證書

設置監聽器,把收到的 NTLM 馬上轉到 CA 上獲取證書,獲取的證書是 DomainController 證書:

再一次使用 DFSCoerce 攻擊,就獲得了 base64 的證書。

0x9 還原成 pfx 文件

我把上面的 base64 保存到 cert.pfxb64,然後通過 base64 解碼獲得 cert.pfx 文件:

這個時候如果做 pass the cert 的話,如果對面的機器沒有開啓 smart card 服務或者 HTTPS 版本的 Winrm(5986/TCP) 就沒有辦法直接做 pass the cert,smart card 要通過 GPO 去配置 gettgtpkinit.py 才可以使用,不然就會顯示:

具體原理我也很迷茫,但這個時候有人想到了利用 cert 去攻擊 LDAP,然後獲得最高權限,看這篇文章

如果開啓了 https 的 winrm 就可以使用 path the cert,把一個 pfx 分成私鑰和公鑰在使用 evil-winrm 去連接就可以了。

0xa 其實不用這麽麻煩,用 certipy 就可以獲得 NT hash 了

懷疑是 gettgtpkinit.py 的脚本問題,於是換了 certipy 去請求 hash,結果神奇的可以了。

經典的 secretsdump:

然後使用 Domain Admin 進行 Pass the hash:

收工!

如何緩解攻擊

微軟終於坐不住了,於是發了這篇文章叫你們好好的使用 HTTPS:

參考

GitHub - Wh04m1001/DFSCoerce

KB5005413: Mitigating NTLM Relay Attacks on Active Directory Certificate Services (AD CS)

使用 PetitPotam 到 NTLM 中继到域管理员 | 九世的博客

[MS-DFSNM]: Distributed File System (DFS): Namespace Management Protocol | Microsoft Docs

Protect Your Windows Network from the PetitPotam Exploit - Ravenswood Technology Group

GitHub - ly4k/Certipy: Tool for Active Directory Certificate Services enumeration and abuse

Authenticating with certificates when PKINIT is not supported

大佬們的推特:

@wdormann

@filip_dragovic

Comments