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)