一、Yakit介绍
1.1 简介
Yakit是一款集成化的网络安全单兵工具,基于Yak语言开发,提供图形化界面,旨在简化安全测试流程。它集成了多种功能,包括MITM攻击、Web模糊测试等,支持从信息收集到攻击实施的渗透测试全流程。Yakit通过模块化设计,结合Yaklang语言和gRPC通信层,确保了灵活性和扩展性。用户无需编写代码即可执行复杂测试,同时支持自定义脚本以满足特定需求。Yakit强调在合法授权下使用,以确保所有安全测试活动合规合法。
Yak 语言核心提供了非常强大的安全能力,为了让 Yak 本身的安全能力更容易贴近大家的实际使用,降低使用的门槛,我们在为 Yak 编写了 gRPC 服务器,并使用这个服务器实现 / 构建了一个客户端:Yakit。
Yakit 是 Yak 的衍生项目,对于一些不想写代码的安全从业者,Yakit会为Yak中所有的能力提供合适的GUI,通过Yakit的GUI去操控引擎的能力,随着版本更迭,GUI会更加成熟。Yakit的gRPC服务器,让用户部署更加方便快捷,与平台无关,可选择远程部署或直接本地启动在主机中使用。
能做到什么?
- 类 Burpsuite 的 MITM 劫持操作台
- 查看所有劫持到的请求的历史记录以及分析请求的参数
- 全球第一个可视化的 Web 模糊测试工具:Web Fuzzer
- Yak Cloud IDE:内置智能提示的 Yak 语言云 IDE
- ShellReceiver:开启 TCP 服务器接收反弹交互式 Shell 的反连
- 第三方 Yak 模块商店:社区主导的第三方 Yak 模块插件,你想要的应有尽有
1.2 Yakit架构
Yakit 的核心并不在工具本身上,而是依托于 Yak gRPC 接口; 也就是说,我们可以仅仅只把 Yakit 当作一个 “视窗” 来操纵 Yak 引擎来完成我们想要实现的安全能力。
用一张图来简单解释一下 Yakit 的架构是怎么样与传统安全工具有所区别的:
- Yakit 的能力需要 Yak 引擎
Yakit 所有的能力都建立在 Yak 引擎提供对应版本的 gRPC 接口支持的基础上。
所以,Yak 引擎启动之后,Yakit 才能连接执行各种各样的安全能力。
1.3 用户数据与本地文件存储
一般来说,本地文件与用户存储数据将会存储在 $HOME/yakit-projects/
目录下。
目录中的文件包括
MITM 需要用到的根证书与根证书的密钥
sqlite3 格式的数据库,数据库的内容是 Yakit 使用的记录,包括劫持到的请求,PoC等
如果本地数据库权限配置不合理,将会导致无法写入数据等问题造成 Yakit 功能不可用。
可以通过如下方式修复:
sudo chown -R user ~/yakit-projects
sudo chmod 0755 ~/yakit-projects
二、安装部署
2.1 客户端安装
https://yaklang.com/ 【下载地址】
2.2 核心引擎
1.1.6版本之后引擎下载方式为自动下载安装,通过安装包安装即可同时安装客户端和引擎,无需单独安装引擎。
2.3 界面初识
2.4 本地模式vs远程模式
由于 Yak 核心引擎与 Yakit 的分离式安装,Yakit 仅仅作为一个客户端而存在,Yakit 的使用理所当然就应该存在两种模式
本地模式:默认启动一个随机端口的
yak grpc
服务器远程模式:yak grpc 可以启动在任何平台 / 任何网络位置,包括
远端托管主机 ECS/VPS
本地个人 PC
内网环境
与此同时,yak grpc 启动参数支持设置 --tls
与 --secret
以实现一些远程连接的安全需求。
同时 Yakit 既然作为客户端,在远程模式和本地模式下,除了网络延迟之外,其他的使用体验应该是完全一致的。
三、爆破与未授权检测
3.1 简介
破和未授权检测是网络安全领域中一种常见的测试技术,其主要目的是测试系统或应用程序中的口令是否强健,Yakit的爆破与未授权检测模块则实现了该部分的内容。这个模块可以对多种常见协议和服务(如ftp、memcached、mongodb、mssql、mysql、postgres、rdp、redis、smb、ssh、tomcat、vnc等)进行口令的爆破,以验证系统的安全性。
该模块的基本工作原理是:利用字典和暴力破解等技术,不断尝试各种可能的口令,直到找到正确的口令为止。如果正确的口令被找到,那么爆破程序将立即停止,并返回成功的结果。如果在一定时间内没有找到正确的口令,那么爆破程序将返回失败的结果。
为了提高爆破效率和准确性,采用多线程和异步请求等技术,可以同时进行多个协议和服务的口令爆破,大大缩短了测试时间。同时,该模块还可以自动分析和识别协议和服务的版本信息,根据不同版本的特点,进行检测。
3.2 参数设置
点击更多参数可以进行字典的自定义配置以及并发和间隔时间等高级参数的设置。
关于参数的解释:
- 爆破用户字典:可以选择上传在
Payload管理
的字典进行爆破 - 爆破用户:如需对字典内容进行补充,可以在这里进行输入 -
- 同时使用默认字典:如勾选则表示需要使用该功能内置的默认字典,不勾选则表示不使用。
- 爆破密码字典、爆破密码、同时使用默认字典意义同上
- 自动停止:遇到第一个爆破结果时是否终止任务
- 目标并发:同时可爆破的目标数,yak的爆破规则为同时爆破“多个目标”,每个目标低并发。这样在有多个目标的时候,并不会影响效率,而且单个目标也不会过快导致被封禁。
- 最小延迟,最大延迟:可理解为超时时间,单位为s,超过时间则不会继续进行爆破。一般来讲,如果要 ban 爆破行为的话,通常会设置一个时间窗口,短时间窗口被打满会认为发生了爆破事件。如果可以再“放缓” 针对单个目标的测试强度,其实有可能可以缓解这个问题,所以我们可以通过这种设置最小延迟和最大延迟来解决这个问题。
3.3 实验验证(EX)
四、端口探测和指纹扫描
4.1 概述
4.1.1 端口扫描
端口扫描和指纹识别是渗透测试和网络安全领域中常用的基础技术之一,用于评估目标系统的安全性和发现可能存在的漏洞和攻击面。也是Yakit基础工具的模块之一,本文将对端口探测和指纹扫描模块
进行简单介绍。
端口扫描是指通过扫描目标系统上的端口,确定哪些端口是开放的,并确定这些开放的端口上运行的服务类型和版本信息。
Yakit 使用的端口扫描的技术主要有以下几种:
- TCP SYN扫描:该技术利用TCP协议的三次握手过程中的SYN和ACK标志来判断端口的开放情况。扫描模块发送一个SYN标志的数据包给目标主机,如果目标主机回应了一个SYN/ACK数据包,就表明该端口是开放的。扫描模块随即发送一个RST数据包,以关闭连接。如果目标主机回应了一个RST/ACK数据包,表明该端口是关闭的。如果没有任何响应,表明该端口可能被防火墙或者入侵检测系统屏蔽了。
- TCP Connect扫描:该技术利用TCP协议的三次握手过程来判断端口的开放情况。扫描模块向目标主机发起一个TCP连接请求,如果目标主机回应一个SYN/ACK数据包,表明该端口是开放的,扫描模块会回应一个ACK数据包,以建立连接。如果目标主机回应一个RST数据包,表明该端口是关闭的。如果没有任何响应,表明该端口可能被防火墙或者入侵检测系统屏蔽了。
- UDP扫描:UDP协议没有像TCP协议一样的连接状态,因此UDP扫描更加复杂。扫描模块向目标主机发送一个UDP数据包,如果目标主机回应了一个ICMP端口不可达数据包,表明该端口是关闭的。如果没有任何响应,表明该端口可能是开放的。需要注意的是,由于UDP协议没有连接状态,因此UDP扫描的准确性比TCP扫描要低。
4.1.2 指纹识别
指纹识别是通过对目标系统上的服务和应用程序进行识别,来确定目标系统上的操作系统、应用程序和服务信息。指纹识别技术主要通过解析网络数据包和应用程序响应消息来实现。
以下是常见的几种指纹识别技术及其原理:
- 应用程序指纹识别:该技术通过解析应用程序的响应消息,来确定应用程序的类型和版本信息。例如,HTTP协议中的服务器响应头信息就包含了Web服务器的类型和版本信息。指纹识别器通过向目标系统发送HTTP请求,并解析响应消息中的服务器头信息,来确定Web服务器的类型和版本信息。
- 协议指纹识别:该技术通过解析网络数据包,来确定目标系统所使用的协议类型和版本信息。例如,通过解析TCP数据包的TCP标志位、TCP选项和窗口大小等信息,可以确定目标系统上的TCP/IP协议的版本信息。
- 操作系统指纹识别:该技术通过解析网络数据包中的特征信息,来确定目标系统所使用的操作系统类型和版本信息。例如,通过解析TCP数据包中的MSS、TTL、IP ID等信息,可以确定目标系统所使用的操作系统类型和版本信息。
4.2 用法
- SYN扫描
具有权限要求,Linux下启动yakit需要以root权限启动,windows下需要管理员权限启动,如果不是以root或者管理员权限启动会报错。
- 指纹扫描
无权限要求,可直接进行扫描,识别端口指纹.
- SYN+指纹扫描
具有权限要求,Linux下启动yakit需要以root权限启动,windows下需要管理员权限启动,如果不是以root或者管理员权限启动会报错。
4.3 实验验证(EX)
实验验证:不如nmap好用。
我扫描的是mac上虚拟网卡bridge100上的192.168.155.34机子上开放端口和指纹的情况。一开始跳过主机存货检测的时候老是会报下面的错。
[WARN] 2024-12-24 15:07:45 [grpc_http_request_debug:173] execute debug script failed: exec yakc with code failed: Panic Stack:
__yak_main__
429 | synscan.concurrent(synConcurrent),
430 | synscan.iface(synScanNetInterface),
431 | )
432 > die(err)
^~~~~
433 |
434 | res, err := servicescan.ScanFromSynResult(synResults, opts...)
435 | die(err)
YakVM Panic: no valid ping results found
单独进行syn扫描或指纹扫描的时候,识别的端口总是不全。
最后通过设置不跳过主机存活+syn+指纹扫描,得到了较为全面的结果。
服务识别的情况并不好。
五、基础爬虫
5.1 背景
众所周知,爬虫是主动漏洞扫描中极其重要的一环。在漏洞扫描中,爬虫被用作一种数据收集工具,用于获取目标系统的信息以帮助我们发现漏洞。
Yakit 漏洞扫描中的基础爬虫
通常包含以下三个主要步骤:
- 网站爬取:爬虫首先会爬取目标系统中的网站,并将网站的源代码和相关信息存储到扫描器的数据库中。这些信息包括网站的URL、页面结构、表单、脚本和其他与网站相关的信息。
- 爬取数据分析:基础爬虫会对爬取的网站数据进行分析,并从中提取相关的信息,如网站的结构、链接、表单和参数等。
- 漏洞检测:基础爬虫会使用爬取到的信息根据加载的相关的Yakit插件进行漏洞扫描,并根据扫描结果提供相应的漏洞报告。
需要注意的是,漏洞扫描中的爬虫与普通的爬虫有所不同。它并不是为了抓取网站上的数据而设计的,而是为了获取网站结构和参数等信息以帮助我们发现漏洞。同时,进行漏洞扫描时需要遵守相关的法律和道德规范,不能进行未经授权的攻击行为。
5.2 其他参数
- 设置代理:有些网站访问不到的,可以加入代理进行访问,格式为http://127.0.0.1:7890 或者 socks5://127.0.0.1:7890
- 超时时间:每个请求的最大超时时间
- 最大深度:设置爬虫的最大深度(逻辑深度,并不是级数)
- 并发量:爬虫的并发请求量(可以理解为线程数)
- 最大URL数:爬虫获取到的最大量URL(这个选项一般用来限制无限制的爬虫,一般不需要改动)
- 最大请求数:本次爬虫最多发出多少个请求?(一般用于限制爬虫行为,一般不需要改动)
5.3 实验验证(EX)
login.html都没有爬到,效果不是很好。
六、空间引擎:Hunter
6.1 概述
网络空间搜索引擎是一种专门用于在网络上发现和分析特定信息的搜索引擎,也是渗透测试中信息收集的方式之一。
与传统搜索引擎不同,网络空间搜索引擎的目标是搜索网络上的非常规资源,例如网络服务器、端口、IP地址、文件、目录、数据库等等。它可以帮助企业、政府机构、安全团队等进行网络情报收集和威胁情报分析。
除了hunter外,还有很多同类型的空间搜索引擎,在Yakit插件商店中也有类似的插件。
6.2 使用
通过配置hunter的apiKey和用户名并输入hunter语法来获取目标资产,并且左边提供poc插件进行批量检测。
6.3 实验验证(EX)
缺少空间引擎的apikey,暂未做实验验证。
七、子域名收集
7.1 背景
子域名收集是指通过各种技术手段,收集某个主域名下所有的子域名列表。子域名是指在主域名前面添加一级或多级名称的域名。例如,对于主域名example.com,其子域名可以是www.example.com、mail.example.com、blog.example.com 等等。
子域名收集的原理主要涉及以下几个方面:
- 域名解析:域名解析是将域名解析为对应IP地址的过程。在子域名收集过程中,可以通过查询主域名的DNS记录来获取其下的子域名列表。通过递归查询,可以获取主域名下所有的子域名。
- 模糊匹配:对于一些主域名,可能会存在一些常见的子域名,例如www、mail、ftp等等。通过在主域名前面添加这些常见的子域名,可以得到可能存在的子域名列表。例如,对于主域名example.com,可以尝试查询www.example.com、mail.example.com 等等。
- 爆破技术:爆破技术是指利用程序自动化的方式,对域名进行大量的猜测和尝试,以获取其下的子域名列表。例如,可以使用字典文件对主域名进行爆破,尝试各种可能存在的子域名。
- 搜索引擎:通过搜索引擎的方式,可以搜索到主域名下可能存在的子域名。例如,可以使用搜索引擎的“site:example.com”命令来搜索所有以example.com结尾的子域名。
7.2 使用方法
在输入框输入要测试的目标的根域名,然后点击执行即可开始爆破,爆破的结果会在下方展示,也会在数据库入库。
7.3 实验验证(EX)
八、综合目录扫描与爆破
8.1 背景
目录扫描是一种常用的Web应用程序安全测试技术,用于发现Web应用程序中存在的可能存在的漏洞和弱点。其原理是通过对Web应用程序中的目录和文件进行遍历,来发现可能存在的安全漏洞和风险。
具体来说,目录扫描工具会通过程序自动化的方式,生成大量的HTTP请求,并请求Web应用程序中的所有可能存在的目录和文件。当Web应用程序返回200状态码时,表示该目录或文件存在;当Web应用程序返回404状态码时,表示该目录或文件不存在。通过对Web应用程序返回的状态码进行分析,目录扫描工具可以确定哪些目录或文件是存在的,哪些是不存在的。
在目录扫描过程中,目录扫描通常会使用字典文件,Yakit内置了一些常见字典,这些字典文件包含了一些常见的目录和文件路径,用于帮助目录扫描工具生成HTTP请求。此外,还可以通过调整线程的方式,同时发送多个HTTP请求,加快扫描速度。
需要注意的是,目录扫描工具的扫描结果并不一定是准确的,因为Web应用程序可能存在某些安全机制来防止目录扫描工具的攻击,例如IP封锁、User-Agent过滤等。因此,在使用目录扫描工具进行安全测试时,需要结合其他的测试技术,如手工测试、漏洞扫描等,以确保测试的全面性和准确性。
8.2 使用方法
点击检查项目
文本框,选择想要使用的字典,在文本框输入目标后,点击开始执行
即可针对文件以及网站目录进行扫描爆破。
支持的文件或文件类型有:.sql、.bak、.zip、.rar、admin.sql、backup.zip、web.rar,单次扫描结果可在页面下方进行展示。
8.3 实验验证(EX)
后续搭建靶场进行测试。
九、专项漏洞测试
9.1 背景
专项漏洞检测是针对特定应用程序或系统进行的安全漏洞扫描技术,旨在检测与该应用程序或系统相关的安全漏洞。
Yakit通过对常见的中间件、CMS、框架、组件进行总结、归纳,并针对这些组件对其常见的高危漏洞进行了整理。
通过预制漏洞源码,对可以对某类特定目标进行专项的漏洞检测,可以自定义新增poc种类。
9.2 使用方法
首先点击左上角的下拉菜单,选择自己想要检测的组件,选择完成后在右侧文本框中输入想要检测的目标点击执行任务即可开始扫描。
单次扫描的结果可以在命中风险与漏洞
中查看。
若要进行批量的检测,点击额外配置
然后点击此处
上传文本文件
9.3 实验验证(EX)
后续研究具体漏洞时进行相应的实验验证。
十、自动化漏洞检测
10.1 背景
渗透测试是一种通过模拟黑客攻击的方式,通常情况下一般会包括以下步骤:
- 信息收集:通过搜索引擎、whois查询、子域名枚举、网络拓扑分析等方式,收集目标系统的基础信息,如IP地址、域名、主机名、操作系统、服务等。
- 端口扫描:使用端口扫描工具,扫描目标系统的开放端口,确定哪些端口是开放的,以及哪些服务运行在这些端口上。
- 漏洞探测:使用漏洞扫描工具,对目标系统进行漏洞扫描,探测目标系统是否存在已知漏洞或弱点。
- 漏洞验证:对扫描工具发现的漏洞进行验证,确认漏洞是否真实存在、是否可利用,以及漏洞对系统的影响程度。
在具体实践中,信息收集和端口扫描通常是漏洞检测的第一步,以便对目标系统的结构和组件有一个大体的了解。接下来,漏洞探测和漏洞验证则是确定目标系统是否存在安全漏洞的关键步骤。
漏洞检测是一项复杂的任务,需要根据目标系统的特点和安全需求,综合选择适当的工具和技术进行测试,以尽可能全面地发现系统中存在的安全漏洞和风险。
Yakit中的基础工具,涵盖了渗透测试的全流程,本章节是对Yakit自动化渗透的探索,旨在自动化完成从信息收集、端口扫描、漏洞探测、漏洞验证的全过程。比如主机服务检测、WEB服务检测、漏洞检测、弱口令检测等场景的组合利用。
下面以信息收集、端口扫描、漏洞探测、漏洞验证的全过程为例,进行使用的说明。
10.2 使用方法
首先,打开基础工具
–端口/指纹扫描
在左侧的插件处勾选各个过程所需要的插件,然后在文本框输入想要扫描的目标,
在各个插件的参数配制处根据自己的需求进行调整,然后点击执行任务进开始扫描。
每个插件扫描的结果会在对应的下方的展示栏处进行展示,可根据需求进行查看。
针对扫描IP数量多少可以做一些更多参数高级配置。
- 扫描模式选择
服务器IP数量少,我们就选择指纹扫描,这个相对来说要准确一点,但是速度要慢一点,服务器IP数据量多,我们就选择SYN扫描 或者 SYN+指纹扫描,速度较快。
主动发包超时时间设置:如果左侧选择的插件少 我们就设置5-7 如果左侧选择的插件多 我们就设置1-3
其他配置:根据详情实际情况而定,一般默认无需修改。
- 插件批量执行模块
该模块旨在自动化对URL进行扫描识别即漏洞检测。点击插件
-选择插件批量执行
–输入目标
–执行任务
即可。
注意额外配置扫描超时 默认设置2小时 7200 可以根据扫描网站数量而定设置3600都可以,并且可以设置代理等操作。
扫描到一半点击“结束”,进行中断的任务,可在未完成中选择任务继续执行。
十一、MITM中间人代理与劫持
11.1 中间人攻击简介
“MITM” 是 “Man-in-the-Middle” 的缩写,意思是中间人攻击。
MITM攻击是一种网络攻击技术,攻击者通过欺骗的手段,让自己成为通信双方之间的中间人,从而可以窃取双方之间的通信内容、修改通信内容、甚至篡改通信流量,从而实现窃取信息、伪造信息等攻击目的。
在渗透测试中,MITM劫持可以被用来模拟真实的黑客攻击,以测试系统和应用程序的安全性。
渗透测试中使用MITM攻击的一个典型场景是在测试Web应用程序时。攻击者可以使用MITM技术拦截应用程序和服务器之间的通信,以获取用户名和密码等敏感信息,或者篡改应用程序返回的数据。攻击者可以使用代理工具,来捕获应用程序发送和接收的数据,对数据进行修改或篡改,然后重新发送到应用程序或服务器。这样就可以测试应用程序是否可以有效地防范MITM攻击,并且是否能够正确地处理应用程序和服务器之间的通信。
MITM攻击还可以用来测试网络的弱点,并检测是否存在潜在的漏洞。通过MITM攻击,渗透测试人员可以捕获网络中传输的数据,并进行分析和审查,以发现可能存在的安全问题。
例如,攻击者可以利用MITM攻击来欺骗局域网内的设备,并拦截设备之间的通信流量,从而窃取敏感信息,或者篡改数据包,对网络进行进一步的攻击。
总的来说,MITM劫持是渗透测试中常用的一种技术,它可以帮助测试人员发现网络中可能存在的安全漏洞,提供相应的建议和解决方案,从而保护系统和应用程序的安全。
11.2 MITM 交互式劫持技术
Yakit的MITM模块原理是启动一个HTTP代理,自动转发流量,当用户启动手动劫持后,会停止自动转发,阻塞请求,并将请求出栈,做解压Gzip、处理chunk、解码等处理,让请求变得人类可读,并显示在用户前端,用户可以对请求做查看、修改或重放。
重放时,会对用户构造的HTTP请求数据包做修复,保证请求包的有效性。Yak引擎手动实现了HTTP库,所以用户可以自定义畸形的请求包、响应包,应用于一些特殊场景下的漏洞利用。
MITM操作台可百分百替代 BurpSuite,下载并安装证书、劫持请求、响应、编辑劫持到的数据包等。
并且提供一整套顺畅的工作流,劫持 => History => Repeater / Intruder,劫持到的数据,在History可以查看历史数据,选择需要“挖掘”的数据包,发送到 WebFuzzer 进行 Repeater / Intruder 操作。
除了这些典型的操作场景外,MITM 还提供了插件被动扫描、热加载、数据包替换、标记等更灵活的功能。
11.3 免配置模式
使用免配置模式。不需要任何其他配置,只需安装Chrome 浏览器,免配置启动之后将打开一个新的浏览器会话,其中所有流量都将通过 Yakit 自动代理。无需安装 Yakit 的 CA 证书就可以使用它来通过 HTTPS 进行测试。
点击渗透测试
–MITM交互式劫持
即可进入MITM劫持页面,点击免配置启动
进入免配置启动设置界面。
配置代理处默认为:http://127.0.0.1:8083 默认配置代理无需修改,点击启动免配置Chrome
默认启动谷歌浏览器,即开始劫持抓包,点击图中④的免配置启动
即可关闭代理。
11.4 安装证书启动MITM劫持
使用、选择的外部浏览器。由于各种原因,可能不想使用免配置的代理的浏览器。在这种情况下,需要执行一些其他步骤来配置浏览器以与 Yakit的 MITM 一起使用,并在浏览器中安装 Yakit 的 CA 证书。
HTTPS协议是一种安全的HTTP协议,通过SSL/TLS协议来实现通信的加密和身份验证,可以有效地防止MITM攻击。
然而,虽然HTTPS协议可以保证通信的安全性,但在使用代理服务器等中间设备时,也会存在MITM攻击的风险。
这是因为代理服务器需要对HTTPS连接进行解密和再加密,从而中断原本的端到端加密,攻击者就有可能利用这个中断点进行MITM攻击。
为了解决这个问题,HTTPS协议中引入了一种称为证书锁定(Certificate Pinning)的机制。通过证书锁定,客户端可以预先保存目标服务器的SSL证书信息,并在与服务器通信时,检查服务器返回的证书是否与预期一致,从而避免代理服务器进行恶意的证书篡改和中间人攻击。
因此,为了实现中间人的角色,代理服务器需要自己生成一个SSL证书,并将其安装在客户端上,让客户端相信这个证书是有效的。
这个证书需要被客户端所信任,否则客户端会出现警告提示,这就需要在客户端上安装代理服务器生成的证书并进行信任设置。
因此基于HTTPS协议这些特性,我们在使用代理时,需要安装Yakit CA 证书,才能拦截HTTPS的消息。
11.4.1 CA证书的安装
关于证书的安装(以windows为例),主要有以下步骤:
首先,需要我们根据图中所示配置好代理的监听端口和浏览器的代理服务器设置,然后点击③
高级配置
并下载证书。*注:关于浏览器的代理服务器设置的详细内容将在下一章节(代理和浏览器配置)中进行介绍。*
点击下图所示的
证书下载
,或者在设置代理后访问:http://download-mitm-cert.yaklang.io 进行下载,另存为到本地目录。
- 修改下载证书的后缀,去掉“.pem”,双击进行安装,证书存储选择 ‘受信任的根证书颁发机构’
CRT和PEM是两种常见的数字证书格式,用于加密和验证通信过程中的数据安全。
CRT是一个X.509证书文件格式,PEM是一种可打印的证书文件格式,可以包含多种类型的加密和公钥证书。PEM格式通常使用base64编码,并且以“—–BEGIN CERTIFICATE—–”和“—–END CERTIFICATE—–”之间的文本块包含证书数据。PEM格式还可以用于存储密钥、证书请求和其他类型的加密数据。CRT格式是一种二进制格式,包含用于验证数字证书有效性的公钥、证书持有者的信息以及证书签名。CRT格式通常用于安装数字证书到Web服务器或其他应用程序中。在实践中,PEM格式比CRT格式更为常见,因为PEM格式的文件可以轻松地通过文本编辑器进行查看和编辑,并且PEM格式也可以包含多种类型的加密和公钥证书。不过,在某些情况下,例如在安装数字证书到Web服务器上时,CRT格式可能更为方便。
至此,我们已经完成Yakit-MITM证书的安装,在Yakit中可以对HTTPS请求进行抓包。
11.4.2 CA证书的卸载
- 第一种方式:以谷歌浏览器为例:打开谷歌浏览器→打开右上角更多选项卡→
设置
→隐私设置和安全性
→管理设备证书
→受信任的根证书颁发机构
选择证书然后点击删除
- 第二种方式:第二种删除方式,主要是为了解决在第一种方式的基础上删除按钮失效或者证书列表中其他的证书误删除的方法。
- 打开cmd→输入mmc→点击
文件
菜单,选择添加/删除管理单元
→如下图找到证书
,点击添加
- 在弹出的对话框中默认选中
我当前的用户
,点击完成
,结束后,会在控制台跟节点
下多了一个证书-当前用户
的节点,打开Yakit CA证书所在的位置,选择删除即可
11.5 代理和浏览器设置
Yakit MITM模块以拦截代理的方式截获所有通过代理的网络流量,包括客户端的请求数据和服务器端的响应信息。主要拦截http和https协议的流量,并通过中间人方式,对客户端请求和服务端响应进行处理,以实现安全评估测试的目的。
在日常工作中,我们最常使用的是web浏览器作为web客户端。通过设置代理,我们可以截取web浏览器的流量,并对流经Yakit代理的数据进行处理。这种方式可以模拟各种攻击场景,帮助测试人员发现应用程序中的安全漏洞。
下面我们就介绍下在常用浏览器Firefox和Google Chrome下是如何配置Yakit的代理。
11.5.1 Google Chrome代理设置
Google Chrome使用Yakit作为代理服务器的配置步骤如下:
- 启动Yakit 打开 MITM 交互劫持,配置代理地址和端口 127.0.0.1:8083,点击劫持启动,确保劫持处于开启状态。
在Chrome浏览器中,点击浏览器右上角的三个点按钮,选择“设置”选项。
在“设置”页面中,向下滚动到底部,找到“系统”选项,点击“打开代理设置”按钮
在“代理”选项卡中,打开
手动设置代理服务器
下的使用代理服务器
,在“地址”和“端口”文本框中输入前面设置的Yakit MITM 的代理服务器的IP地址和端口号(127.0.0.1:8083)点击
保存
按钮保存设置并关闭所有窗口。
11.5.2 FireFox设置
与Google Chrome 的设置类似,在FireFox中,我们也要进行代理的设置,才能将FireFox浏览器的通信流量,通过 Yakit 的代理进行传输。详细的步骤如下:
- 启动Yakit 打开 MITM 交互劫持,配置代理地址和端口 127.0.0.1:8083,点击劫持启动,确保劫持处于开启状态。
- 下载最新版Firefox浏览器,打开浏览器,点击右上角的菜单按钮(三条横线),选择
设置
选项。 - 左侧菜单中选择
常规
,然后下拉至最底部的网络设置
,点击设置
- 在
连接设置
对话框中,选择手动代理配置
选项,在HTTP代理
文本框中输入 Yakit 代理服务器的IP地址和端口号(默认为127.0.0.1:8083)
- 勾选
也将此代理用于 HTTPS
复选框,点击确定,设置完成。
以上就是代理和浏览器设置的所有内容。当然,浏览器中,可以添加一些扩展组件,对代理服务器进行管理。如Proxy Swither、Proxy SwitchyOmega等等都是很好用的插件。
除此之外,Yakit还提供了系统代理,系统代理能帮助用户自动代理系统所有请求全局抓包。系统代理打开的具体位置在劫持界面的右上角。点击启用后即可开始全局抓包,显示“已启用”表示启用成功,系统所有请求数据包均可抓取。此功能常用来抓取微信小程序、钉钉等应用的数据包。【但是在v1.3.8-1220没有找到系统代理功能,多了一个下游代理配置,目测是用来设置多层代理的。】
11.6 开始劫持
我们已经配置好了开始劫持前的准备工作。
在开始劫持前我们先对整个劫持页面进行熟悉:
- 设置代理监听主机,远程模式可以修改为0.0.0.0以监听主机所有网卡。
- 设置代理监听端口,设置一个不被占用的端口。
- 开启该选项将支持 HTTP/2.0 劫持,关闭后自动降级为HTTP1.1,开启后 HTTP2 协商失败也会自动降级。
- 根据填写的正则规则,对符合规则的数据包进行染色、标记、替换、打tag等操作,方便用户快速筛选出目标数据包。Yakit目前提供55条默认规则,点击
默认配置
导入即可使用。 - 开启启用插件则表示,进入劫持页面就会加载在侧边栏 ⑥ 当中选择的插件以及编写插件时设置了默认启动的插件。
- 插件商店当中的”MITM插件” 和 “端口扫描插件”类型的插件。
- 插件分组:将插件按照自己的使用习惯进行分组,便于在使用插件时快速勾选自己需要的插件。插件组在整个Yakit里是共用的,只要有加载插件的地方就使用插件分组。
- 根据关键字或者tag快速搜索所需插件。
- 下拉显示已创建过的分组,并进行分组选择。
- 高级配置:
为劫持再设置一个代理,通常用于访问中国大陆无法访问的网站或访问特殊网络/内网,也可用于接入xray等被动扫描。
客户端TLS:导入TSL证书,用于 mTLS(Mutual TLS)开启客户端验证的 HTTPS 网站抓包。
过滤器:通过配置过滤条件,来控制只抓/不抓哪些数据包,也可以理解为劫持的“黑白名单”。
下载Yakit证书。
点击劫持启动
后进入到劫持界面:选择丢弃请求
,则该条数据不会出现在history,提交数据
则会将该数据包记录在history 并开始劫持下一个数据包。
- 在劫持页面的左上角的①单选框选择
手动劫持
,打开浏览器,输入你需要访问的URL(以https://baidu.com/ 为例)并回车,这时你将会看到数据流量经过 Yakit 并暂停,您可以查看或修改数据包。选择自动放行
则会放行所有的数据包,被动日志
则为劫持模块、插件加载、被动扫描的执行日志。 - 选择
手动劫持
劫持到请求以后,点击右边②丢弃请求
则该条数据将会丢失,不在继续处理且不会出现在history
中,③提交数据
则会将该数据包继续传输下去并记录在history
并开始劫持下一个数据包。 - 劫持到请求以后,在右边单选框④
劫持响应
处选择当前请求,则会劫持到当前请求包对应的响应数据包。选择”所有”则会劫持所有请求的响应数据包。 - 在整个数据包展示处,我们可以看到HTTP请求的数据进行手工的修改,数据主要包含了:请求地址、http协议版本、主机头、浏览器信息、Accept可接受的内容类型、字符集、编码方式、cookie等,点击鼠标右键可以对数据包进行更多的操作:
- 劫持到的所有的数据包都会存入到
history
中,劫持后可以在history
查看感兴趣的数据包。
11.7 标记/替换流量
在日常的工作中,我们需要对测试的目标网站进行流量分析;当然除了在分析流量之外,我们经常需要涉及一些操作,以实现对流量的修改。
作为一个合格的工程师,任何时候掌握对流量的完全控制权其实是非常重要的基本技能。
该功能主要是替换数据包中符合规则的内容,比如替换数据包中自己的敏感信息,对数据包进行颜色标记或者打上标签,方便对数据包进行分类,或快速找出自己感兴趣的数据包。
11.7.1 导入/导出规则
在启动 MITM 之前,我们就可以配置这些规则,当然,我们也可以在 MITM 劫持过程中动态修改。
在开始劫持页面的内容规则选项我们可以看到 ①默认配置
② 导入配置
③导出配置
三个与内容规则相关的操作选项。
我们点击默认配置选项。在弹出的对话框中,点击 ①使用默认配置
,导入JSON以后,点击 ②导入
即可看到成功导入官方默认的55条规则内容,如果想使用其他规则,只需将JSON文件复制进来,点击导入即可。
注意,全部替换
是本地导入的规则是否需要覆盖之前导入的规则,如果是新增规则请将全部替换关闭,如果是想进行覆盖,则可开启全部替换。
点击内容规则旁边的小齿轮,即可查看官方默认规则内容,官方规则如图所示:
点击右上角的导出配置
,可以将规则导出为JSON文件,可将文件进行分享给他人使用。
11.7.2 新建/编辑规则
在劫持页面点击右上角规则配置
可以查看已有规则
编写规则的部分采用 Golang 风格正则表达式:推荐使用 https://regex101.com/ 调试,规则如果编译失败,则自动降级为关键字匹配。
已有的规则可以进行编辑操作,或者新增规则,编辑或新增以后点击添加该规则
或 修改
进行保存。
11.7.3 标记替换流量案例
标记替换文本
在规则内容页点击右上角新增规则
,然后对每个选项进行配置。
非常简单的配置就可以实现 “百度一下” 变为 YAK一下!
细节说明
- 这些规则是 针对代理全流量的,不光会对用户在 History 看到的过滤后的请求生效,对一些已经被过滤掉的 JS 或者静态文件都是生效的,编写简单规则务必明确场景
- 规则的执行顺序是有意义的
- 规则基于 Golang 风格正则/Glob/关键字, 采取降级策略:即如果无法编译为正则,将会最后被降级为 “关键字” 匹配。
- 替换后的数据包将会被自动修复,用户不需担心数据包毁坏协议。
11.8 History
所有流经 Yakit 的请求,都会在 History 中记录下来,我们可以通过该页面,查看传输的数据内容,对数据进行测试和验证。同时,对于拦截到的历史请求,都可以基于 web fuzzer进行进一步的测试,也可以对数据包进行插件的扫描等等的操作。
- 勾选或全选数据请求,勾选请求后可以到 ②批量操作进行批量的操作。
- 批量操作,具体内容如图所示。
- 筛选框,可以根据对协议类型、响应类型、Tags 单独或组合进行按条件筛选。
- 指定单独的某条数据包,单击右键后即可对该条数据进行操作,具体可操作内容如图所示。
- HTTP history 内容筛选器,
MITM
: MITM交互劫持的所有流量,插件
:使用任何插件都会在插件-history留下请求记录。爬虫
:之前章节学习的基础工具中的基础爬虫发出的所有请求都会记录在爬虫–history。 - 点击
fuzz
该条数据会被发送至 web fuzzer模块。 - 该数据包中涉及的域名都会被提取出来。
- 根据关键字搜索某条数据包。
- 清空所有数据。
History中的所有数据包,均支持对数据包进行单个操作,或者批量操作,具体操作可分为:
- 选择数据包进行漏洞扫描
- 复制为POC模板(CSRF POPOC/yak POC/Portscan POC)
- 标记颜色
- 数据包作为数据对比
- 屏蔽删除
- 下载 Response body
其次选择单个数据包也可以对数据包进行编解码,修改请求类型等操作。
History的消息列表中主要包含请求序列号、请求协议和主机名、请求的方式、服务器端返回的HTTP状态码、URL路径、网站title、网站ip、请求长度、大小、等信息。
通过这些信息,我们可以对一次客户端与服务器端交互的HTTP消息详情做出准确的分析,同时,在最左边的操作栏,点击浏览器图标可以在浏览器中打开该请求对应的url,点击箭头图标即可查看该请求详细的内容。
11.9 过滤流量
在专家模式 MITM 交互劫持时会产生大量的日志记录,为了更友好的管理,Yakit提供了筛选过滤器功能。针对某些数据包我们不需要看见,或者屏蔽某些污染数据就可以输入需要过滤的条件,劫持时则不会劫持符合条件的数据包。
在劫持页面点击过滤器
,将弹出筛选过滤器界面。
按照过滤条件的不同,过滤器划分出5个子选项,分别是:
- 按照Hostname过滤 你可以在
包含Hostname
输入想要仅显示的hostname,来筛选只想要看到的相关Hostname的请求。也可以在排除Hostname
中输入不想要看到的Hostname进行排除。 - 按照URL路径过滤 你可以在
包含URL路径
输入想要URL路径来匹配相关的请求,也可以在排除URL路径
中输入不想要展示的URL来过滤不想要看到的请求。 - 按照文件类型过滤 通过文件类型在过滤消息列表,这里有两个选择可供操作。一是仅仅显示哪些,另一个是不显示哪些。如果是仅仅显示哪些,在包含文件后缀的输入框中填写显示的文件类型,同样,如果不显示哪些文件类型,只要在
排除文件后缀
的输入框中填写不需要显示的文件类型即可。 - 按照Content-Type过滤 此过滤器的功能是指,根据HTTP请求头的Content-Type来排除不想要展示的相关数据包。
- 按照HTTP 方法过滤 此过滤器可根据HTTP请求方法进行的排除来达到过滤的目的。
以上过滤条件可单选,也可多选组合来进行过滤流量。
11.10 网站树视角
网站树将历史请求以树结构的形式进行展示,选中域名,可查看该域名对应的数据信息与详情。下图所示网站树为一次测试中,通过浏览器浏览的历史记录在网站树视角页面中的展现结果。
从图中我们可以看出,整个页面的的左侧为访问的URL,按照网站的层级和深度,树形展示整个应用系统的结构和关联其他域的url情况;
右边显示的是某一个url被访问的明细列表,共访问哪些url,请求和应答内容分别是什么,都有着详实的记录。
基于左边的树形结构,我们可以选择某个分支,对指定的路径进行端口扫描、爆破和漏洞检测。
十二、Web Fuzzer
12.1 重放
在日常工作中可以使用 Web Fuzzer进行请求与响应的消息验证分析,比如修改请求参数,验证输入的漏洞;修改请求参数,验证逻辑越权;从拦截历史记录中,捕获特征性的请求消息进行请求重放。
Web Fuzzer 界面如图所示:
在左上角,有一个发送请求
按钮,当我们对请求的消息编辑完之后,点击此按钮即发送请求给服务器端。
响应消息区为对应的请求消息点击发送请求
按钮后,服务器端的反馈消息。通过修改请求消息的参数来比对分析每次应答消息之间的差异,能更好的帮助我们分析系统可能存在的漏洞。
- 简单案例. 请求其他网站
假如我们需要将请求发送到其他网站,我们可以直接修改Host
请求头,然后点击发送数据包
按钮即可。yaklang会自动识别Host
请求头中的域名并将请求发送到对应的服务器。
12.2 爆破
12.2.1 概述
使用过Burp Suite的都知道,它有一个Intruder模块,它的核心其实并不是某一个功能,而是一整套的操作流:
- 劫持数据包
- 发送到Intruder
- 清除占位符,添加新的占位符
- 为占位符设置一个值序列,如字典,多行字符串,一串数字等
- 设置爆破模式,开始爆破
后面几步是很繁琐的,很多时候大家花了大功夫的时间在设置上。
Yakit 使用了一种全新的方法,可以直接在Web fuzzer模块中完成重放与爆破两种工作,更轻松地实现批量发包模糊测试。
12.2.2 模糊测试标签
首先,介绍模糊测试标签(fuzztag)。
fuzztag是一种小型语法结构,它大概长这个样子:{{tagname(tagvalue)}}
,例如{{randint(1,100)}}
生成1-100随机整数。
fuzztag还有许多变体,例如它可以嵌套调用:{{base64(randint(100))}}
生成base64编码后的1-100随机整数。
想要了解fuzztag可用标签和使用样例的同学可以查看这篇文章:Fuzz Tag Playbook。
12.2.3 使用模糊测试标签进行爆破
1)直接输入fuzztag
在我们了解了fuzztag之后,我们就可以开始使用它来进行爆破了。使用fuzztag最直接的方式是直接在Web fuzzer模块中输入,例如我们爆破数字1-10,只需要简单地在想爆破的位置输入{{int(1-10)}}
即可:
可以看到当Web Fuzzer发送了不止一个数据包时,Response自动转换为列表形式展示,当我们点击Response列表中的某一项时,会在右下角显示这次请求的响应,可以看到fuzztag已经被替换为实际的值(这里为10),另外我们也可以通过点击轻松地切换查看请求与响应。
2)右键插入fuzztag
与之相对的,Web Fuzzer也提供了更简单的方式来插入fuzztag,我们只需要在Web Fuzzer中右键选择插入标签/字典即可:
这是yakit最近新增的功能,当你在Web Fuzzer中鼠标点选了某个位置时,会弹出一个插入标签的悬浮框,在这个悬浮框中你可以选择插入一些常见的fuzztag。
3)插入空字节标签:hexd(00)
hexd(00)
将在所在位置插入一个空字节,可以用于测试空字节截断漏洞。这实际上也体现了fuzztag的另外一个好处,我们不需要Burp Suite的十六进制编辑器,也可以轻松地插入十六进制数据。
4)插入临时字典
这个功能将用户输入的内容存储到临时文件中,并插入为fuzztag,他有两个模式,一个是插入整个文本内容,另外一个则是按文件内容的每一行插入(例如用户输入了5行字符串,则会发送5个请求)。
5)插入模糊测试字典标签
这个功能实际上是与yakit中的另外一个模块:payload的联动。当你再payload中导入了字典后,你可以使用这个功能点击闪电按钮将字典中的内容按行插入为fuzztag。
6)插入热加载标签
热加载的使用门槛较高。
7)插入文件标签
这个功能与插入临时字典类似,一共有三个模式,第一个是插入整个文本内容,第二个是按文件内容的每一行插入,第三个则是按文件夹下的每一个文件插入(例如该文件夹下一共有5个文件,则会发送5个请求)。
12.2.4 爆破模式
Burp Suite中存在四种爆破模式:Sniper,Battering ram,Pitchfork,Cluster bomb。
1、Sinper(狙击手)
sinper使用一个字典,主要是将标记的数据进行逐个遍历替换
爆破次数=标记字段数*字典字段数量2、Battering ram(攻城槌)
Battering ram使用一个字典,将包内所有标记的数据进行同时替换再发出
爆破次数=字典字段数量
3、Pitchfork(干草叉)
Pitchfork对每个标记字段单独设置字典,按照一一对应的关系取最少的组合
爆破次数=最少的字段字段数
4、Cluster bomb(集束炸弹)
Cluster bomb使用穷举法,对每个标记字段都遍历字典
标记三处,第一处字典3个,第二处字典2个,第三处字典3个,爆破次数:3*2*3
但实际上我们真的需要爆破模式吗?它是不可替代的吗?
我们先来剖析一下这四个爆破模式的本质:
- Sniper:单个参数爆破,如果此模式下存在多个占位符,则只同时爆破一个占位符,其他占位符保持不变,例如:
{"key": "§value§", "key2": "§value2§"}
,此时爆破时会先爆破value,而§value2§
则保持不变,发送的包为:{"key": "爆破值", "key2": "value2"}
- Battering ram:多个参数同时使用一个字典爆破,例如:
{"key": "§value§", "key2": "§value2§"}
,此时爆破时会先同时爆破value和value2,发送的包为:{"key": "爆破值", "key2": "爆破值"}
- Pitchfork:多个参数同时爆破,使用不同字典,字典间一一对应,行数不一致时则取最小值。例如:
{"key": "§value§", "key2": "§value2§"}
,使用的第一个字典为1,2
,第二个字典为3,4
,则发送的包为:{"key": "1", "key2": "3"}
,{"key": "2", "key2": "4"}
- Cluster bomb:多个参数同时爆破,使用不同字典,字典间做笛卡尔乘积模式。例如:
{"key": "§value§", "key2": "§value2§"}
,使用的第一个字典为1,2
,第二个字典为3,4
,则发送的包为:{"key": "1", "key2": "3"}
,{"key": "1", "key2": "4"}
,{"key": "2", "key2": "3"}
,{"key": "2", "key2": "4"}
根据上述的分析,我们可以看到爆破模式实际上主要服务于多个参数爆破且使用不同字典的情况,我们有没有更好的方式来替代爆破模式呢?答案是肯定的,我们依然可以使用fuzztag来实现。
- 集束炸弹模式
首先我们来看看多参数的情况下fuzztag的默认表现,实际上他是类似于Cluster bomb爆破模式:
可以看到一共发送了4个包,和Cluster bomb爆破模式一致。
- 攻城槌模式
那么我们要如何使用fuzztag来实现Battering ram爆破模式呢?我们只需要在每个参数的位置插入相同的fuzztag即可:
但是本质上仍然是集束炸弹模式。这里我觉得官方文档解释有错误。实际上应该是借助分组的方式来实现,像下面这样。
- 干草叉模式
我们再来看看如何使用fuzztag实现Pitchfork爆破模式,这时候需要学习fuzztag的一个小小的新语法。我们知道fuzztag它大概长这个样子:{{tagname(tagvalue)}}
,但实际上我们可以给他分组,就像这个样子:{{tagname::1(tagvalue)}}
。
两个冒号后面的数字表示分组,分组的意思是:同一个分组的fuzztag会被替换为同一个 Index 的值。例如我们想要实现Pitchfork爆破模式,我们只需要在每个参数的位置插入fuzztag,并且在每个fuzztag后面加上相同的分组标识即可:
我们可以发现Burp suite的爆破模式并不是必须的,我们可以通过fuzztag加分组的方式来实现更加灵活的爆破模式。
12.3 高级配置
爆破时使用代理,或者我们需要在爆破时使用国密TLS等场景,这时候我们就需要对Web Fuzzer进行一些高级配置了。
12.3.1 强制HTTPS
开启强制HTTPS选项,可以使得这次请求强制使用HTTPS协议而非HTTP协议进行通信,这在某些网站要求强制使用HTTPS时非常有用。
12.3.2 国密TLS
开启国密TLS选项,可以使得这次请求使用国密TLS协议进行通信,可以在某些网站要求使用国密TLS进行通信时使用。
12.3.3 真实Host
我们知道,Web Fuzzer在默认情况下会从请求包中提取Host请求头来作为我们要通信目标,但是有时候我们需要手动指定Host请求头,这时候我们就可以填写真实Host,这样Web Fuzzer就会使用我们手动指定的真实Host来进行通信,这在Host碰撞的场景下非常有用。
12.3.4 设置代理
默认情况下,Web Fuzzer会走系统代理来进行发包。但是有时候我们需要手动指定代理,这时候我们就可以填写设置代理,这样Web Fuzzer就会使用我们手动指定的代理来进行通信,这在访问内网服务的场景下非常有用。在指定多个代理的情况下,Web Fuzzer会智能找到可用的代理进行请求。
12.3.5 禁用系统代理
默认情况下,Web Fuzzer会走系统代理来进行发包。但是有时候我们不想使用系统代理,或者说这次发包不应该走系统代理,这时候我们就可以开启禁用系统代理选项。
12.3.6 响应数量限制
响应数量限制用于限制页面中最多渲染多少个请求响应,这个限制是由于请求响应过多时可能会对前端渲染造成一定的压力,所以需要对其进行限制。限制后如果想要查看所有响应,可以点击查看全部按钮:
12.3.7 响应体长度限制
响应体长度限制用于限制页面中最多渲染的最长响应长度,这个限制是由于响应过大时可能会对前端渲染造成一定的压力,所以需要对其进行限制。当响应长度超过限制时,Web Fuzzer 会自动截断响应体,并显示超大响应,如果想要查看完整响应,可以点击完整响应按钮,在本地查看:
12.4 请求包配置
12.4.1 Fuzztag 辅助
这也是一个用于辅助我们构造 Fuzztag 的工具。我们可以选择一些基础fuzztag,然后对他进行修改,查看生成后的 payload ,并且还可以将其添加到插入标签悬浮框的常用标签中。
12.4.2 渲染 Fuzz
默认情况下,渲染 Fuzz选项是打开并选中标准模式的。 三个模式的区别如下:
- 关闭:关闭该选项之后,所有的 Fuzztag 就会失效。这在我们不需要Fuzz标签而且与某些模板引擎语法冲突的情况下非常有用。
- 标准:标准模式下,Web Fuzzer 会对请求包中的Fuzz标签进行渲染,每个 Fuzztag 必须严格符合
{{tagname1({{tagname2(param)}})}}
的格式。 - 兼容:兼容模式下,Web Fuzzer 会对请求包中的Fuzz标签进行渲染,在嵌套fuzztag的情况下,我们可以省略多余的花括号,例如:
{{tagname1(tagname2(param))}}
。
12.4.3 不修复长度
默认情况下,Web Fuzzer会对请求包进行一些修复,其中也会对Content-Length
请求头进行修复。我们知道,在数据包完全正确的情况下,Content-Length
请求头的值应该等于请求体的长度,但是一般情况下我们修改了请求体之后不可能手动去计算Content-Length
的值,这时候Web Fuzzer就会自动修复Content-Length
的值。但是有时候我们可能遇到HTTP走私的情况或者不希望Web Fuzzer修复长度,这时候我们就可以开启不修复长度选项。
12.4.4 超时时长
即每个请求的超时时间,单位为秒。在请求超时时,Web Fuzzer会自动返回并提示请求超时的错误。
12.4.5 批量目标
批量目标在你要对多个目标进行测试时非常有用。我们可以通过手动输入或者上传文件的方式来指定多个目标,这些目标之间用英文逗号或换行符分隔:
12.5 并发配置
12.5.1 重复发包
重复发包一般用于测试条件竞争或者大并发的情况。填写重复发包的值(后续称之为n)后,Web Fuzzer会重复发包n次。这实际上也是通过添加了fuzztag标签实现的,其等价于在请求包的任意位置添加{{repeat(n)}}
。
12.5.2 并发线程
在我们设置了fuzztag后,我们可能会发送不止一个数据包,此时我们可以通过填写并发线程的值控制用于并发的线程数量。这在我们需要进行快速并发测试或者请求网站的防火墙对访问速度有限制时非常有用。
12.5.3 随机延迟
在我们并发请求网站的场景下,请求网站的防火墙可能会对访问速度有限制,此时我们可以通过设置随机延迟的Min和Max值,这样可以在每次请求之前延迟随机的时间(Min-Max秒),这可以在一定程度上通过请求网站的防火墙。
12.6 重试配置
12.6.1 重试次数
在网络请求中,我们不可避免会遇到许多网络连通性的问题,比如服务器负载过高导致服务端错误(502状态码)或者网络波动导致请求失败,此时我们可以通过设置重试次数的值来控制Web Fuzzer重试的次数,这可以在一定程度上提高请求的稳定性。
12.6.2 重试条件
重试条件配合重试次数使用。我们可以通过填写重试条件中状态码的值,设置其在响应什么状态码时进行重试。例如我们填写了502,503
,则当响应状态码为502或者503时,Web Fuzzer会进行重试。
12.6.3 不重试条件
不重试条件配合重试次数使用。我们可以通过填写不重试条件中状态码的值,设置其在响应什么状态码时不进行重试。例如我们填写了200,302
,则当响应状态码为200或者302时,Web Fuzzer不会进行重试。
无论如何,Web Fuzzer不会对30x的响应状态码进行重试。
12.7 重定向配置
12.7.1 禁用重定向
开启禁用重定向选项可以禁用请求时的自动重定向。这在我们需要测试重定向漏洞时非常有用。
12.7.2 重定向次数
重定向次数的值只有在关闭禁用重定向选项时生效。它表示的是在请求时最多允许重定向多少次。
12.7.3 JS重定向
我们知道js一般通过调用window.location.href
或者window.location.replace
来进行页面的重定向。一般情况下这种重定向是无法跟踪的,这时候我们就需要开启JS重定向选项,来跟踪这种重定向。
12.8 DNS配置
12.8.1 DNS服务器配置
DNS服务器用于指定本次请求使用的DNS服务器。在默认情况下,Web Fuzzer会使用系统的DNS服务器,但是有时候我们需要手动指定DNS服务器,这时候我们就可以填写DNS服务器的值,这在访问一些内网服务时非常有用。
12.8.2 Hosts配置
Hosts配置可以直接添加host到ip的映射。这在指定的dns服务器都无法正常工作的情况下非常有用。
12.9 WebFuzzer序列
12.9.1 相关高级配置
1)匹配器
- 基本了解
一共有三种匹配模式:丢弃,保留,仅匹配。这三个模式很好理解:
- 丢弃:丢弃模式会在符合匹配器时下丢弃返回包。
- 保留:保留模式会在符合匹配器时保留返回包,剩余的返回包则直接丢弃。
- 仅匹配:仅匹配模式会在符合匹配器时将对应的返回包染色,而不做其他操作。
在匹配模式的旁边,有一个红色的圈,这里实际上是颜色按钮,用于设置在仅匹配模式下的染色颜色。
再往右看,有两个二选一按钮:AND和OR。这两个按钮用于设置多个数据提取器的匹配逻辑,AND表示所有匹配器的条件都需要匹配,OR表示只需要有其中一个条件匹配即可。
- 添加方法
我们点击下方的添加按钮或者上图中右上角的添加/调试按钮,就可以添加匹配器了。
- 使用方法
匹配器给我们提供了多种匹配类型与匹配位置,方便我们编写复杂的匹配器。
匹配类型:
- 关键字:关键字就是在匹配位置中匹配输入的关键字。
- 正则表达式:正则表达式就是在匹配位置中匹配输入的正则表达式。
- 状态码:(忽略匹配位置)状态码就是匹配响应的状态码,我们只需要填写希望匹配到的状态码即可。
- 十六进制:在某些情况下,希望匹配的字符串不是正常可见的ascii码,这时候你就可以使用十六进制这种匹配类型,输入十六进制字符串(例如字符串”302”对应十六进制字符串”333032”)。
- 表达式:(忽略匹配位置)表达式可以更加灵活地编写我们所希望的匹配规则,它还能与后续要讲的 高级配置:变量 联动。表达式的语法与nuclei-dsl语法兼容,熟悉nuclei工具的师傅可以尝试在表达式中编写一些复杂的匹配规则。一个匹配响应体中是否存在对应字符串的例子如下:
contains(body,'302 Found')
。
匹配位置:(以下面这个响应包为例)
HTTP/1.1 302 Found
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Location: https://www.baidu.com/
Content-Length: 154
<html><body>302 Found</body></html>
- 状态码:匹配范围仅有状态码。
- 响应头:匹配范围包含响应的第一行(在例子是
HTTP/1.1 302 Found
)以及响应头。 - 响应体:匹配范围包含响应正文(在例子里是
<html><body>302 Found</body></html>
)。 - 全部响应:匹配范围即整个响应包。
另外匹配器还包含**不匹配(取反)**这个选项,其意思是将匹配改为不匹配,这方便我们编写更复杂的匹配器。
2)数据提取器
数据提取器的功能是将响应包中的某些数据提取出来。
- 添加数据提取器
点击添加按钮即可
数据提取器同样给我们提供了多种提取类型与提取位置,方便我们编写复杂的数据提取器。我们可以看到在数据提取器的左上角(data_0)旁边存在一个编写按钮,这是用于修改提取器的名字,这个名字可以在后续变量和Web Fuzzer序列中使用。
- 提取类型
- 正则表达式:正则表达式就是在提取位置中提取输入的正则表达式匹配到的内容。我们知道在正则表达式中可以使用小括号来分组,这时候我们可以在匹配正则分组中选择分组,这样就可以提取到想要的内容了。(在正则表达式中,0分组即为正则表达式匹配到的所有内容)
- XPath:(提取范围只能是响应体)XPath就是在提取位置中提取输入的XPath匹配到的内容。XPath是一种用于在XML文档中选择节点的语言,我们也可以很轻易地使用浏览器开发工具来复制完整的Xpath。
- 键值对:键值对的提取规则稍微有点复杂。键值对会尝试提取所有可能存在的json的key对应的value,以及所有形似
key=value
中value的值。如果提取位置包含响应头(提取范围为响应头或Raw),则他还会尝试提取响应头中的value值。另外还有两个特殊的键值对,分别为proto
,status_code
,分别对应响应的HTTP协议版本和响应状态码。 - JQ(*):(提取范围只能是响应体)jq是一种用于在JSON文档中选择节点的工具,其对应的文档教程在此。
- 表达式:(忽略匹配位置)表达式与上面匹配器中的表达式相同,这里不再赘述。
对于Xpath这种提取类型,我们以下面的例子做讲解:
在上述例子中,我们在最下面一行中填入xpath:/html/body/div[1]/p[2]/a
,此时如果点击调试执行,我们就可以拿到对应的a标签内容:More information...
。假如我们在上面的Xpath 参数中填入href
,我们就可以提取到a标签的href属性:
https://www.iana.org/domains/example
。
对于JQ这种提取类型,我们以下面的例子做讲解:
在上述例子中,我们可以看到响应体是一段json。假如我们想提取headers中Content-Type的值,我们只需要使用.headers.["Content-Type"]
即可。
3)变量
在上述数据提取器小节中,我们提到数据提取器的名字可以在变量中使用,实际上就相当于我们赋值了一个变量。同样地,我们也可以直接在变量这个地方上直接赋值变量。
在上图中,我们可以设置变量名和变量值,变量可以在后续变量,Web Fuzzer序列和当前Web Fuzzer中使用。我们可以通过使用fuzztag:{{params(变量名)}}
或{{p(变量名)}}
来使用变量。
变量同样存在三种模式:nuclei,fuzztag,raw。
- nuclei:nuclei模式下,其变量值实际上是nuclei的表达式,可以调用绝大部分nuclei-dsl中包含的函数。需要注意的是,当你引用其他变量时,其的值都是string类型,所以可能需要手动进行类型转换。一个简单的例子如下:
{{int(a)+3}}
。 - fuzztag:fuzzta模式下,其变量值实际上就是fuzztag,在值中使用fuzztag也会使得Web Fuzzer发送多个请求包。一个简单的例子如下:
{{int(1-2)}}
。 - raw:raw模式下,变量值相当于你输入的字符串,不会被解析。
4)GET 参数 / POST 参数 / Cookie / Header
这些配置放在一起讲解。设置了这些配置之后,Web Fuzzer会在发送请求包时添加对应的 GET 参数 / POST 参数 / Cookie / Header并且额外发送请求,每设置一个变量就会额外发送一次。
如果我们设置了 GET 参数变量:a=b
以及 Cookie: c=d
,当我们点击发送请求时,一共发送了3个请求包,这三个请求包分别是:
- 原始请求,没有应用任何参数变量。
- 应用了其中一个 GET 参数变量:
a=b
,额外发送了一个包含 GET 参数:a=b
的请求。 - 应用了其中一个 Cookie 变量:
c=d
,额外发送了一个包含 Cookie:c=d
的请求。
同理,假如我们额外设置了一个 GET 参数变量:e=f
,那么我们就会额外发送一个包含 GET 参数:e=f
的请求。
- 如果同一种参数设置了多个变量:如下
会发送三个请求包:
- GET /?a=b HTTP/1.1
- GET /?a=b&c=d HTTP/1.1
- GET / HTTP/1.1
12.9.2 Web Fuzzer序列基础
Web Fuzzer 序列就是将多个 Web Fuzzer 节点串联起来,实现更复杂的逻辑与功能。例如我们需要先进行登录,然后再进行其他操作,这时候我们就可以使用 Web Fuzzer 序列功能。
Web Fuzzer序列如图所示,在最左侧有一个Fuzzer 序列按钮:
当我们点击 Fuzzer 序列
按钮时,会将 WF-[1]
这个子标签页组成一个序列,变成如下所示:
随后我们可以在 Step [0]
这个节点中,添加 Web Fuzzer
的标签页WF-[1]
,这相当于序列中设置第一个节点的请求包为WF-[1]
。
我们还可以继续添加其他节点到序列中,只需要将其他标签页拖入序列中即可:
接着我们在 WF-[1]
中设置一个提取器规则,规则内容是提取键值为Node1
的值,声明为 get
变量。再设置一个变量 node1
,内容是我是节点1传来的值
:
然后我们在 WF-[2]
中设置WF-[1]
中声明的变量,假如此时我们直接发送请求,结果会为空,这是因为单独发送这一个请求,是没有WF-[1]
中声明的变量的:
最后我们使用 Fuzzer
序列功能尝试一下,在 WF-[1]
到WF-[2]
的中间,开启继承变量选项(默认开启),点击开始执行
按钮,等待请求结束后,我们查看WF-[2]
的响应,发现它已经成功使用了在WF-[1]
中设置的变量:
十三、标签使用经验积累
13.1 【文件头标签】
{{ico}}
{{tiff}}
{{gif}}
{{png}}
{{jpeg}}
yak内置了很强大的功能,我们可以通过指定文件头标签直接去生成我们需要的文件头来使用。
我们可以使用{{ico}}
来直接生成一个ico的文件头;可以使用{{tiff}}
来生成gif文件头;使用{{gif}}
来生成gif文件头;使用{{png}}
来生成PNG文件头;使用{{jpeg}}
来 生成jpeg/jpg文件头。
- 使用案例
origin := "randomStr: {{ico}}"res := fuzz.Strings(origin)println("需要模糊随机渲染的字符串为:", origin)println("渲染结果为:")dump(res)
origin := "randomStr: {{tiff}}"res := fuzz.Strings(origin)println("需要模糊随机渲染的字符串为:", origin)println("渲染结果为:")dump(res)
origin := "randomStr: {{gif}}"res := fuzz.Strings(origin)println("需要模糊随机渲染的字符串为:", origin)println("渲染结果为:")dump(res)
origin := "randomStr: {{png}}"res := fuzz.Strings(origin)println("需要模糊随机渲染的字符串为:", origin)println("渲染结果为:")dump(res)
origin := "randomStr: {{jpeg}}"res := fuzz.Strings(origin)println("需要模糊随机渲染的字符串为:", origin)println("渲染结果为:")dump(res)
- 输出的结果为:
需要模糊随机渲染的字符串为: randomStr: {{ico}}渲染结果为:([]string) (len=1 cap=1) { (string) (len=19) "randomStr: \x00\x00\x01\x00\x01\x00 "}需要模糊随机渲染的字符串为: randomStr: {{tiff}}渲染结果为:([]string) (len=2 cap=2) { (string) (len=13) "randomStr: MM", (string) (len=13) "randomStr: II"}需要模糊随机渲染的字符串为: randomStr: {{gif}}渲染结果为:([]string) (len=1 cap=1) { (string) (len=17) "randomStr: GIF89a"}需要模糊随机渲染的字符串为: randomStr: {{png}}渲染结果为:([]string) (len=1 cap=1) { (string) (len=44) "randomStr: \x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xce\x00\x00\x00\xce\b\x02\x00\x00\x00\xf9}\xaa\x93"}需要模糊随机渲染的字符串为: randomStr: {{jpeg}}渲染结果为:([]string) (len=2 cap=2) { (string) (len=23) "randomStr: \xff\xd8\xff\xe0\x00\x10JFIF\xff\xd9", (string) (len=23) "randomStr: \xff\xd8\xff\xe1\x00\x1cExif\xff\xd9"}