
SmuggleFuzz,一个可配置且快速的 HTTP 降级走私扫描器。它允许用户自定义 gadget 列表,并提供关于走私攻击失败原因的深入洞察。我相信许多基于 HTTP 降级的走私漏洞尚未被发现。不幸的是,许多人在粗略扫描后就停止了探索。通过使用 SmuggleFuzz,你可以发现他人可能忽略的走私漏洞。
更多信息请参见 https://moopinger.github.io/blog/smugglefuzz/fuzzing/smuggling/2024/01/31/SmuggleFuzz.html
从发布页面下载副本:https://github.com/Moopinger/smugglefuzz/releases
go install github.com/moopinger/smugglefuzz@latest
另一种方式:
git clone https://github.com/moopinger/smugglefuzz.git
cd smugglefuzz
go build .
./smugglefuzz
SmuggleFuzz 有三个命令:
Usage:
smugglefuzz scan [flags]
示例:
smugglefuzz scan -u https://example.com/ --confirm
smugglefuzz scan -u https://example.com/ --filter TIMEOUT --confirm
smugglefuzz scan -u https://example.com/ -w wordlist.txt -t 10 --confirm --filter TIMEOUT
smugglefuzz scan --dc -u https://example.com/ -w wordlist.txt -x PUT --confirm
//多个目标?只需使用 -f 代替 -u,并提供一个包含目标的文件:
smugglefuzz scan -f multiple_targets.txt --confirm -t 10
smugglefuzz scan -f multiple_targets.txt -w wordlist.txt --confirm -s ./save-success.txt --filter TIMEOUT
smugglefuzz scan -f multiple_targets.txt -w wordlist.txt -H "Cookie: date=...; session=...;" -s ./save-success.txt -x PUT --filter TIMEOUT
Flags:
-c, --confirm 启用此标志以在遇到超时时间时向目标发送确认。有助于确认目标是否存在漏洞。
-d, --data string 要发送的 HTTP/2 Data 帧。例如:99\r\n (默认 "99\r\n")
--dc 在输出中禁用颜色。当你想将输出保存到文件时,这很有用。
-f, --file string 一个包含多个目标的文件,格式为 URL。每行一个目标。
--filter string 通过字符串或帧类型等过滤响应。例如:405, 200, 502, TIMEOUT, RST, GOAWAY 等。
-H, --header string 插入自定义标头。应以常规标头格式提供:"Cookie: date=...; session=...;"
-h, --help scan 的帮助信息
-i, --interval int 超时间隔(秒)。(默认 5)
-x, --method string 要使用的 HTTP 请求方法。(默认 "POST")
-s, --save-success string 如果请求被确认为成功(通过 --confirm 标志),它将被保存到文件中。处理大量目标时很有用。
-t, --threads int 要运行的线程数。Smugglefuzz 可以很快,因此设置所需的数字。但过多可能会触发任何 WAF。(默认 4)
-u, --url string 要扫描的目标 URL。
-w, --wordlist string 提供自定义的 gadget 列表。如果未提供,将使用默认列表。
Usage:
smugglefuzz request [flags]
示例:
smugglefuzz request -u https://www.example.com/ -a "content-length\t; 13"
smugglefuzz request -u https://www.example.com/ -a "content-length\t; 13" -x PUT
smugglefuzz request -u https://www.example.com/ -a "content-length\t; 13" -H "Cookie: date=...; session=...;" --data "223\r\n"
Flags:
-a, --attack string 攻击标头,使用(; )分隔,就像扫描模式中的 wordlist 一样。
-d, --data string 要发送的 HTTP/2 Data 帧内容。(默认 "99\r\n")
--dc 在输出中禁用颜色。
-H, --header string 插入自定义标头。例如:"Cookie: values"
-h, --help request 的帮助信息
-i, --interval int 检测超时时间间隔(秒)。(默认 5)
-x, --method string 要使用的方法。(默认 "POST")
-u, --url string 要提交请求的目标 URL。
这将输出默认的 smuggle gadget。目前内置确认仅适用于 H2.CL 和 H2.TE。但仍然可以通过超时(–filter TIMEOUT)或在你自己的域上使用 OAST 来检测 H2.0 攻击。(参见下面的伪标头部分)
SmuggleFuzz 允许用户通过自定义词表完全控制请求。这些列表具有基本结构,应遵循该结构以实现最佳请求处理。例如,标头和它们的值使用“分号和空格(; )”进行分割,而不是通常的冒号,这样便于在走私请求中包含冒号值。这也为各种变体和创造性方法开辟了可能性。有关创建自己的有效负载的详细指导,请参阅:James Kettle 的 HTTP/2 研究。
该工具包含一个包含 125 个走私 gadget 的即用型列表,但总有扩展的空间。这些 gadget 可以使用“output”命令显示,从而深入了解查询的结构。用户可以使用“w”标志使用自定义词表运行扫描。该列表支持 URL 编码(%00)来表示不可打印的字节值,例如回车和换行表示为 '%0d%0a' 或 '\r\n'。虽然提供的列表很全面,但自己制作 gadget 可以显著提高成功率。
需要 h2c 支持?请查看 SmuggleFuzz 的 "experimental-h2c" 分支。
伪标头完全受支持,可以使用 ":name" 语法进行自定义:
:authority:scheme:method这些标头在测试 H2.0 攻击向量时特别有用。例如,在使用基于 OAST 的方法测试 H2.0 走私时,像下面这样的词表条目可能很有效:
从 v0.1.8 开始,[HOSTNAME] 可以用作占位符。SmuggleFuzz 将在运行时用主机名替换它。
:authority; [HOSTNAME]\r\n\r\nGET / HTTP/1.1\r\nHost: uniqid.oastify.com\r\nX-HEADER:%20或者
:authority; [HOSTNAME]\r\n\r\nGET https://uniqid.oastify.com/ HTTP/1.1\r\nHost: [HOSTNAME]\r\nX-HEADER:%20SmuggleFuzz 采用的检测方法与 Albinowax 在他对 HTTP/1 走私的研究以及 defparam 的 Smuggler 中使用的方法类似,但针对 HTTP/2 进行了调整。幸运的是,由于这些攻击涉及降级,因此相同的请求正文 / DATA 有效负载可以同时用于 H2.CL 和 H2.TE 检测。
词表的一个重要指导原则是,成功走私的标头应包含以下值以进行确认攻击:
CL: 13
TE: chunked
每个请求都包含一个值为 "99\r\n" 的 "Body"/DATA-Frame。如果走私了 TE 标头,则服务器会将其解释为长度为 153(0x99)的分块内容长度(如果成功走私),从而导致超时。类似地,走私一个内容长度为 13 的 CL 标头也会因为未满足长度而导致超时。
确认请求会重新提交导致超时的相同查询,但 Data 为:"3\r\nABC\r\n0\r\n\r\n"。这同时满足分块 TE 和 CL 13,从而获得成功响应,并可能表明存在走私漏洞。