1

我正在使用 python flask 和 python3 编写一个 web 应用程序,并且想使用 metasploit API。使用 python2 编写代码时,一切正常(因为 lib 是为 python2 编写的)。但是,当尝试在 python 3 中使用它时,我得到了这个错误:

File "/usr/local/lib/python3.6/dist-packages/msfrpc.py", line 64, in login
    raise self.MsfAuthError("MsfRPC: Authentication failed")
msfrpc.MsfAuthError: 'MsfRPC: Authentication failed'

python2和python 3版本的msfrpc.py文件唯一的区别是py2版本包含“httplib”并使用“httplib.HTTPSConnection”连接msgrpc服务,而py3版本包含“http.client”和使用“http.client.HTTPConnection”连接到服务。

有谁知道为什么会发生这个错误?

这里是 msfrpc.py 的源代码: import msgpack import http.client

class Msfrpc:
  class MsfError(Exception):
    def __init__(self,msg):
      self.msg = msg
    def __str__(self):
      return repr(self.msg)

  class MsfAuthError(MsfError):
    def __init__(self,msg):
      self.msg = msg

  def __init__(self,opts=[]):
    self.host = opts.get('host') or "127.0.0.1"
    self.port = opts.get('port') or 55552
    self.uri = opts.get('uri') or "/api/"
    self.ssl = opts.get('ssl') or False
    self.authenticated = False
    self.token = False
    self.headers = {"Content-type" : "binary/message-pack" }
    if self.ssl:
      self.client = http.client.HTTPConnection(self.host,self.port)
    else:
      self.client = http.client.HTTPConnection(self.host,self.port)

  def encode(self,data):
    return msgpack.packb(data)
  def decode(self,data):
    return msgpack.unpackb(data)

  def call(self,meth,opts = []):
    if meth != "auth.login":
      if not self.authenticated:
        raise self.MsfAuthError("MsfRPC: Not Authenticated")

    if meth != "auth.login":
      opts.insert(0,self.token)

    opts.insert(0,meth)
    params = self.encode(opts)
    self.client.request("POST",self.uri,params,self.headers)
    resp = self.client.getresponse()
    return self.decode(resp.read()) 

  def login(self,user,password):
    ret = self.call('auth.login',[user,password])
    if ret.get('result') == 'success':
        self.authenticated = True
        self.token = ret.get('token')
        return True
    else:
        raise self.MsfAuthError("MsfRPC: Authentication failed")
4

1 回答 1

0

我不确定我是否应该把这个问题从死里复活,但我之前也有同样的问题,我想出了问题/解决方案,所以我会在这里发布:

Python msfrpc 与 python2 一起使用,使用 python 3 引发身份验证错误

问题是 msfrpc 最初是用 Python 2 编写的,因此来自 Metasploit 主机的 msgpack RPC 响应中的前缀“b”被忽略了,但在 Python 3 中需要指示该文字应该成为字节文字而不是Unicode 字符串类型。

有关更多信息,这是一个帮助我弄清楚的帖子的链接: https ://timothybramlett.com/Strings_Bytes_and_Unicode_in_Python_2_and_3.html

我在上面的链接中发布的更正代码可以正常工作(您只需在从服务器返回的字符串前面放一个“b”,告诉 Python 响应中的 0 和 1 是位/字节而不是 Unicode 代码点),但真正更好的解决方案是使用 Dan McInerney 编写的 msfrpc 模块,它除了“指示字节”之外,而不是“http.client”使用“请求”包。

https://github.com/DanMcInerney/msfrpc

于 2019-08-22T21:15:09.110 回答