Python3下msfrpc调用Metasploit API出现认证失败问题求助
解决Python3下MsfRPC认证失败的问题
我帮你排查了一下,你遇到的这个MsfAuthError认证失败问题,根源出在你提供的Python3版本msfrpc.py代码里的两个关键问题:
问题1:SSL连接逻辑错误
先看你代码里的__init__方法:
if self.ssl: self.client = http.client.HTTPConnection(self.host,self.port) else: self.client = http.client.HTTPConnection(self.host,self.port)
这明显是个笔误!Python2版本里当ssl为True时用的是httplib.HTTPSConnection,但Python3版本里不管是否启用SSL,都创建了普通的HTTPConnection。
如果你的MsfRPC服务是通过SSL启动的(比如启动msfrpcd时加了-S参数),那么用普通HTTP连接去连HTTPS服务,会导致请求完全无法被服务端正确解析,自然返回认证失败。
问题2:Msgpack的Python3兼容性问题
Python2和Python3对字符串/字节的处理差异很大,你的encode和decode方法没有考虑这种差异:
- 在Python3中,
msgpack.packb默认不会把字符串按二进制类型打包,可能导致服务端无法正确解析请求参数 - 旧版本的
msgpack.unpackb在Python3下会把字节串返回成bytes类型,而不是字符串,也可能引发解析错误
修复方案
1. 修正SSL连接逻辑
把__init__里的连接创建代码改成:
if self.ssl: self.client = http.client.HTTPSConnection(self.host, self.port) else: self.client = http.client.HTTPConnection(self.host, self.port)
这样当启用SSL时,就会创建正确的HTTPS连接。
2. 兼容Msgpack的Python3处理
修改encode和decode方法:
def encode(self, data): # 强制按二进制类型打包,兼容Python3字符串 return msgpack.packb(data, use_bin_type=True) def decode(self, data): # 自动把字节串解码为Python3字符串 return msgpack.unpackb(data, raw=False)
验证步骤
- 确认你的
msfrpcd启动参数:如果用了-S,那么初始化Msfrpc时必须传ssl=True - 安装最新版的msgpack:
pip install --upgrade msgpack-python(或msgpack,根据你使用的包名调整) - 重新运行你的代码,应该就能正常完成认证了
内容的提问来源于stack exchange,提问作者juddev
相关产品推荐
相关产品推荐

