Установка и настройка Radamsa в Ubuntu 18.04

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

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

Radamsa – это открытый инструмент для фаззинга, который может генерировать тестовые ситуации на основе заданных пользователем входных данных. Radamsa поддерживает скрипты и до сих пор успешно находил уязвимости в реальных приложениях, таких как Gzip.

В этом мануале мы установим Radamsa и попробуем с его помощью протестировать приложение командной строки и сетевые приложения на основе наших условных данных.

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

Требования

  • Сервер Ubuntu 18.04, настроенный по этому мануалу.
  • Приложение командной строки или сетевое приложение, которое вы хотите протестировать (например, Gzip, Tcpdump, Bind, Apache или любое другое приложение на ваш выбор). В данном мануале мы будем тестировать jq.

Важно! Radamsa может привести к нестабильной работе или сбоям приложений или систем, поэтому запускать Radamsa рекомендуется только в подготовленной среде, например на выделенном сервере. Также вам не помешает иметь письменное разрешение от владельца системы, прежде чем проводить фаззинг-тестирование.

1: Установка Radamsa

Для начала нужно скачать и скомпилировать Radamsa на вашей машине. Исходный код Radamsa можно найти здесь.

Обновите индекс локальных пакетов:

sudo apt update

Затем установите пакеты gcc, git, make и wget, которые нужны для компиляции исходного кода:

sudo apt install gcc git make wget

Подтвердите установку.

После этого можно загрузить копию исходного кода Radamsa. Клонируйте код из репозитория инструмента на GitLab.

git clone https://gitlab.com/akihe/radamsa.git

У вас появится каталог по имени radamsa, в нем будет содержаться исходный код приложения. Перейдите в этот каталог:

cd radamsa

Запустите компиляцию с помощью этой команды:

make

Затем установите скомпилированный бинарный файл Radamsa в $PATH:

sudo make install

Чтобы убедиться, что все работает, запросите версию установленной программы:

radamsa --version

Команда должна вернуть:

Radamsa 0.6

Если вместо этого вы получили ошибку:

radamsa: command not found

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

Установив Radamsa, вы можете сгенерировать тестовую атаку.

2: Генерирование контрольных примеров

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

Примечание: Radamsa может управлять входными данными самыми неожиданными способами, включая инвертирование бит, введение управляющих символов и так далее. Это может привести к тому, что сеанс терминала прервется или станет нестабильным. Имейте это в виду, прежде чем продолжить работу.

Для начала передайте Radamsa простой фрагмент текста, чтобы посмотреть, что произойдет:

echo "Hello, world!" | radamsa

Radamsa перепутает введенные данные и выведет контрольный пример:

Hello,, world!

В этом случае Radamsa вставил дополнительную запятую между Hello и world. Это изменение может показаться незначительным, но в некоторых приложениях даже это может привести к неправильной интерпретации данных.

Давайте попробуем еще раз запустить ту же команду. Вы увидите другой результат:

Hello, '''''''wor'd!

На этот раз в строку было вставлено несколько одинарных кавычек (‘), одна из которых перезаписала символ l в слове world. Этот контрольный пример с большей вероятностью вызовет проблемы, так как одинарные и двойные кавычки часто используются для разделения разных данных в списках.

Hello, $+$PATH\u0000`xcalc`world!

В этом случае Radamsa вставил строку внедрения оболочки, которая поможет проверить в тестируемом приложении уязвимости внедрения команд.

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

3: Фаззинг приложения командной строки

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

Метод фаззинга зависит от каждой конкретной программы. В этом мануале мы будем использовать в качестве примера jq, программу командной строки для обработки данных JSON.

Вы можете использовать любую другую подобную программу, если она работает по такому принципу: берет какую-либо форму структурированных или неструктурированных данных, что-то с ними делает, а затем выводит результат. Следовательно, наш пример также подходит для Gzip, Grep, bc, tr.

Если у вас еще не установлен пакет jq, вы можете установить его с помощью apt:

sudo apt install jq

Чтобы начать фазз-тест, создайте простой JSON-файл, который вы будете использовать в качестве входных данных Radamsa:

nano test.json

Затем вставьте в файл такие данные:

{
"test": "test",
"array": [
"item1: foo",
"item2: bar"
]
}

Вы можете обработать этот файл с помощью jq, если вы хотите проверить правильность синтаксиса JSON:

jq . test.json

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

Затем запустите тестовый файл JSON с помощью Radamsa и передайте его в jq. Это заставит jq прочитать обработанный контрольный пример, а не действительные исходные данные JSON:

radamsa test.json | jq

Если Radamsa путает данные JSON таким образом, что они остаются синтаксически действительными, jq будет выводить данные, отображая изменения, внесенные Radamsa.

Если Radamsa изменит данные JSON так, что они станут недействительными, jq отобразит соответствующую ошибку. Например:

