[安全工具] – Spray:下一代路径爆破/指纹识别工具

[安全工具] – Spray:下一代路径爆破/指纹识别工具

前言

看到标题,可能各位师傅会认为我是标题党,然而并非如此。经过多次实践,我发现这款工具确实功能强大,其设计理念极为先进,广泛适用于各种资产定位与打点的场景。

这款工具出自Chainreactors[链式反应]团队之手,他们对于安全自动化的理解我认为是安全圈中数一数二的,本人亲自做过横评,实际上此款工具优于市面上开源的大部分路径爆破/信息收集工具,其作者已经对其进行过详细的介绍,所以这里我仅转载他们的文章

本文提到的工具GitHub – chainreactors/spray:下一代 HTTP 目录/文件模糊工具

性能
而其中第一个问题 性能.

需要注意, 这里指的性能不是通过提高并发数就能达到的性能. 过度提高并发数, 只会造成类似的DOS的效果, 发包端和收包的服务都有可能因为响应时间的提高而导致timeout 甚至造成服务宕机.

实际上, HTTP协议和golang本身就提供了不少性能优化的手段, 这些手段能最大效率利用带宽, 物理资源, FD等等资源. 最大程度利用库提供的连接池, HTTP协议提供的链接复用等特性可以让程序的性能好几个数量级的爆杀基于python的工具(dirsearch, dirmap等), 更能超过没有经过精心调制的rust工具(rustscan, feroxbuster)

有人提到rustscan 3s 6k端口很快, 但实际上golang做到3s 60k也没多大困难. 在HTTP Fuzz/目录爆破场景下, 还触及不到语言带来的性能优势

spray提供了两种client(标准库http和fasthttp), 以及两种模式check和brute. 分别根据不同的场景进行了不同的性能优化.

以brute模式下的标准库http. (优化点写在注释中)

standardClient: &http.Client{  
    Transport: &http.Transport{  
       TLSClientConfig: &tls.Config{  
          Renegotiation:      tls.RenegotiateNever,  // 禁止server端重新tls握手
          InsecureSkipVerify: true,                  // 忽略tls证书校验错误
       },  
       TLSHandshakeTimeout: config.Timeout,         // tls握手时间限制
       MaxConnsPerHost:     config.Thread * 3 / 2,  // 单个目标最大连接数, 指的是TCP连接, 通过keep-alive复用,防止大量重新建立的连接DOS目标. 性能优化的核心
       IdleConnTimeout:     config.Timeout,  // 空闲连接超过指定时间释放(默认2s)
       ReadBufferSize:      16384, // 16k   // spray认为16k的数据以及足够获取所有指纹
    },  
    Timeout: config.Timeout,                // 全局timeout, 方式过度等待
    CheckRedirect: func(req *http.Request, via []*http.Request) error {  
       return http.ErrUseLastResponse      // 限制重定向次数, 防止无限循环
    },  
},
做到合适的使用http协议的基本配置, 就能超过90%的扫描器了. 剩下的10%还需要一点黑魔法.

fasthttp与net/http包更是快上了数倍.

fasthttp通过复用buf, 优化解析器, io复用等手段可以让性能巨额提升. 只要合适配置其client, 性能可以爆杀一众基于rust开发的扫描器(性能好过feroxbuster 50%). 在本机nginx测试(避免网络带来的影响)下, 最快速率能到20w/s(包含生成请求与解析响应的完整过程, 而非只发包).

fasthttp的配置方式与优化http差不多. 有兴趣可以在代码里找到.

收集
然后就是如何覆盖到存在指纹的页面了. 这里就是考验指纹收集的核心能力了.

指纹存在于每个包中, 例如http的header.
指纹存在于特定页面中, 通过主动探测指定目录解决
指纹是供应链指纹, 有一些供应链特有的开发习惯
指纹是开源组件指纹, 可能存在犄角旮旯里
...
我们来分析一下这些常见场景(实际上比这复杂的多).

绝大部分工具只能覆盖其中的第一种, 也就是根据index页面匹配字符串或正则. 例如ehole, kscan

能满足第二点的, 也就是支持指定主动识别指纹目录的, 已经少了很多, 例如 observer_ward, xapp, 这两个工具可以配置主动发包路径.

要实现第一和第二点并不复杂, 那么第三和第四点改如何实现呢?

实际上已经不存在通用的解决办法了. 将变成一系列的规则交叉组合实现.

例如供应链和开源组件指纹, 可能只存在于某一个页面中

那么我们的目标就变成了尽可能多的发现目录;
如果目标存在基于path的反向代理. 那么我们的目标就变成爆破;
如果目标是一系列相似的api, 那么就变成枚举或者爬虫;
如果信息存在于通用文件中, 例如robots.txt, README.md, 各种编译文件, 依赖文件等, 还需要爆破通用文件目录.
.....
而每次收集到第三/第四类的指纹, 很大概率都意味着单点突破. 这类指纹是其他人很难发现, 很难关注的, 也是防守方自己也关注不到的.

在spray中, 提供了刚才提到的所有这些的解决方案.

spray最初设计是用来目录爆破的, 但是在实战中多次通过基本信息收集发现各种关键信息带来突破时, 才真正意识到了目录爆破是为了什么服务的. 这时候, 目录爆破的目的就从越来越多的字典变成了高效且精准.

有人提出过疑惑spray的下一代体现在哪里。现在可以给出答案了。

下一代HTTP Fuzz工具的几个特性:

高性能
支持同时爆破多个目标, 体现在: 批量输入与断点续传
多种方式的信息收集, 体现在: 敏感信息规则库+fingers指纹库
多种方式的目录生成, 体现在: 爬虫, 字典生成器, 递归生成器, 通用文件生成器, 备份文件生成器...
智能化判断, 尽可能少的人工介入
支持与漏洞利用工具的联动
......
从目录爆破到全面的WEB信息收集
spray 经过了36个版本的迭代。平均每个版本都会有1-3个feature. 不到一年时间, 已经是"面目全非"了.

spray从社区中接收了大量的提议, 现在版本号来到了v1.1.0, 本文也是等待大版本更新带来了较多bug修复后才发布. 感谢bug的反馈者们.

重点改动
默认使用模式变成了信息收集模式, 爆破现在只是spray的一种用法, 而不是全部。
极大加强了指纹能力, 指纹能力的详情在前一天的指纹识别的终极解决方案中介绍.
新增--active支持主动指纹识别
新增--finger 可以开启多指纹引擎识别
重构了--recon 现在支持更丰富的配置, 类似HaE能从响应包中提取敏感信息
重构了输出显示与日志, spray的输出与输入是被诟病最多的地方. 现在这两个点都得到了极大的优化
支持了diesearch的绝大部分特性并采用dirsearch的默认字典
支持内置预设字典
支持通用目录, 备份目录, 爬虫, 主动指纹识别爆破, 并信息收集
支持配置文件, 用户可以保留自己的预设
重构了关于插件的特性, --common 与--bak 有更强大的能力了

上文介绍了Spray强大的路径爆破能力以及优秀的性能,能看出作者对于爆破工具有很独到的见解

Spray的指纹识别能力则来源于Chainreactors团队的另一款指纹识别引擎:Fingers

 

 

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 共1条
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片