Yakit MITM进阶实战:从流量监听精准劫持到SRC漏洞挖掘
1. 项目概述:从“监听”到“操控”的质变
在渗透测试和红蓝对抗的实战中,MITM(中间人攻击)技术一直扮演着核心角色。它不仅仅是流量监听,更是我们深入理解目标应用逻辑、发现潜在漏洞、甚至直接构造攻击载荷的“手术刀”。上一期我们聊了Yakit中MITM的基础配置和被动监听,那感觉就像是在目标应用的通信管道旁装了一个高清摄像头,能看到所有进出的“车辆”(数据包),但只能看,不能动。今天要深入的这个“进阶模式”,则是要打开车门,检查甚至替换车里的“货物”(请求/响应内容),实现从“观察者”到“干预者”的质跃。对于SRC漏洞挖掘而言,这种主动干预能力至关重要,很多逻辑漏洞、越权问题、参数污染漏洞,都需要通过篡改请求来触发和验证。Yakit提供的这套MITM劫持工具链,将Burp Suite的Repeater、Intruder以及自定义脚本等分散功能,集成在一个更符合国人操作习惯的流式界面里,让我们能在实战中更高效地“卡点”测试。
2. 核心功能模块深度解析
2.1 热加载与匹配劫持:精准拦截的艺术
被动监听是海量抓包,而实战中我们需要的是精准打击。Yakit的“热加载”和“匹配劫持”功能,就是用来定义“在什么情况下出手”。
热加载机制:这是Yakit MITM的一个特色功能。它允许我们编写JavaScript代码,动态地决定是否拦截以及如何修改流量。这套代码在代理服务器运行时被加载和执行,无需重启代理服务。其核心是一个mirror.NewMITMFilter函数,我们需要在其中实现hijack方法。举个例子,如果我们只想拦截所有包含/api/user/路径的请求,并检查其Cookie,可以这样写:
mirror.NewMITMFilter((isHttps, url, req, rsp, body) => { // 判断URL是否包含目标路径 if (url.indexOf("/api/user/") !== -1) { // 打印请求的Cookie头,用于观察 console.log("拦截到用户API请求,Cookie:", req.Header["Cookie"]); // 返回true表示需要劫持此流量到Web Fuzzer进行进一步操作 return true; } // 其他流量放过,不拦截 return false; });这个功能的价值在于其动态性和逻辑判断能力。你可以基于域名、URL路径、请求方法、特定头部、甚至响应体的内容来编写复杂的拦截规则,实现高度定制化的攻击面聚焦。
匹配劫持规则:对于更简单、更直观的拦截需求,Yakit提供了图形化的规则配置。你可以在MITM劫持面板中,通过“添加规则”来设置。规则主要包含两部分:
- 匹配器:定义拦截条件。支持:
- 域名匹配:如
*.target.com匹配所有子域名。 - 路径匹配:如
/admin/*匹配所有管理后台路径。 - 关键词匹配:在URL、请求头或请求体中包含特定关键词。
- 正则表达式匹配:提供最灵活的匹配方式,如
.*\\.(php|asp|jsp)$匹配动态脚本文件。
- 域名匹配:如
- 动作:匹配成功后执行的操作。主要是“劫持”,即将匹配到的请求自动转发到“Web Fuzzer”模块,等待我们进行手动修改和重放。
实操心得:在SRC漏洞挖掘初期,我习惯先用宽泛的规则(如
*target.com*)进行一段时间的监听,分析流量特征。然后根据分析结果,编写精确的热加载脚本或配置匹配规则,例如专门拦截所有POST类型的登录、支付、权限修改接口。这能极大减少干扰流量,提升测试效率。
2.2 请求/响应劫持与修改:实战中的“手术刀”
流量被成功拦截并送入Web Fuzzer后,真正的“魔术”就开始了。这个界面是Yakit进行手动测试的核心。
请求区修改:这里展示了被拦截请求的所有细节。
- 原始视图:可以看到原始的HTTP请求报文,包括方法、路径、协议版本、头部和体。对于初学者理解HTTP协议很有帮助。
- 参数视图(推荐):Yakit会自动解析URL查询参数(Query)、POST表单参数(Body)、Cookie和JSON数据,并将其展示为结构化的键值对表格。这是最常用、最高效的修改视图。你可以直接双击某个参数的值进行修改,例如:
- 将用户ID
user_id=123改为user_id=456,测试越权访问。 - 将商品价格
amount=100改为amount=0.01,测试支付逻辑漏洞。 - 在JSON体中添加新的字段,测试参数污染。
- 将用户ID
- 数据包编辑:对于非标准格式或需要精细控制的修改,你可以切换到“数据包”标签,直接编辑原始的HTTP请求报文。这里需要注意保持格式正确,特别是
Content-Length头部需要与修改后的体长度一致,Yakit通常会自动处理。
响应区修改与渲染:这是进阶玩法。我们不仅可以修改发出的请求,还能修改服务器返回的响应。
- 劫持响应:在Web Fuzzer界面,勾选“劫持服务器响应”选项。当你发送一个修改后的请求后,服务器的原始响应会被拦截下来,显示在响应区。
- 修改响应:此时,你可以像修改请求一样修改响应内容。例如:
- 将一个登录失败的响应(如
{"code": 401})修改为成功的响应({"code": 200, "token": "fake_token"}),测试客户端是否仅依赖客户端状态判断。 - 在一个错误页面响应中插入恶意JavaScript代码,测试XSS漏洞的利用链。
- 修改重定向响应(302)的
Location头部,将其指向我们控制的钓鱼页面。
- 将一个登录失败的响应(如
- 渲染与调试:修改响应后,可以点击“渲染”按钮,Yakit会尝试将响应内容(如HTML)在内置的浏览器标签页中渲染出来,直观地看到修改后的页面效果。这对于测试存储型XSS、客户端模板注入等漏洞非常有用。
注意事项:修改响应是一个破坏性较强的测试方法,可能会影响客户端正常状态。在生产环境或重要的SRC测试中,务必在获得授权的前提下,在测试环境进行。同时,修改响应后,浏览器的后续请求可能会基于伪造的响应状态发出,需要清理浏览器缓存或使用无痕模式来避免状态污染。
2.3 历史记录与对比分析:你的测试“时光机”
在密集的测试过程中,可能会发送几十上百个变体请求。Yakit的“历史”功能就是你的测试日志。
- 自动记录:所有通过当前Web Fuzzer标签页发送的请求和接收的响应,都会按时间顺序保存在历史面板中。
- 快速回放与对比:双击历史记录中的任意一条,可以立即将当时的请求和响应加载回主编辑区。你可以方便地对比不同参数导致的不同响应。例如,测试一个短信轰炸漏洞时,你可以快速切换查看不同手机号、不同时间间隔的请求响应,找出触发频率限制的边界条件。
- 导出与分享:可以将历史记录导出为文件,用于编写报告或与团队协作分析。
3. 实战场景:SRC漏洞挖掘工作流
理论说得再多,不如一个实战案例来得直观。假设我们在对一个Web应用进行授权测试,目标是挖掘逻辑漏洞。
3.1 场景一:越权访问漏洞挖掘
- 信息收集与监听:首先配置好Yakit的MITM代理,让浏览器流量通过。正常使用账户A(普通用户)浏览网站。
- 设置拦截规则:在流量中,我们发现了一个访问用户详情的API:
GET /api/v1/user/profile?user_id=1001。我们怀疑这个user_id参数可能存在越权。于是,在Yakit的MITM劫持设置中,添加一条规则:URL路径匹配/api/v1/user/profile。 - 触发与劫持:用账户A再次访问个人中心,触发这个请求。Yakit会将其劫持到Web Fuzzer。
- 修改与测试:在Web Fuzzer的参数视图中,我们看到
user_id=1001(这是A自己的ID)。我们将其修改为user_id=1002(假设这是另一个用户B的ID),然后点击“发送”。 - 结果分析:
- 如果返回了用户B的详细信息(如邮箱、手机号),那么一个水平越权漏洞就存在了。
- 如果返回“无权访问”或类似错误,则可以尝试其他ID,或者结合修改Cookie中的Token、尝试使用POST方法等进一步测试。
- 深入利用:如果存在越权,我们还可以尝试将
user_id参数改为../admin、*、ALL等特殊值,或者尝试遍历一个ID范围(这时可以结合Yakit的“Payload”功能,自动生成序列数字进行爆破)。
3.2 场景二:业务逻辑漏洞(如金额篡改)
- 定位关键请求:在测试一个购物流程时,我们监听并找到了提交订单的请求:
POST /api/order/create,其Body是一个JSON,包含product_id,quantity,total_price等字段。 - 劫持与修改:配置规则拦截此请求。在创建订单时,Yakit将其劫持。我们发现
total_price: 500.00是由前端计算传来的。 - 测试逻辑缺陷:我们将
total_price的值修改为0.01,然后放行请求。 - 观察结果:
- 如果后端没有重新校验金额,直接以0.01元创建了订单并成功支付,这就是一个严重的业务逻辑漏洞。
- 如果后端返回错误,我们可以尝试其他参数,比如修改
product_id为一个已下架但库存还在的商品ID,或者修改quantity为负数,看是否能触发库存异常。
3.3 场景三:响应篡改测试客户端逻辑
- 发现客户端依赖:在测试时,我们发现某个关键操作(如“领取高级权限”)后,前端会检查一个API响应中的
data.is_vip字段是否为true来决定是否显示高级功能。 - 劫持响应:我们正常发起一个“领取”请求(可能失败或我们没有权限),然后在Web Fuzzer中勾选“劫持服务器响应”。服务器返回了
{"code": 403, "msg": "权限不足", "data": {"is_vip": false}}。 - 篡改响应:我们将响应体修改为
{"code": 200, "msg": "success", "data": {"is_vip": true}},然后放行。 - 客户端验证:观察前端页面,如果原本灰色的“高级功能”按钮变亮并可点击,说明前端完全信任了客户端传来的响应,没有在后续操作中再次向服务器校验权限。这虽然可能不是一个直接的远程漏洞,但揭示了不安全的设计,在组合其他漏洞(如缓存投毒)时可能变得危险。
4. 高阶技巧与性能调优
4.1 结合编码器与哈希器
在修改请求时,经常遇到参数被编码或哈希的情况。Yakit的Web Fuzzer内置了强大的编码/解码和哈希计算工具。
- 场景:你发现一个请求参数
sign=md5(order_id+secret_key),用于签名验证。 - 操作:你可以先正常下单一次,劫持请求获得原始的
order_id和sign。然后,在另一个标签页或使用Yakit的“工具箱”计算新的sign。更高效的做法是,在Web Fuzzer的Payload配置中,为sign参数选择“哈希”生成器,并编写一个小的自定义脚本来实时计算,配合Intruder模式进行批量测试。
4.2 使用“数据包扫描”进行被动漏洞探测
Yakit的MITM不仅仅是一个手动测试工具。在开启MITM服务器时,可以同时开启“数据包扫描”功能。它会自动分析流经代理的所有HTTP/HTTPS流量,基于内置的规则库(类似被动式扫描器)识别潜在的安全问题,如敏感的身份证号、手机号泄露,明显的SQL注入参数,过时的框架版本头部等。这可以作为我们手动测试的一个有力补充,帮助我们发现那些容易被忽略的“低悬果实”。
4.3 性能与稳定性注意事项
- 资源消耗:开启MITM代理,特别是同时进行大量数据包扫描和劫持时,会占用一定的CPU和内存。在性能较弱的机器上,可能会感到浏览器卡顿。建议根据测试阶段调整功能,初期广撒网时只开基础代理和扫描,深度测试时再开启精准劫持。
- 证书管理:Yakit会自动生成根证书并引导安装。但在某些极端情况下(如模拟器、特殊浏览器),可能需要手动导出证书文件(PEM格式)并进行安装。如果遇到HTTPS网站无法解密的情况,首先检查证书是否被正确信任。
- 流量过滤:长时间测试会产生海量历史记录。务必善用“匹配劫持”和“热加载”来聚焦目标,避免无关流量干扰。也可以定期清理Web Fuzzer的历史记录。
- 与Burp Suite协作:Yakit和Burp Suite可以共存。你可以将Yakit设置为上游代理,让流量先经过Yakit的MITM(利用其热加载等特色功能),再转发给Burp Suite进行更深度的扫描(如Active Scan)或使用其他插件。只需在Yakit的MITM设置中配置上游代理为Burp监听的地址即可。
5. 常见问题排查与解决实录
在实际使用Yakit MITM进行红蓝对抗或SRC挖掘时,你肯定会遇到一些“坑”。这里记录了几个典型问题及其解决方案。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 浏览器提示“连接不是私密连接”或无法访问HTTPS网站 | 1. Yakit根证书未安装或未信任。 2. 浏览器或系统代理设置错误。 3. 目标网站使用了证书钉扎(HPKP)。 | 1.检查证书:打开Yakit MITM设置,点击“下载CA证书”,确保证书已安装到系统或浏览器的受信任根证书颁发机构。在浏览器中访问http://yakit.cn或http://mitm,Yakit会提供便捷的证书安装指引。2.检查代理:确认浏览器或系统全局代理指向了Yakit监听的地址(默认 127.0.0.1:8083)。3.证书钉扎:对于少数应用(如部分银行APP、微信小程序),由于其使用了证书钉扎,常规MITM无法解密。此时需要更高级的绕过手段(如逆向修改APP),这已超出基础MITM范围。 |
| Yakit抓不到任何流量 | 1. 代理未正确设置。 2. MITM服务器未启动。 3. 流量未经过代理(如直连的APP)。 | 1.确认代理:在浏览器访问http://mitm,应能看到Yakit的欢迎页面。如果不能,说明代理设置无效。2.确认服务:在Yakit主界面查看MITM服务器是否显示为绿色“已启动”状态。 3.检查客户端:对于移动端APP,确保设备的Wi-Fi代理已设置为Yakit所在机器的IP和端口。对于命令行工具(如curl),使用 -x或--proxy参数指定代理。 |
| Web Fuzzer中修改请求后发送,但服务器返回错误或无响应 | 1. 请求格式被破坏(如JSON格式错误)。 2. 必要的头部被修改或丢失(如Content-Type, Cookie)。 3. 参数签名或Token失效。 4. 网络连接问题。 | 1.格式检查:切换到“数据包”视图,检查修改后的请求是否符合HTTP标准。特别注意JSON体末尾的逗号、引号是否匹配。 2.头部检查:对比原始请求,确保如 Content-Type: application/json、Authorization: Bearer ...、Cookie等关键头部在修改后依然存在且正确。3.签名/Tokens:很多现代API有签名或时效性Token。修改参数可能导致签名失效,或长时间测试后Token过期。需要重新获取有效的请求参数。 4.网络诊断:尝试用原始未修改的请求重放,看是否正常。如果不正常,可能是网络或目标服务器问题。 |
| 热加载脚本不生效 | 1. 脚本语法错误。 2. 脚本逻辑未匹配到任何流量。 3. 热加载功能未启用。 | 1.语法检查:Yakit的热加载控制台会输出错误信息。检查控制台是否有JS报错。确保使用mirror.NewMITMFilter标准写法。2.逻辑调试:在脚本开始处添加 console.log(“脚本加载,URL:”, url),然后在MITM流量日志中查看是否有输出,以确认脚本被执行。逐步调试你的匹配逻辑。3.功能开关:确认在MITM劫持设置中,“使用热加载代码过滤HTTP流量”选项已被勾选。 |
| 历史记录丢失或混乱 | 1. 切换了不同的Web Fuzzer标签页。 2. 清除了浏览器缓存或Yakit数据。 3. Yakit异常退出。 | 1.标签页隔离:Yakit中每个Web Fuzzer标签页的历史记录是独立的。请确认你在正确的标签页查看历史。 2.数据持久化:Yakit的历史记录默认保存在当前项目文件中。定期保存项目( .yak文件)可以防止数据丢失。重要的测试步骤,建议手动复制请求数据到外部笔记中备份。3.稳定运行:尽量避免在Yakit繁忙操作时强制关闭。 |
这套从监听、拦截、修改到分析的完整工作流,构成了我日常渗透测试和SRC挖掘的核心循环。Yakit的MITM进阶模式将这个过程变得非常流畅,尤其是热加载和响应劫持功能,让我能快速构建针对特定目标的测试环境。工具再强大,核心还是测试者的思路。理解业务逻辑,猜测开发者可能遗漏的校验点,然后用Yakit这把“手术刀”精准地切入验证,这才是漏洞挖掘的乐趣所在。最后一个小建议,在开始大规模劫持测试前,最好先在测试环境或者目标的一个非核心功能点上验证你的代理和规则是否工作正常,避免一开始就误操作影响到关键业务。
