Smuggler——用 Python 3 编写的 HTTP 请求走私/异步测试工具

Smuggler——用 Python 3 编写的 HTTP 请求走私/异步测试工具

  ______                         _              
 / _____)                       | |             
( (____  ____  _   _  ____  ____| | _____  ____ 
 \____ \|    \| | | |/ _  |/ _  | || ___ |/ ___)
 _____) ) | | | |_| ( (_| ( (_| | || ____| |    
(______/|_|_|_|____/ \___ |\___ |\_)_____)_|    
                    (_____(_____|               

     @defparam

Smuggler

用 Python 3 编写的 HTTP 请求走私/异步测试工具

致谢

特别感谢James KettleHTTP 同步不同步的研究和方法

特别感谢Ben Sadeghipour对 Smuggler 进行 beta 测试,并允许我在Nahamcon 2020上讨论我的工作

重要的

此工具不保证没有误报或漏报。仅仅因为突变可能报告正常并不意味着没有不同步问题,但更重要的是,仅仅因为该工具指示潜在的不同步问题并不意味着肯定存在不同步问题。脚本可能会遇到来自大型实体(即 Google/AWS/Yahoo/Akamai/等)的请求处理器,这些处理器可能会显示误报结果。

安装

  1. git 克隆https://github.com/defparam/smuggler.git
  2. CD走私犯
  3. python3 走私者.py -h

示例用法

单一主机:

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 至少需要通过 -u/–url 参数获取 URL,或者通过 stdin 传入脚本的 URL 列表。如果 URL 指定,https://则 Smuggler 将使用 SSL/TLS 连接到主机:端口。如果 URL 指定http:// ,则根本不会使用 SSL/TLS。如果仅指定主机,则脚本将默认为https://

使用 -v/–vhost <host> 指定与服务器地址不同的主机头

当发现潜在问题时,使用 -x/–exit_early 退出对给定服务器的扫描。在管道模式下,smuggler 将继续扫描列表中的下一个主机

使用 -m/–method <method> 指定与 POST 不同的 HTTP 动词(即 GET/PUT/PATCH/OPTIONS/CONNECT/TRACE/DELETE/HEAD/等…)

使用 -l/–log <file> 将输出写入文件以及标准输出

使用 -q/–quiet 减少详细程度并仅记录发现的问题

使用 -t/–timeout <value> 指定套接字超时。该值应足够高以断定套接字已挂起,但又足够低以加快测试速度(默认值:5)

使用 –no-color 来抑制打印到标准输出的输出颜色代码(默认情况下日志不包含颜色代码)

使用 -c/–configfile <configfile> 指定你的走私者变异配置文件(默认值:default.py)

配置文件

配置文件是存在于 smuggler 的 ./config 目录中的 python 文件。这些文件描述了 HTTP 请求的内容和要测试的传输编码变异。

以下是 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))

目前还不需要输入任何参数来指定您自己的客户标头和用户代理。建议基于 default.py 创建您自己的配置文件,并根据您的喜好进行修改。

Smuggler 带有 3 个配置文件:default.py(快速)、doubles.py(小众、慢)、exhaustive.py(非常慢)default.py 是最快的,因为它包含较少的突变。

使用 -c/–configfile <configfile> 命令行选项指定配置文件

有效载荷目录

Smuggler 目录中是 payloads 目录。当 Smuggler 发现潜在的 CLTE 或 TECL 不同步问题时,它会自动将有问题的 payload 的二进制 txt 文件转储到 payloads 目录中。所有 payload 文件名都标有主机名、不同步类型和突变类型。使用这些 payload 直接 netcat 到服务器或导入到其他分析工具中。

帮助脚本

发现异步问题后,请随意使用我的 Turbo Intruder 异步脚本,可在此处找到:https DesyncAttack_CLTE.py ://github.com/defparam/tiscripts ,它们DesyncAttack_TECL.py是帮助发起异步攻击的出色脚本

执照

这些脚本根据 MIT 许可证发布。请参阅LICENSE

国内下载链接

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享