parse error: Expected separator between values at line 5, column 16

Также может случиться так, что jq не сможет правильно обработать данные, и это приведет к аварийному завершению работы или неправильному поведению программы. Именно этот вариант в случае с фаззингом ценнее всего, так как он может обнаружить уязвимость системы безопасности (например, переполнение буфера или внедрение команд).

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

Создайте файл jq-fuzz.sh:

nano jq-fuzz.sh

Точное содержание скрипта будет отличаться в зависимости от типа программы, которую вы тестируете, и входных данных. В случае jq и других подобных ей программ подойдет такой скрипт:

#!/bin/bash
while true; do
radamsa test.json > input.txt
jq . input.txt > /dev/null 2>&1
if [ $? -gt 127 ]; then
cp input.txt crash-`date +s%.%N`.txt
echo "Crash found!"
fi
done

Скопируйте скрипт в ваш файл jq-fuzz.sh.

Этот скрипт содержит цикл while. Каждый раз, когда скрипт зацикливается, Radamsa генерирует контрольный пример на основе test.json и сохраняет его в input.txt.

Затем контрольный пример input.txt выполняется программой jq, а стандартный вывод и ошибки будут перенаправлены в /dev/null, чтобы избежать переполнения экрана терминала.

В завершение проверяется выходное значение jq. Если оно больше 127, это указывает на сбой. Затем входные данные сохраняются для последующего просмотра в файле crash- (после дефиса следует текущая дата в секундах и наносекундах Unix).

Сделайте скрипт исполняемым и включите его, чтобы автоматически запустить фазз-тестирование jq:

chmod +x jq-fuzz.sh
./jq-fuzz.sh

В любой момент вы можете нажать CTRL + C, чтобы прекратить работу сценария. Затем с помощью команды ls вы можете проверить, были ли обнаружены сбои – команда отобразит список каталогов, которые содержат файлы crash.

Также вы можете улучшить свои входные данные JSON: чем сложнее файл входных данных, тем лучше качество фазз-теста. Но старайтесь не использовать слишком большие файлы или файлы, которые содержат много повторяющихся данных. Идеальный входной файл – это файл небольшого размера, содержащий как можно больше сложных элементов. к сложным элементам относятся образцы данных в разных форматах, включая строки, целые числа, логические значения, списки и объекты, а также по возможности вложенные данные.

Только что с помощью Radamsa вы протестировали приложение командной строки. Теперь давайте попробуем отправить фазз-запросы сетевым сервисам.

4: Фаззинг запросов сетевых сервисов

Radamsa также может проводить фазз-тесты сетевых сервисов, выступая в роли сетевого клиента или сервера. Сейчас мы попробуем использовать Radamsa для фаззинга сетевого сервиса, где Radamsa будет выступать в качестве клиента.

Цель фаззинга сетевых сервисов – проверить, насколько устойчив тот или иной сервис к отправляемым клиентами искаженным или вредоносным данным. Многие сетевые сервисы, такие как веб-серверы или DNS-серверы, обычно подключены к Интернету, а потому они часто подвергаются атакам злоумышленников. Сетевой сервис, который не справляется с обработкой искаженных данных, может дать сбой или, что еще хуже, выйти из строя в открытом состоянии, что позволит злоумышленникам заполучить конфиденциальные данные (например, ключи шифрования или данные пользователей).

Как и с приложениями командной строки, метод фаззинга сетевых сервисов зависит от рассматриваемого сетевого сервиса. В этом примере мы будем использовать Radamsa для фазз-теста базового веб-сервера, обслуживающего статический HTML-контент.

Сначала нужно настроить веб-сервер для тестирования. Вы можете использовать для этого встроенный сервер разработки, который поставляется с пакетом php-cli. Для тестирования вашего веб-сервера вам также понадобится curl.

Если у вас не установлены php-cli или curl, вы можете установить их с помощью apt:

sudo apt install php-cli curl

Создайте каталог для хранения файлов вашего веб-сервера и перейдите в него:

mkdir ~/www
cd ~/www

Создайте HTML-файл:

nano index.html

Вставьте в него такую строку:

<h1>Hello, world!</h1>

Теперь вы можете запустить свой веб-сервер PHP. Вы должны иметь возможность просматривать логи веб-сервера, для этого откройте еще один сеанс терминала и создайте SSH-подключение к серверу:

cd ~/www
php -S localhost:8080

Это выведет примерно следующее:

PHP 7.2.24-0ubuntu0.18.04.1 Development Server started at Wed Jan  1 16:06:41 2020
Listening on http://localhost:8080
Document root is /home/user/www
Press Ctrl-C to quit.

Вернитесь в первый терминал и убедитесь, что веб-сервер работает:

curl localhost:8080

