
Инструмент для тестирования контрабанды HTTP-запросов и десинхронизации на Python, который обнаруживает уязвимости CL.TE и TE.CL с помощью настраиваемых мутационных полезных нагрузок и автоматического сканирования.
______ _
/ _____) | |
( (____ ____ _ _ ____ ____| | _____ ____
\____ \| \| | | |/ _ |/ _ | || ___ |/ ___)
_____) ) | | | |_| ( (_| ( (_| | || ____| |
(______/|_|_|_|____/ \___ |\___ |\_)_____)_|
(_____(_____|
@defparam
Инструмент для тестирования манипуляции HTTP-запросами (HTTP Request Smuggling / Desync), написанный на Python 3
Особая благодарность James Kettle за его исследования и методы работы с HTTP-десинхронизациями
И особая благодарность Ben Sadeghipour за бета-тестирование Smuggler и за возможность обсудить мою работу на Nahamcon 2020
Этот инструмент не гарантирует отсутствие ложноположительных или ложноотрицательных результатов. Тот факт, что мутация может сообщать об отсутствии проблем, не означает, что нет проблемы десинхронизации, и, что более важно, сам факт, что инструмент указывает на потенциальную проблему, не означает, что она действительно существует. Скрипт может взаимодействовать с обработчиками запросов крупных организаций (например, Google/AWS/Yahoo/Akamai и т.д.), что может приводить к ложноположительным результатам.
Один хост:
python3 smuggler.py -u <URL>
Список хостов:
cat list_of_hosts.txt | python3 smuggler.py
usage: smuggler.py [-h] [-u URL] [-v VHOST] [-x] [-m METHOD] [-l LOG] [-q]
[-t TIMEOUT] [--no-color] [-c CONFIGFILE]
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL Target URL with Endpoint
-v VHOST, --vhost VHOST
Specify a virtual host
-x, --exit_early Exit scan on first finding
-m METHOD, --method METHOD
HTTP method to use (e.g GET, POST) Default: POST
-l LOG, --log LOG Specify a log file
-q, --quiet Quiet mode will only log issues found
-t TIMEOUT, --timeout TIMEOUT
Socket timeout value Default: 5
--no-color Suppress color codes
-c CONFIGFILE, --configfile CONFIGFILE
Filepath to the configuration file of payloads
Smuggler требует как минимум либо URL через аргумент -u/--url, либо список URL, переданный через stdin. Если в URL указано https://, Smuggler будет подключаться к хосту:порту с использованием SSL/TLS. Если указано http://, SSL/TLS не используется. Если указан только хост, скрипт по умолчанию использует https://
Используйте -v/--vhost <хост> для указания заголовка Host, отличного от адреса сервера
Используйте -x/--exit_early для завершения сканирования данного сервера при обнаружении потенциальной проблемы. В режиме pipe Smuggler просто перейдёт к следующему хосту в списке
Используйте -m/--method <метод> для указания отличного от POST HTTP-глагола (например GET/PUT/PATCH/OPTIONS/CONNECT/TRACE/DELETE/HEAD и т.д.)
Используйте -l/--log <файл> для записи вывода в файл помимо stdout
Используйте -q/--quiet для уменьшения подробности вывода — логируются только найденные проблемы
Используйте -t/--timeout <значение> для указания таймаута сокета. Значение должно быть достаточно большим, чтобы убедиться, что сокет завис, но достаточно маленьким для ускорения тестирования (по умолчанию: 5)
Используйте --no-color для подавления цветовых кодов в выводе stdout (логи по умолчанию не содержат цветовых кодов)
Используйте -c/--configfile <файл_конфигурации> для указания вашего файла конфигурации мутаций smuggler (по умолчанию: default.py)
Файлы конфигурации — это Python-файлы, расположенные в каталоге ./config внутри smuggler. Они описывают содержимое HTTP-запросов и мутации transfer-encoding для тестирования.
Вот пример содержимого default.py:
def render_template(gadget):
RN = "\r\n"
p = Payload()
p.header = "__METHOD__ __ENDPOINT__?cb=__RANDOM__ HTTP/1.1" + RN
# p.header += "Transfer-Encoding: chunked" +RN
p.header += gadget + RN
p.header += "Host: __HOST__" + RN
p.header += "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36" + RN
p.header += "Content-type: application/x-www-form-urlencoded; charset=UTF-8" + RN
p.header += "Content-Length: __REPLACE_CL__" + RN
return p
mutations["nameprefix1"] = render_template(" Transfer-Encoding: chunked")
mutations["tabprefix1"] = render_template("Transfer-Encoding:\tchunked")
mutations["tabprefix2"] = render_template("Transfer-Encoding\t:\tchunked")
mutations["space1"] = render_template("Transfer-Encoding : chunked")
for i in [0x1,0x4,0x8,0x9,0xa,0xb,0xc,0xd,0x1F,0x20,0x7f,0xA0,0xFF]:
mutations["midspace-%02x"%i] = render_template("Transfer-Encoding:%cchunked"%(i))
mutations["postspace-%02x"%i] = render_template("Transfer-Encoding%c: chunked"%(i))
mutations["prespace-%02x"%i] = render_template("%cTransfer-Encoding: chunked"%(i))
mutations["endspace-%02x"%i] = render_template("Transfer-Encoding: chunked%c"%(i))
mutations["xprespace-%02x"%i] = render_template("X: X%cTransfer-Encoding: chunked"%(i))
mutations["endspacex-%02x"%i] = render_template("Transfer-Encoding: chunked%cX: X"%(i))
mutations["rxprespace-%02x"%i] = render_template("X: X\r%cTransfer-Encoding: chunked"%(i))
mutations["xnprespace-%02x"%i] = render_template("X: X%c\nTransfer-Encoding: chunked"%(i))
mutations["endspacerx-%02x"%i] = render_template("Transfer-Encoding: chunked\r%cX: X"%(i))
mutations["endspacexn-%02x"%i] = render_template("Transfer-Encoding: chunked%c\nX: X"%(i))
На данный момент нет аргументов для указания собственных пользовательских заголовков и user-agent. Рекомендуется создать собственный файл конфигурации на основе default.py и изменить его по своему усмотрению.
Smuggler поставляется с 3 файлами конфигурации: default.py (быстрый), doubles.py (нишевый, медленный), exhaustive.py (очень медленный) default.py самый быстрый, так как содержит меньше мутаций.
Указывайте файлы конфигурации с помощью опции командной строки -c/--configfile <файл_конфигурации>
Внутри каталога Smuggler находится каталог payloads. Когда Smuggler обнаруживает потенциальную проблему десинхронизации CLTE или TECL, он автоматически сохраняет двоичный текстовый файл проблемной полезной нагрузки в каталог payloads. Все имена файлов payload аннотированы именем хоста, типом десинхронизации и типом мутации. Используйте эти payload для отправки напрямую на сервер через netcat или для импорта в другие инструменты анализа.
После обнаружения проблемы десинхронизации вы можете воспользоваться моими скриптами для Turbo Intruder, которые находятся здесь: https://github.com/defparam/tiscripts
DesyncAttack_CLTE.py и DesyncAttack_TECL.py — отличные скрипты для подготовки атаки на десинхронизацию.
Данные скрипты распространяются под лицензией MIT. См. LICENSE.