Py学习  »  Python

【技术原创】渗透技巧——Exchange Powershell的Python实现

嘶吼专业版 • 10 月前 • 163 次点击  

       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实现SSRF

SSRF漏洞可选择CVE-2022-41040或CVE-2022-41080

3.在Flask中输出中间的通信数据

关键字代码示例:

根据通信数据,我们可以很容易地写出TabShell的Python现代代码,完整代码的输出结果如下图

       0x05 小结

本文件介绍了通过 Python 实现远程执行 Exchange Powershell 命令的细节,分享使用 Python 实现 TabShell 使用的心得。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/155128
 
163 次点击