
Основанный на грамматике фаззер HTTP/1 с возможностью мутации
T-Reqs (Two Requests) — это грамматический HTTP-фаззер, созданный в рамках статьи под названием «T-Reqs: HTTP Request Smuggling with Differential Fuzzing», представленной на ACM CCS 2021.
BibTeX статьи:
@inproceedings{ccs2021treqs,
title={T-Reqs: HTTP Request Smuggling with Differential Fuzzing},
author={Jabiyev, Bahruz and Sprecher, Steven and Onarlioglu, Kaan and Kirda, Engin},
booktitle={Proceedings of the 2021 ACM SIGSAC Conference on Computer and Communications Security},
pages={1805--1820},
year={2021}
}
T-Reqs предназначен для фаззинга HTTP-серверов путем отправки мутированных HTTP-запросов версий 1.1 и ниже. Он состоит из трех основных компонентов: 1) генерация входных данных, 2) мутация сгенерированных входных данных и 3) доставка их на целевой сервер(ы).
Грамматика КСГ (CFG), подаваемая в фаззер, используется для генерации HTTP-запросов. Как показано в примере грамматики ниже, который адаптирован для фаззинга строки запроса, каждый компонент строки запроса и возможные значения для каждого из них явно указаны. Это позволяет генерировать корректные запросы с различными формами строки запроса, а также рассматривать каждый компонент строки запроса как отдельную единицу с точки зрения мутации.
'<start>':
['<request>'],
'<request>':
['<request-line><base><the-rest>'],
'<request-line>':
['<method-name><space><uri><space><protocol><separator><version><newline>'],
'<method-name>':
['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH'],
'<space>':
[' '],
'<uri>':
['/_URI_'],
'<protocol>':
['HTTP'],
'<separator>':
['/'],
'<version>':
['0.9', '1.0', '1.1'],
'<newline>':
['\r\n'],
'<base>':
['Host: _HOST_\r\nConnection:close\r\nX-Request-ID: _REQUEST_ID_\r\n'],
'<the-rest>':
['Content-Length: 5\r\n\r\nBBBBBBBBBB'],
Каждый компонент может быть помечен двумя способами: изменяемая строка (string mutable) и изменяемое дерево (tree mutable) (см. пример конфигурации). Если компонент является изменяемой строкой, то случайный символ может быть удален, заменен или вставлен в случайную позицию. В примере ниже (слева) последний символ в версии протокола (1) удален, третья буква в имени метода (S) заменена на R, а косая черта вставлена в начале URI. Если же компонент является изменяемым деревом, то случайный компонент может быть удален, заменен или вставлен в случайную позицию внутри этого компонента. Пример ниже (справа) показывает три мутации дерева, примененные к компоненту строки запроса: 1) method заменен на protocol, 2) дополнительный URI вставлен после текущего URI, 3) существующий proto удален.

Фаззер должен быть проинформирован о предпочтениях пользователя относительно генерации и мутации входных данных. Более конкретно, входная грамматика, изменяемые компоненты, предпочтения мутации и прочее должны быть указаны в файле конфигурации (см. пример конфигурации).
Для возможности воспроизведения сгенерированных и мутированных входных данных в каждой итерации используется номер зерна (seed). Фактически, этот номер зерна служит начальным значением для генерации случайных чисел во время формирования и мутации входных данных. В зависимости от того, как эти зерна передаются фаззеру, он работает в одном из двух режимов: индивидуальный и массовый. В индивидуальном режиме входные данные генерируются и мутируются на основе зерен, указанных пользователем. В команде ниже указано одно зерно (например, 505). Альтернативно, список зерен можно указать с помощью опции -f (см. страницу справки для получения дополнительной информации).
python3 main.py -i -c config -s 505
В массовом режиме (который используется по умолчанию) фаззер начинает с нуля в качестве значения зерна и увеличивает его на каждой итерации до достижения конечного числа. Начальное и конечное числа можно настроить.
python3 main.py -c config
Мы также предоставляем Dockerfile, чтобы вы могли запустить код t-reqs. Выполните следующие команды для начала работы:
# run the command below under the directory which has the Dockerfile
docker build -t test/treqs .
# create a container after you built the image using the command above
docker run -ti test/treqs bash
# run the commands below in the started docker shell
cd t-reqs/
python3 code/main.py -c config -n -i -s90
Контрабанда HTTP-запросов (HTTP Request Smuggling) основана на различиях в поведении при разборе тела запроса между серверами, где один сервер использует заголовок Transfer-Encoding, а другой предпочитает заголовок Content-Length для определения границ тела запроса, или один сервер игнорирует тело запроса, в то время как другой его обрабатывает.
Чтобы проанализировать разбор тела запроса серверами в ответ на различные мутации в различных формах HTTP-запроса, необходимо установить на эти серверы механизм обратной связи, который сообщал бы нам о поведении при разборе тела. Один из способов установки механизма обратной связи на сервер — запустить сервер в режиме обратного прокси и настроить его на пересылку запросов сценарию «поставщика обратной связи» (feedback provider), работающему как служба. Эта служба измеряет длину тела в полученных запросах и сохраняет ее для последующего сравнения с другими серверами.
Пример сценария «поставщика обратной связи» доступен в этом репозитории. Однако этот сценарий отправляет информацию о длине тела обратно в ответе, предполагая, что эта информация хранится на стороне клиента.
T-Reqs лицензирован под лицензией MIT.