2017-09-04 5 views
0

Ich versuche, einen einfachen Telnet-Server, der die Benutzernamen/Passwort-Paare von den Bots da draußen protokolliert, die brute zwingen schwachen Telnet-Anmeldeinformationen (Mirai, Gafgyt , etc.). Ich versuche, Twisted für diesen Zweck zu verwenden, da es scheint, die modernste Technologie für solche Zwecke zu sein.Telenet-Server in Twisted bekommt "Unhandled Fehler in Deferred" Fehler

Das ist, was ich bisher gemacht habe:

#!/usr/bin/env python 

from twisted.conch.telnet import TelnetTransport, TelnetProtocol, ECHO 
from twisted.internet.protocol import ServerFactory 
from twisted.application.internet import TCPServer 
from twisted.application.service import Application 
from twisted.internet import reactor 

import logging 

class TelnetEcho(TelnetProtocol): 

    ip = '' 
    user = '' 
    state = '' 
    line = '' 

    def connectionMade(self): 
     self.ip = self.transport.getPeer().host 
     self.transport.write('Username: ') 
     self.transport.will(ECHO) 
     self.state = 'User' 

    def dataReceived(self, data): 
     if self.state != 'Password': 
      self.transport.write(data) 
     self.line += data 
     if data == '\n': 
      self.processLine() 
      self.line = '' 
     return 

    def processLine(self): 
     if self.state == 'User': 
      self.user = self.line.strip() 
      self.transport.write('Password: ') 
      self.state = 'Password' 
     elif self.state == 'Password': 
      print 'IP: ' + self.ip + ', user:' + self.user + ', pass:' + self.line.strip() 
      logging.info(self.ip + ',' + self.user + ',' + self.line.strip()) 
      self.transport.write('\r\nIncorrect password or username.\r\n') 
      self.transport.write('Username: ') 
      self.state = 'User' 

def CreateMyFactory(): 
    factory = ServerFactory() 
    factory.protocol = lambda: TelnetTransport(TelnetEcho) 
    return factory 