Это выведет тестовый файла index.html, который вы создали ранее:

<h1>Hello, world!</h1>

Ваш веб-сервер должен быть доступен только локально, поэтому не нужно открывать для него порты в брандмауэре.

Теперь, когда вы настроили свой тестовый веб-сервер, вы можете начать его фаззинг.

Давайте создадим пример HTTP-запроса, который мы будем использовать в качестве входных данных для Radamsa. Создайте для этого новый файл:

nano http-request.txt

Затем скопируйте в файл следующий пример HTTP-запроса:

GET / HTTP/1.1
Host: localhost:8080
User-Agent: test
Accept: */*

Затем вы можете использовать Radamsa для отправки этого HTTP-запроса на ваш локальный веб-сервер. Для этого вам нужно использовать Radamsa в качестве TCP-клиента, что можно сделать, указав IP-адрес и порт для подключения:

radamsa -o 127.0.0.1:8080 http-request.txt

Примечание: Использование Radamsa в качестве TCP-клиента потенциально может привести к передаче искаженных или вредоносных данных по сети. Это может привести к сбою, поэтому будьте очень осторожны, подключайтесь только к тем сетям, которые вы имеете право тестировать (а лучше вообще не покидайте localhost, 127.0.0.1).

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

Выведенные логи появятся во втором окне терминала:

[Wed Jan  1 16:26:49 2020] 127.0.0.1:49334 Invalid request (Unexpected EOF)
[Wed Jan  1 16:28:04 2020] 127.0.0.1:49336 Invalid request (Malformed HTTP request)
[Wed Jan  1 16:28:05 2020] 127.0.0.1:49338 Invalid request (Malformed HTTP request)
[Wed Jan  1 16:28:07 2020] 127.0.0.1:49340 Invalid request (Unexpected EOF)
[Wed Jan  1 16:28:08 2020] 127.0.0.1:49342 Invalid request (Malformed HTTP request)

Для оптимизации результатов и регистрации всех сбоев вы можете написать сценарий (аналогичный тому, что мы создали в разделе 3). Также рекомендуем рассмотреть возможность использования более сложного входного файла, который будет содержать дополнительные заголовки HTTP.

5: Фаззинг сетевых клиентских приложений

Теперь давайте попробуем использовать Radamsa для фазз-тестирования сетевого клиентского приложения. При этом Radamsa будет перехватывать ответы от сетевого сервиса и обрабатывать их до того, как они будут получены клиентом.

Цель этого вида фаззинга – проверить, насколько устойчивы сетевые клиентские приложения к потоку искаженных или вредоносных данных от сетевых сервисов. Например, можно протестировать веб-браузер (клиент), который получает искаженный HTML-код с веб-сервера (сетевой сервис), или DNS-клиент, который получает искаженные ответы DNS от DNS-сервера.

Как и в случае с приложениями командной строки или сетевыми сервисами, метод фаззинга будет зависеть от сетевого клиентского приложения. В этом примере мы будем использовать whois – простое приложение для отправки и получения запросов на основе TCP.

Приложение whois отправляет запросы на серверы WHOIS и получает записи WHOIS в качестве ответов. WHOIS работает через TCP-порт 43 и передает данные в виде открытого текста, благодаря чему отлично подходит для фазз-тестирования.

Если у вас еще нет whois, вы можете установить его с помощью apt:

sudo apt install whois

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

whois example.com > whois.txt

Затем нужно настроить Radamsa в качестве сервера, который обслуживает фазз-версии этого ответа whois. Чтобы иметь возможность использовать свой терминал, когда Radamsa работает в режиме сервера, вам нужно открыть еще один сеанс терминала и создать SSH-соединение с вашим сервером:

radamsa -o :4343 whois.txt -n inf

Теперь Radamsa будет работать в режиме TCP-сервера и генерировать фазз-версию whois.txt каждый раз, когда устанавливается соединение с сервером, независимо от данных запроса.

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

whois -h localhost:4343 example.com

Ответом будут тестовые данные, обработанные Radamsa. Вы можете продолжать отправлять запросы на локальный сервер, пока работает Radamsa, и каждый раз он будет выдавать разные ответы.

Как и в случае с сетевыми сервисами, для повышения эффективности фаззинга сетевых клиентов и обнаружения сбоев вы можете написать сценарий автоматизации (как в разделе 3).

Заключение

Вы установили Radamsa и использовали этот инструмент для фаззинга приложения командной строки, сетевого сервиса и клиента. Теперь у вас есть базовые знания, необходимые для фазз-тестирования ваших приложений. Надеемся, это поможет вам повысить их устойчивость к атакам.

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

Вы также можете попробовать другие инструменты фаззинга, например, American Fuzzy Lop (AFL), очень быстрый и точный инструмент для тестирования бинарных приложений.

Tags: , ,