Содержание статьи
Как работает Bash
Bash — это интерпретатор, который умеет выполнять полноценные скрипты из файлов и работать в виде командной строки. Он нужен для выполнения операций с файлами, запуска программ и управления службами.
Когда мы используем скриптовый файл, скрипт Bash работает как полноценная программа со своими операторами управления и циклами. Единственное отличие кода в том, что для запуска сторонних утилит не нужно использовать дополнительные команды и библиотеки. Bash максимально интегрирован в ОС, поэтому мы просто пишем название команды и получаем результат. Пример простого скрипта:
# Шебанг указывает, какой интерпретатор использовать#!/bin/bash# Берем первый аргумент из строки запускаTARGET=$1# Запускаем утилиту pingping -c 2 $TARGET > /dev/null 2>&1Сохрани в файл pinger. и сделай его исполняемым: chmod . Запусти командой ./. Ядро системы проверит шебанг (первую строку, которая начинается с #!) и запустит скрипт через ассоциированный интерпретатор. Чтобы гарантированно запустить с помощью Bash, вводи команду bash . В этом случае шебанг будет проигнорирован и скрипт принудительно выполнится в Bash.
Интерактивный режим — это обычный REPL (read-eval-print loop — «цикл чтения, вычисления и вывода»). Написал команду в терминале, он передал ее Bash, тот запускает нужные утилиты через fork и exec и возвращает результат.
Важно отделять несколько режимов интерактивности. В обычных условиях, когда у тебя открыт терминал с Bash прямо в операционной системе, он работает в режиме TTY (Teletype). Это абстракция операционной системы для управления вводом и выводом. С ее помощью терминал может отключать показ символов при вводе пароля. Этот же режим позволяет работать с управляющим вводом. Например, MySQL принимает команды пользователя, возвращает результат и снова ждет ввода команды.
Стабилизируем реверс-шелл
Если ты подключился через реверс‑шелл, ввод‑вывод будет перенаправлен на сетевой сокет, который не предоставляет TTY. В таком режиме тебе доступны команды, которые не ждут ввода и возвращают результат сразу. Не получится редактировать файл через Vim или nano. Работать в таких условиях можно, но не очень комфортно. Например, использовать подобные конструкции:
# Дописать свой код в чужой скриптecho 'evil code' >> backup.sh
# Переписать скрипт полностьюecho 'evil script' > backup.sh
# Заменить текст в конфиге с помощью sedsed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication yes/' /etc/ssh/sshd_config
Кроме неудобств в работе, есть высокая вероятность дисконнекта. Достаточно по привычке нажать Ctrl-C или запустить интерактивную команду. Такой шелл считается нестабильным, его легко потерять. Именно по этой причине в сообществах хакеров и пентестеров используется термин «стабилизировать». Имеется в виду стабилизация не самого коннекта, а именно терминала.
На этот случай есть классический обход — использовать псевдо-TTY в Python. Python уже давно есть в любой системе, поэтому трюк работает почти всегда:
python3 -c 'import pty; pty.spawn("/bin/bash")'После создания псевдо-TTY нажми Ctrl-Z, чтобы твой реверс‑шелл спрятался в фон, и введи
stty raw -echo; fg
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
