pypsrp是用于PowerShell远程协议(PSRP)服务的Python客户端。我在研究过程中,发现在Exchange Powershell下存在一些输出的问题,本文将要介绍研究过程,给出解决方法。
Exchange PowerShell Remoting
pypsrp的使用
pypsrp存在的输出问题
解决方法
参考资料:
https://docs.microsoft.com/en-us/powershell/module/exchange/?view=exchange-ps
默认设置下,需要注意以下问题:
所有域用户都可以连接Exchange PowerShell
需要在域内主机上发起连接
连接地址需要使用FQDN,不支持IP
通过Powershell连接Exchange PowerShell的命令示例:
通过pypsrp连接Exchange PowerShell的命令示例:
如果想要加入调试信息,可以添加以下代码:
我们在Exchange PowerShell下执行命令的完整返回结果如下图
但是通过pypsrp连接Exchange PowerShell执行命令时,输出结果不完整,无法获得命令的完整信息,如下图
1.定位问题
通过查看源码,定位到代码位置:https://github.com/jborean93/pypsrp/blob/704f6cc49c8334f71b12ce10673964f037656782/src/pypsrp/messages.py#L207
我们可以在这里添加输出message_data的代码,代码示例:
返回结果:
在调用serializer.deserialize(message_data)提取输出结果时,这里只提取到了一组数据,忽略了完整的结果
经过简单的分析,发现标签内包含完整的输出结果,所以这里可先通过字符串截取提取出标签内的数据,示例代码:
进一步分析提取出来的数据,发现每个标签分别对应一项属性,为了提高效率,这里使用xml.dom.minidom解析成xml格式并提取元素,示例代码:
经测试,以上代码能够输出完整的结果
按照pypsrp的代码格式,得出优化pypsrp输出结果的代码:
使用修改过的pypsrp连接Exchange PowerShell执行命令时,能够返回完整的输出结果,如下图
经测试,在测试ProxyShell的过程中,使用修改过的pypsrp也能得到完整的输出结果
补充:
如果使用原始版本pypsrp测试ProxyShell,可通过解析代理的返回结果实现,其中需要注意的是在作Base64解密时,由于存在不可见字符,无法使用.decode('utf-8')解码,可以换用.decode('ISO-8859-1'),还需要考虑数据被分段的问题,实现的示例代码如下:
本文介绍了通过pypsrp连接Exchange PowerShell执行命令返回完整输出结果的解决方法。