0x00 前言Exchange Powershell基於PowerShell Remoting,通常需要在域內主機上訪問Exchange Server的80端口,限制較多。本文介紹一種不依賴域內主機發起連接的實現方法,增加適用範圍。
注:
該方法在CVE-2022–41040中被修復,修復位置:C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.HttpProxy.Common.dll中的RemoveExplicitLogonFromUrlAbsoluteUri(string absoluteUri, string explicitLogonAddress),如下圖
0x01 簡介本文將要介紹以下內容:
實現思路
實現細節
0x02 實現思路常規用法下,使用Exchange Powershell需要注意以下問題:
所有域用戶都可以連接Exchange PowerShell
需要在域內主機上發起連接
連接地址需要使用FQDN,不支持IP
常規用法無法在域外發起連接,而我們知道,通過ProxyShell可以從域外發起連接,利用SSRF執行Exchange Powershell
更進一步,在打了ProxyShell的補丁後,支持NTLM認證的SSRF沒有取消,我們可以通過NTLM認證再次訪問Exchange Powershell
0x03 實現細節在代碼實現上,我們可以加入NTLM認證傳入憑據,示例代碼:
在執行Exchange Powershell命令時,我們可以選擇pypsrp或者Flask,具體細節可參考之前的文章《ProxyShell利用分析2——CVE-2021-34523》 和《ProxyShell利用分析3——添加用户和文件写入》
pypsrp或者Flask都是通過建立一個web代理,過濾修改通信數據實現命令執行
為了增加代碼的適用範圍,這裡選擇另外一種實現方法:模擬Exchange Powershell的正常通信數據,實現命令執行
可供參考的代碼:https://gist.github.com/rskvp93/4e353e709c340cb18185f82dbec30e58
代碼使用了Python2,實現了ProxyShell的利用
基於這個代碼,改寫成支持Python3,功能為通過NTLM認證訪問Exchange Powershell執行命令,具體需要注意的細節如下:
1.Python2和Python3在格式化字符存在差異(1)
Python2下可用的代碼:
以上代碼在Python3下使用時,需要將Str轉為bytes,並且為了避免不可見字符解析的問題,代碼結構做了重新設計,Python3可用的代碼:
(2)
Python2下可用的代碼:
以上代碼在Python3下使用時,需要將Str轉為bytes,Python3可用的示例代碼:
(3)
Python2下可用的代碼:
以上代碼在Python3下使用時,需要將Str轉為bytes,為了避免不可見字符解析的問題,這裡不能使用.decode('utf-8'),改為使用.decode('ISO-8859-1')
Python3可用的示例代碼:
2.支持Exchange Powershell命令的XML文件格式XML文件格式示例1:
對應執行的命令為:Get-RoleGroupMember 'Organization Management'
XML文件格式示例2:
對應執行的命令為:Get-Mailbox -Identity administrator
通過格式分析,可得出以下結論:
(1)屬性Cmd對應命令名稱例如:
(2)傳入的命令參數需要注意格式如果只傳入1個參數,對應的格式為:
如果傳入2個參數,對應的格式為:
如果傳入4個參數,對應的格式為:
為此,我們可以使用以下代碼實現參數填充:
構造XML文件格式的實現代碼:
結合以上細節後,我們可以得出最終的實現代碼,代碼執行結果如下圖
0x04 小結本文介紹了遠程訪問Exchange Powershell的實現方法,優點是不依賴於域內主機上發起連接,該方法在CVE-2022–41040中被修復。
Recommended Comments