T-Reqs(两个请求)是一个基于语法的HTTP Fuzzer,作为论文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 请求(版本 1.1 及更早)来对 HTTP 服务器进行模糊测试。它有三个主要组件:1)生成输入,2)变异生成的输入,3)将输入发送到目标服务器。
将 CFG 语法输入 fuzzer,用于生成 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'],
每个组件可以以两种方式标记:字符串可变和树可变(参见配置文件示例)。如果组件是字符串可变的,则可以在随机位置删除、替换或插入随机字符。在下面的示例(左侧)中,协议版本中的最后一个字符(1)被删除,方法名中的第三个字母(S)被替换为 R,并在 URI 的开头插入了一个斜杠。而如果组件是树可变的,则可以在该组件下的随机位置删除、替换或插入随机组件。下面的示例(右侧)显示了对请求行组件应用的三次树变异:1)method 被替换为 protocol,2)在当前 URI 之后插入了一个额外的 URI,3)现有的 proto 被删除。

fuzzer 需要了解用户关于输入生成和变异的偏好。具体来说,输入语法、可变组件、变异偏好等应在配置文件中指定(参见示例配置)。
为了能够重现每次迭代中生成和变异的输入,使用了一个种子编号。事实上,这个种子编号在输入形成和变异过程中用作随机数生成的种子。根据这些种子如何输入到 fuzzer 中,它有两种运行模式:单次模式和批量模式。在单次模式下,输入基于用户指定的种子生成和变异。在下面的命令中,指定了一个种子(即 505)。或者,可以使用 -f 选项指定一组种子(更多信息请参见帮助页面)。
python3 main.py -i -c config -s 505
而在批量模式(默认模式)下,fuzzer 从种子值 0 开始,并在每次迭代中递增,直到达到结束编号。开始和结束编号可以自定义。
python3 main.py -c config
我们还提供了一个 Dockerfile,以便您能够运行 t-reqs 代码。您可以运行以下命令开始:
# 在包含 Dockerfile 的目录下运行以下命令
docker build -t test/treqs .
# 使用上述命令构建镜像后,创建一个容器
docker run -ti test/treqs bash
# 在启动的 Docker shell 中运行以下命令
cd t-reqs/
python3 code/main.py -c config -n -i -s90
HTTP 请求走私依赖于服务器之间不同的主体解析行为:一台服务器使用 Transfer-Encoding 头部,而另一台服务器偏好使用 Content-Length 头部来决定请求体的边界;或者一台服务器忽略请求体,而另一台服务器处理它。
为了分析服务器对各种变异的 HTTP 请求形式的主体解析行为,我们需要在这些服务器上安装反馈机制,以告知我们主体解析行为。在服务器上安装反馈机制的一种方法是,将服务器以反向代理模式运行,并让它将请求转发到作为服务运行的“反馈提供者”脚本。该脚本测量接收到的请求中主体的长度,并将其保存下来,以便稍后与其他服务器进行比较。
此仓库中提供了一个示例的“反馈提供者”脚本。然而,该脚本在响应中返回主体长度信息,假设该信息存储在客户端。
T-Reqs 根据 MIT 许可证进行许可。