Python msfrpc работает с python2, выдает ошибку аутентификации с python 3 - PullRequest
0 голосов
/ 28 мая 2018

Я пишу веб-приложение, используя python flask и python3, и хотел бы использовать API Metasploit.При написании кода с python2 все работает как надо (как библиотека была написана для 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'

Единственное различие в файле msfrpc.py между версиями python2 и python 3 заключается в том, что версия py2 включает в себя "httplib »и использует« httplib.HTTPSConnection »для подключения к службе msgrpc, а версия py3 включает« http.client »и использует« http.client.HTTPConnection »для подключения к службе.

Кто-нибудь знает, почему эта ошибка происходит?

Вот исходный код для msfrpc.py: импорт msgpack импорт 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")

1 Ответ

0 голосов
/ 23 августа 2019

Я не уверен, стоит ли мне возвращать этот вопрос из мертвых, но у меня был тот же вопрос немного назад, и я выяснил проблему / решение, поэтому я опубликую его здесь:

Python msfrpc работает с python2, выдает ошибку аутентификации с python 3

Проблема заключалась в том, что msfrpc изначально был написан на Python 2, и поэтому префикс «b» в ответах RPC msgpack отхост Metasploit был проигнорирован, но в Python 3 требуется указывать, что литерал должен становиться байтовым литералом вместо строкового типа Unicode.

Для получения дополнительной информации, вот ссылка на пост, который помог мне понятьэто вышло: https://timothybramlett.com/Strings_Bytes_and_Unicode_in_Python_2_and_3.html

Исправленный код, который я разместил в приведенной выше ссылке, работает нормально (вам просто нужно поставить «b» перед строками, возвращаемыми с сервера, чтобы сообщить Python, что 0 и 1в ответах есть биты / байты, а не кодовые точки Unicode), но на самом деле лучшим решением является использование модуля msfrpc, написанного Дэном Макинерни, который вдля «указания байтов» вместо «http.client» используется пакет «запросов».

https://github.com/DanMcInerney/msfrpc

...