reversa que python tcp twisted p2p

python - reversa - reverse shell que es



retorcido: obtenga un puerto de escucha elegido por el sistema operativo (3)

Estoy escribiendo un cliente P2P retorcido usando el marco de aplicación. El puerto de escucha para las conexiones entrantes estará en un puerto aleatorio (determinado por OS). Sin embargo, necesito una forma de determinar qué es ese puerto después de crearlo:

import twisted... etc. application = service.Application(''vmesh'') peerservice = MyPeerService() servicecollection = service.IServiceCollection(application) factory = MyPeerFactory(peerservice) server = internet.TCPServer(0, factory) # listen on random port listen_port = server.getHost().port # ??? doesn''t work... server.setServiceParent(servicecollection)

No encuentro nada en los documentos sobre cómo consultar el puerto creado por internet.TCPServer() o mediante reactor.listenTCP() que reenvía. No puedo esperar a que ocurra una conexión ya que el cliente debe anunciar su puerto para que esas conexiones ocurran.


FWIW si necesita hacer esto con puntos finales aquí está mi implementación con un ligero ajuste para mi configuración local (la opción de devolución de llamada también funcionaría bien aquí):

class PortReporter(StreamServerEndpointService, object): def __init__(self, endpoint, factory): StreamServerEndpointService.__init__(self, endpoint, factory) self._reportedPort = None def privilegedStartService(self): r = super(PortReporter, self).privilegedStartService() self._waitingForPort.addCallback(self.port_cb) return r def port_cb(self, port): self._reportedPort = port.getHost().port return port def getReportedPort(self): return self._reportedPort


Puede acceder al enlace del puerto a su servidor de manera similar si todavía no inició el servidor (aún no llamó a startService ):

>>> serv._getPort()._realPortNumber

Otra cosa que también puedes hacer:

>>> serv._port._realPortNumber


listenTCP devuelve un IListeningPort , que tiene un método getHost() que devuelve un objeto con un port . Por ejemplo:

>>> from twisted.internet import reactor >>> from twisted.internet.protocol import Factory >>> port = reactor.listenTCP(0, Factory()) >>> port.getHost().port 55791

Sin embargo, TCPServer no llama a listenTCP hasta que se inicie con privilegedStartService . Además, IListeningPort no está realmente expuesto a través de una API pública. Por lo tanto, tendrá que escribir su propio Service . Afortunadamente, es bastante fácil hacer esto; TCPServer no hace mucho. Solo necesita escribir uno que informe su puerto en algún lugar tan pronto como comience a escuchar. Aquí hay un ejemplo:

from twisted.internet import reactor from twisted.application.service import Service class PortReporter(Service, object): def __init__(self, factory, reportPort): self.factory = factory self.reportPort = reportPort def privilegedStartService(self): self.listeningPort = reactor.listenTCP(0, self.factory) self.reportPort(self.listeningPort.getHost().port) return super(PortReporter, self).privilegedStartService() def stopService(self): self.listeningPort.stopListening() return super(PortReporter, self).stopService()

A continuación, puede usar esto en un archivo tac, de esta manera:

from twisted.internet.protocol import Factory from twisted.application.service import Application application = Application("test") def showPortNumber(n): print("The port number is: %d" % (n,)) PortReporter(Factory(), showPortNumber).setServiceParent(application)