if __name__ == "__main__": 
    logging.basicConfig(filename='telnet.log', format='%(message)s', level=logging.DEBUG) 
    logging.info('Tmestamp,IP,Username,Password') 
    for handler in logging.root.handlers[:]: 
     logging.root.removeHandler(handler) 
    logging.basicConfig(filename='telnet.log', format='%(asctime)s,%(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.DEBUG) 
    MyFactory = CreateMyFactory() 
    reactor.listenTCP(23, MyFactory) 
    reactor.run() 

Und es funktioniert meistens gut - ich meine, Bots versuchen einzuloggen und es meldet sich die Anmeldeinformationen verwenden sie - aber ich halte Unhandled error in Deferred Fehler bekommen, die verlassen Ich bin völlig verwirrt. Ich benutze keine Deferreds, zumindest nicht absichtlich. Was verursacht die Fehler und wie kann das Problem behoben werden?

Interessanterweise erscheint der Fehler nicht, wenn ich manuell auf den Server telnet und versuche, einen Benutzernamen/ein Passwort selbst einzugeben; Sie erscheinen nur, wenn die Bots versuchen, sich anzumelden. Ich schätze, die Bots versuchen etwas zu tun, was mein Server nicht berücksichtigt, aber ich kann nicht herausfinden, was ich tun soll.


Edit:

ich das Skript geändert haben den Twisted-Logger anstelle des Python-Logger zu verwenden. Jetzt bekomme ich ein paar zusätzliche Informationen im Log. Zuerst erhalte ich die folgende Warnung:

2017-09-06 16:17:01+0300 [-] Warning: primary log target selected twice at <c:\python\lib\site-packages\twisted\application\app.py:212> - previously selected at <c:\python\lib\site-packages\twisted\python\log.py:214>. Remove one of the calls to beginLoggingTo. 

Ich nehme an, das ist ein Fehler in Twisted.

Wenn als nächstes die „Nicht behandelte Fehler in Latente“ Fehler auftritt, ich diese bekomme ich das Protokoll:

2017-09-06 16:33:33+0300 [-] Unhandled error in Deferred: 
2017-09-06 16:33:33+0300 [-] Unhandled Error 
    Traceback (most recent call last): 
    Failure: twisted.conch.telnet.OptionRefused: twisted.conch.telnet.OptionRefused:'\x01' 

Irgendwelche Ideen, wie es zu beheben?

+0

Bitte fügen Sie den vollständigen, genauen Fehler in Ihre Frage (Kopieren/Einfügen). –

+0

Uhm, aber ich tat es. Die genaue Fehlermeldung lautet "Unhandled error in Deferred:", die auf der Konsole gedruckt wird. Offensichtlich kein kritischer Fehler, weil das Skript nicht bricht und es gibt kein Backtrace, aber es ist _some_ Art von Fehler oder Warnung, weil es nicht mein Skript ist, das es anzeigt. – bontchev

+0

Wenn das alles ist, dann denke ich, dass Sie eine Version von Twisted verwenden, die diesen Logging-Fehler hat: . Wenn das der Fall ist, gibt es nützliche Details über den Fehler, die stillschweigend gelöscht werden.Es würde helfen, sie zu sehen - vielleicht durch Ändern der Protokollierungskonfiguration, um das Problem zu vermeiden, durch Herunterstufen auf eine ausreichend alte Version von Twisted oder durch Beheben des Fehlers und anschließendes Aktualisieren. –

Antwort

0

Hier ist die Nutzung von Deferred:

self.transport.will(ECHO) 

Hier sind die API-Dokumentation für will:

def will(option): 
    """ 
    Indicate our willingness to begin performing this option locally. 

    Returns a Deferred that fires with True when the peer agrees to allow us 
    to begin performing this option, or fails with L{OptionRefused} if the 
    peer refuses to allow us to begin performing it. If the option is 
    already enabled locally, the Deferred will fail with L{AlreadyEnabled}. 
    If negotiation regarding this option is already in progress, the 
    Deferred will fail with L{AlreadyNegotiating}. 

    Note: It is currently possible that this Deferred will never fire, 
    if the peer never responds, or if the peer believes the option to 
    already be enabled. 
    """ 

In Ihrem Fall die Peer weigert Ihr Angebot mit dem ECHO Funktion auszuführen. Wenn Sie den Bericht dieser Weigerung zu unterdrücken wollen, fügen Sie eine errback, dass Ausnahmetyp zu schlucken:

d = self.transport.will(ECHO) 
    d.addErrback(lambda reason: reason.trap(OptionRefused)) 

Beachten Sie auch, dass Sie tatsächlich in der App alle Echo-Logik nicht haben, so dass Sie, dass hinzufügen möchten, wenn du wirst anbieten, das Echo zu tun. Und Sie möchten vielleicht die ECHO-Verhandlung um die Password Eingabeaufforderung statt der Username Eingabeaufforderung tun. Der Punkt der will/wont ECHO-Verhandlung ist typischerweise, das Echo des Passworts zu unterdrücken.

+0

OK, ich habe die von Ihnen vorgeschlagenen Änderungen vorgenommen, aber ich erhalte immer noch diesen Fehler. Das Protokoll enthält jetzt "Fehler: twisted.internet.error.ConnectionLost: Die Verbindung zur anderen Seite wurde auf nicht saubere Weise verloren: Verbindung verloren." Und "Fehler: twisted.conch.telnet.AlreadyDisabled: twisted.conch.telnet. AlreadyDisabled: '\ x01''. Wie kann ich mehr als einen Fehler abfangen? Listen sie in einer durch Komma getrennten Liste oder etwas auf? – bontchev

+0

https://twistedmatrix.com/documents/17.5.0/api/twisted.python.failure.Failure.html#trap –

+0

Danke. Ich musste der Liste ein paar weitere hinzufügen ('AlreadyNegotiating' und' ConnectionDone'), schaffte es aber schließlich, die Fehlermeldung zu unterdrücken. – bontchev

Verwandte Themen