
Фреймворк дифференциального тестирования для HTTP-реализаций
The HTTP Garden — это набор HTTP-серверов и прокси, сконфигурированных для совместного использования, а также скрипты для взаимодействия с ними, которые делают поиск уязвимостей намного-намного проще. Посмотрите наш доклад на ShmooCon 2024 с классными демонстрациями уязвимостей, которые можно найти с помощью The HTTP Garden.
Мы хотели бы поблагодарить наших друзей из Galois, Trail of Bits, Narf Industries и Дартмутского колледжа за то, что этот проект стал возможным.
Эта работа основана на результатах, полученных при поддержке Агентства перспективных оборонных исследовательских проектов (DARPA) по контракту № HR0011-19-C-0076.
pip) или через системный менеджер пакетов:docker
pyyaml
tqdm
Если вы устанавливаете Python-пакеты через системный менеджер пакетов, учтите, что имена пакетов, возможно, потребуется дополнить префиксом py3-, python3- или python- в зависимости от системы.
./garden.sh start --build gunicorn hyper nginx haproxy
./garden.sh repl
garden> payload 'GET / HTTP/1.1\r\nHOST: a\r\n\r\n' | transduce haproxy | fanout | grid
'GET / HTTP/1.1\r\nHOST: a\r\n\r\n'
⬇️ haproxy
'GET / HTTP/1.1\r\nhost: a\r\n\r\n'
gunicorn: [
HTTPRequest(
method=b'GET', uri=b'/', version=b'1.1',
headers=[
(b'host', b'a'),
],
body=b'',
),
]
hyper: [
HTTPRequest(
method=b'GET', uri=b'/', version=b'1.1',
headers=[
(b'host', b'a'),
],
body=b'',
),
]
nginx: [
HTTPRequest(
method=b'GET', uri=b'/', version=b'1.1',
headers=[
(b'host', b'a'),
(b'content-length', b''),
(b'content-type', b''),
],
body=b'',
),
]
g
u
n
i h n
c y g
o p i
r e n
n r x
+-----
gunicorn|✓ ✓ ✓
hyper | ✓ ✓
nginx | ✓
Похоже, они все согласны. (Обратите внимание: даже несмотря на то, что Nginx добавил заголовки content-length и content-type, Garden знает об этом и не позволяет этому незначительному расхождению появляться в выводе grid.)
Давайте попробуем полезную нагрузку, которая использует голый символ перевода строки LF в конце тела chunked-сообщения. Это запрещено спецификацией.
garden> payload 'POST / HTTP/1.1\r\nHost: a\r\nTransfer-Encoding: chunked\r\n\r\n0\n\r\n' | fanout | grid
gunicorn: [
HTTPResponse(version=b'1.1', method=b'400', reason=b'Bad Request'),
]
hyper: [
]
nginx: [
HTTPRequest(
method=b'POST', uri=b'/', version=b'1.1',
headers=[
(b'transfer-encoding', b'chunked'),
(b'host', b'a'),
(b'content-length', b'0'),
(b'content-type', b''),
],
body=b'',
),
]
g
u
n
i h n
c y g
o p i
r e n
n r x
+-----
gunicorn|✓ ✓ X
hyper | ✓ X
nginx | ✓
Итак, Gunicorn ответил 400, Hyper не ответил, а Nginx принял запрос. Это нарушение спецификации авторами Nginx, которое они не желают исправлять.
Вы также могли заметить, что, хотя Gunicorn и Hyper ответили не совсем одинаково, ранее в выводе grid они отображались как согласованные.
Это потому, что их ответы по сути эквивалентны (отклонение сообщения), и Garden учитывает это.
imagesКаталог images содержит подкаталог для каждого HTTP-сервера и трансмодера в Garden.
Для каждой цели создаётся собственный Docker-образ.
Все программы, когда возможно, собираются из исходников.
Чтобы можно было легко собирать несколько версий каждой цели, все цели параметризуются URL-адресом репозитория (APP_REPO), именем ветки (APP_BRANCH) и хешем коммита (APP_VERSION).
toolsКаталог tools содержит скрипты, используемые для взаимодействия с серверами. Внутри вы найдёте:
probe_quirks.py: скрипт для перечисления безобидных особенностей разбора HTTP в тестируемых системах, которые следует игнорировать во время фаззинга;repl.py: основной пользовательский интерфейс The HTTP Garden;update.py: скрипт для обновления хешей коммитов в docker-compose.yml;|-| | aiohttp | | apache_httpd | | apache_tomcat | | appweb | | aws_c_http | | cpp_httplib | | eclipse_grizzly | | eclipse_jetty | | fasthttp | | go_stdlib | | gunicorn | | h2o | | haproxy_fcgi | | hyper | | hypercorn | | ktor | | libevent | | libmicrohttpd | | libsoup | | lighttpd | | mongoose | | netty | | nginx | | node_stdlib | | openbsd_httpd | | openlitespeed | | openwrt_uhttpd | | protocol_http1 | | puma | | tornado | | twisted | | undertow | | uvicorn | | waitress | | webrick | | yahns |