【技术原创】pypsrp在Exchange Powershell下的优化
2023-2-21 12:4:59 Author: 嘶吼专业版(查看原文) 阅读量:29 收藏

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执行命令返回完整输出结果的解决方法。


文章来源: http://mp.weixin.qq.com/s?__biz=MzI0MDY1MDU4MQ==&mid=2247557838&idx=1&sn=2e92152a3cca7c3bbb112bafcd07ebe4&chksm=e91432f4de63bbe2afcdb2db164431b30147443ee78123a20ba9fa3987e6f269d15fada963d0#rd
如有侵权请联系:admin#unsafe.sh