0x00 前言遠程執行Exchange Powershell命令可以通過Powershell建立powershell session 實現。而在滲透測試中,我們需要盡可能避免使用Powershell,而是通過程序去實現。本文將要介紹通過Python實現遠程執行Exchange Powershell命令的細節,分享使用Python實現TabShell利用的心得。
0x01 簡介本文件將介紹以下內容:
執行Exchange Powershell 命令的實際方法
開發細節
TabShell利用細節
0x02 執行Exchange Powershell 命令的實際方法1.使用Powershell連接Exchange服務器,執行Exchange Powershell命令命令示例:
需要注意以下問題:
需要域內主機上執行
需要fqdn,不支持IP
連接url可以選擇http或者https
認證方式可以選擇Basic或者Kerberos
2.使用Python連接Exchange服務器,執行Exchange Powershell命令這裡需要使用pypsrp
命令示例:
0x03 開發細節這裡需要了解具體的通信格式,我採用的方法是使用pypsrp,打開調試信息,查看具體發送的數據格式
1.啟動調試信息將調試信息寫到文件,代碼如下:
2.增加調試輸出內容修改文件pypsrp/wsman.py,在def send(self, message: bytes)中添加調試輸出信息
具體代號位置:
https://github.com/jborean93/pypsrp/blob/master/src/pypsrp/wsman.py#L834,添加代碼:
https://github.com/jborean93/pypsrp/blob/master/src/pypsrp/wsman.py#L841,添加代碼:
輸出結果顯示如下圖
3.數據包數據結構可參考之前的文章《渗透技巧——远程访问Exchange Powershell》
經過對比分析,在編寫程序上還需要注意以下細節:
(1)Kerberos認證的實際情況
示例代碼:
(2)通信數據格式
類型為POST
header需要包裹:'Accept-Encoding': 'identity'
(3)認證流程
需要先進行Kerberos認證,返回長度為0
再次發送數據,進行通信,返回正常內容
(4)數據編碼
發送和接收的數據平均做了編碼
發送過程序的代碼顯示示例代碼:
注:
hostname必須為小寫字符
接收過程序的解碼示例代碼:
完整展示示例代碼如下:
完整代碼的輸出結果如下圖
0x04 TabShell利用細節TabShell的公開POC使用Powershell連接取接Exchange服務器,執行特殊構造的Exchange Powershell命令接觸,為便於分析中間的通信數據,可以採用以下方法擦拭中間:
1.通過Flask構建本地代理服務器方法可參考之前的文章《ProxyShell利用分析3——添加用户和文件写入》
2.通過Flask實現SSRFSSRF漏洞可選擇CVE-2022-41040或CVE-2022-41080
3.在Flask中輸出中間的通信數據關鍵字代碼示例:
根據通信數據,我們可以很容易地寫出TabShell的Python現代代碼,完整代碼的輸出結果如下圖
0x05 小結本文件介紹了通過Python 實現遠程執行Exchange Powershell 命令的細節,分享使用Python 實現TabShell 使用的心得。
Recommended Comments