Yakit实战技巧:用MITM热加载任意修改流量
背景
用户在使用 Yakit MITM 功能的时候,经常会遇到一些特殊需求:
-
我的数据包需要携带一些特征变量才能访问,但是浏览器无法做到,我可以批量修改流量新增某一个 Header 吗?
-
我可以在代理层面在所有流量中新增一个参数吗?
这类需要动态修改流量并放行的需求如果手动操作的话,非常复杂。需要劫持到数据包,然后修改数据包,手动放行,不是不可以完成,而是这样的操作并不是自动化的,人工操作多了很容易疲倦漏掉一些关键信息。
熟悉 Yakit 的用户,尤其是一些深度用户非常熟悉这种操作,我们可以点击 “ 热加载 ”,在恰当的 Hook
点编写我们希望操作流量做的事儿,然后加载进引擎中,等待流量执行。
通过一个简单的图例展示热加载代码在流量劫持中的过程:

实战案例:使用 XFF 绕过 IP 封禁
如果在测试过程中,IP 被 WAF 封禁了,阻碍了我们后续的工作,当然,通过代理池的手段,我们可以直接解决这个问题,但是通常在筹备代理池之前,我们会尝试修改
XFF 或者 XRI 来绕过 IP 限制。
这个原理十分简单,一般来说,我们后端需要通过X-Forwarded-For或X-Real-IP来识别客户端的真实 IP,那么在频繁进行测试中,WAF
会对过频访问的 IP 进行限制,那么我们修改X-Forwarded-For一般能起到绕过检测的作用。
当然,能否真的绕过取决于 WAF 部署的层数,如果在 TCP 层部署的 WAF 一般情况是无法通过这个手段绕过的,如果仅仅是七层 WAF,或 Nginx
强制覆盖了 XFF 等头,也会造成绕过失败。
对于用户来说,只需要为每一个请求新增 XFF 即可达到很好的效果,那么在 Yakit 中,我们如何操作呢?
编写一个数据包修改函数
如下图展示,我们使用 Yaklang 中的fuzz模块,构建了一个数据包,这个数据包会在新数据包的基础上随机使用一个 IP 作为 XFF 的值填入。

在 MITM - 热加载中调用

在修改好劫持代码之后,我们复制粘贴点击 “加载当前代码” 然后就可以看到Initializing HotPatched MITM HOOKS的标志,意味着我们的热加载代码被引擎接受了,并加载到了内存中。

加载代码查看效果
点击 HTTP History,我们随便查看流经 Yakit 的流量列表,可以看到流量的X-Forwarded-For已经被成功修改。

附录:案例中的核心代码
addXFF = func(packet) {return fuzz.MustHTTPRequest(packet,).FuzzHTTPHeader("X-Forwarded-For", "{{ri(1,255)}}.{{ri(0,255)}}.{{ri(0,255)}}.{{ri(0,255)}}",).FirstHTTPRequestBytes()
}
授人以渔
我们在实现上述案例的时候,发现这个核心函数其实非常关键,那我们应该如何编写这种函数呢?
如果用户简单的通过str.Replace...或者re模块来写,是没有问题的;但是会给用户在使用上造成一定的困难:比如str ``/ re并不会自动修复被损坏的数据包,需要通过poc.FixHTTPRequest来修复数据包。
实际上我们上述的使用中,并没有使用到一些基础的字符串处理,而是使用了fuzz模块。
顺便为大家介绍一下fuzz模块中修改数据包的接口和特色。
风格:链式调用
不同于其他模块的函数+参数风格,在fuzz.HTTPRequest和fuzz.MustHTTPRequest函数使用中,我们修改数据包是通过一个接一个的函数调用来完成修改的。这种模式可能听起来有点陌生,我们简单通过几个例子即可很容易理解。
最简洁的链式调用 API 我们可以这样完成(Yaklang >= 1.1.5)
packet := `GET / HTTP/1.1
Host: www.example.com
`// 开始进行链式调用
fuzz.MustHTTPRequest(packet,
).FuzzHTTPHeader( // 修改数据包 Header`Header1`, "From fuzz.MustHTTPRequest",
).FuzzGetParams( // 修改数据包 Get 参数"key", "value",
).Show()/*
GET /?key=value HTTP/1.1
Host: www.example.com
Header1: From fuzz.MustHTTPRequest*/
我们观察上述代码,发现通过MustHTTPRequest构建的请求直接可以调用后续方法进行修改数据包,通过.Show()来展示最后的修改结果。
如果担心代码不安全,我们也可以使用fuzz.HTTPRequest来显式接收错误:
注意:fuzz.HTTPRequest 和 fuzz.MustHTTPRequest
相比,除了返回值数量之外,是没有差别的;MustHTTPRequest会隐藏错误,如果构建数据包失败,将会仅抛出警告。
/*使用 fuzz.HTTPRequest 获取可供链式调用的对象,并同时支持错误处理
*/
freq, err = fuzz.HTTPRequest(`GET / HTTP/1.1
Host: www.example.com`)
die(err) // 遇到错误马上退出freq.FuzzHTTPHeader("Header1", "Header-Value-2",
).FuzzHTTPHeader("Header3", "Header3-Value",
).Show()
/*
OUTPUT:GET / HTTP/1.1
Host: www.example.com
Header1: Header2
Header3: Header3-Value*/
Fuzztag 集成
Fuzztag 作为伴随 Yaklang
一直成长的特性,同时也作为fuzz原生支持的功能,在fuzz.HTTPRequest中也理所当然的被支持,所以我们可以使用如下 fuzztag
来随机生成一个 IP
地址{{randint(1,255)}}.{{randint(0,255)}}.{{randint(0,255)}}.{{randint(0,255)}},或者定制其他数据。
这也是我们addXFF函数添加随机 IP 进入 XFF 的依据,一般来说,在Fuzz..函数被调用的“值”部分,是我们都做了 Fuzztag
的支持。
批量渲染数据包
在 Fuzztag
引入数据包的修改机制之后,数据包就出现了问题,到底是一个数据包呢?还是被修改成多个数据包呢?实际上,确实是多个数据包,我们可以将渲染出的一整批数据包同时发送出去(使用并发池),也可以仅查看数据包的结果(.Show()
函数),同样的,如果我们使用的时候大概确定只会渲染一个数据包,那么就可以理所当然地使用FirstFuzzHTTPRequest()或FirstHTTPRequestBytes()直接操作第一个数据包。
type palm/common/mutate.(FuzzHTTPRequestIf) struct {// 发送所有渲染后的数据包func Exec(v1 ...func httpPoolConfigOption(v1: *mutate.httpPoolConfig) ) return(chan *mutate._httpResult, error) // 仅执行第一个数据包func ExecFirst(v1 ...func httpPoolConfigOption(v1: *mutate.httpPoolConfig) ) return(*mutate._httpResult, error) // 获取第一个数据包的结果,继续进行 fuzz func FirstFuzzHTTPRequest() return(*mutate.FuzzHTTPRequest) // 把第一个数据包的原始报文取出来,bytes (注:可当作 string 使用)func FirstHTTPRequestBytes() return([]uint8) ......// 一般用于调试,查看数据包的构造结果// 可以在任意地方调用func Show() return(mutate.FuzzHTTPRequestIf)
}
更多案例:
我们在了解核心原理和 API
之后,其实很容易可以构造出符合自己要求的数据包修改函数,那么为了方便大家复制粘贴修改,我举例了一些比较有用的函数库,如需使用,可随意复制。
修改 Header
/*修改 XFF:分别是用随机 IP 或本地 IP
*/
addXFF = func(req) {ft = `{{ri(1,255)}}.{{ri(0,255)}}.{{ri(0,255)}}.{{ri(0,255)}}`return fuzz.MustHTTPRequest(req).FuzzHTTPHeader("X-Forwarded-For", ft).FuzzHTTPHeader("X-Real-IP", ft).FirstHTTPRequestBytes()
}
addXFFLocalhost = func(req) {ft = `127.0.0.1`return fuzz.MustHTTPRequest(req).FuzzHTTPHeader("X-Forwarded-For", ft).FuzzHTTPHeader("X-Real-IP", ft).FirstHTTPRequestBytes()
}
增加 Basic Auth
// 为流量增加基础认证
addBasicAuth = func(req) {user, name = "admin", "123456"result = `Basic ` + codec.EncodeBase64("%v:%v" % [user, name])// Authorization: Basic Y2xpOmNsaTEyMy5jb20=return fuzz.MustHTTPRequest(req).FuzzHTTPHeader("Authorization", result).FirstHTTPRequestBytes()
}
修改 Cookie
// 为流量新增一个 Cookie
addCookie = func(req) {key = "isAdmin"value = "true"return fuzz.MustHTTPRequest(req).FuzzCookie(key, value).FirstHTTPRequestBytes()
}
// 为流量新增多个 Cookie
addMultiCookie = func(req) {key = "isAdmin"value = "true"return fuzz.MustHTTPRequest(req).FuzzCookie(key, value).FuzzCookie("key2", "HHHHH-NewKey").FirstHTTPRequestBytes()
}
修改请求参数
// 寻找数据包中的 Get Query 参数为 abc,值修改为 456
// 否则直接返回
changeGetParams = func(req) {freq = fuzz.MustHTTPRequest(req)if freq.GetMethod() != "GET" {return req}if freq.GetQueryValue("abc") != "" {return freq.FuzzGetParams("abc", "456").FirstHTTPRequestBytes()}return freq.FirstHTTPRequestBytes()
}
总结:
MITM 热加载的实际用途其实远不止于此,大家可以任意发挥想象力实现流量修改,或按需定制符合自己公司实际业务场景的热加载代码。
.GetQueryValue(“abc”) != “” {
return freq.FuzzGetParams(“abc”, “456”).FirstHTTPRequestBytes()
}
return freq.FirstHTTPRequestBytes()
}
总结:
MITM 热加载的实际用途其实远不止于此,大家可以任意发挥想象力实现流量修改,或按需定制符合自己公司实际业务场景的热加载代码。
最后
分享一个快速学习【网络安全】的方法,「也许是」最全面的学习方法:
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)
2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)
4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现
5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固
6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k。
到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?
想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!
扫下方二维码,免费领取

有了这些基础,如果你要深入学习,可以参考下方这个超详细学习路线图,按照这个路线学习,完全够支撑你成为一名优秀的中高级网络安全工程师:

高清学习路线图或XMIND文件(点击下载原文件)
还有一些学习中收集的视频、文档资源,有需要的可以自取:
每个成长路线对应板块的配套视频:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,需要的可以【扫下方二维码免费领取】

相关文章:
Yakit实战技巧:用MITM热加载任意修改流量
背景 用户在使用 Yakit MITM 功能的时候,经常会遇到一些特殊需求: 我的数据包需要携带一些特征变量才能访问,但是浏览器无法做到,我可以批量修改流量新增某一个 Header 吗? 我可以在代理层面在所有流量中新增一个参数…...
如何搭建自己的MQTT服务器?跟我来,一行代码搞定!
如何搭建自己的MQTT服务器?跟我来,一行代码搞定!什么是mosquitto?如何使用mosquitto云服务器注意事项MQTT客户端软件下载在文章开始之前,你首先需要有一台服务器,我这里用的是阿里云的轻量级云服务器&#…...
遇到的问题
一、axios 请求 1、axios post 提交的请求的 content-type 为 json 默认情况下,axios将JavaScript对象序列化为JSON,再发送数据application/x-www-form-urlencoded格式相反,您可以使用URLSearchParamsAPI,也就是支持在绝大多数…...
线程没有被终止的异常的处理
process Runtime.getRuntime().exec(command); process.waitFor(); // 这个调用比较关键,就是等当前命令执行完成后再往下执行 if (!file.exists()) { Ulog.error("html转pdf执行失败"); } else { …...
RocketMQ 初步了解
RocketMQ 初步了解 前言: 近期,因公司使用 RocketMQ 作为消息队列中间件,特此了解。 RocketMQ 是阿里巴巴在 2012 年开发的分布式消息中间件,专为万亿级超大规模的消息处理而设计,具有高吞吐量、低延迟、海量…...
Mac下PyCharm快捷键
Mac键盘符号和修饰键说明 ⌘ Command⇧ Shift⌥ Option⌃ Control↩︎ Return/Enter⌫ Delete⌦ 向前删除键(FnDelete)↑ 上箭头↓ 下箭头← 左箭头→ 右箭头⇞ Page Up(Fn↑)⇟ Page Down(Fn↓)Home Fn …...
城市管网监测系统,保障城市血管生命线!
各种不同的管网线路组成了城市的供血管道,管网对于维持正常的社会生活、生产秩序和公共安全至关重要。我国城市平均漏损率达到38%,部分城市甚至超过50%,远超发达国家的平均水平(10%)。对于管道状态的监测,是…...
Web3中文|1月数据显示复苏迹象,涉及NFT、DeFi、Dapp、链游……
本期看点 1、Dapp行业概述 2、DeFi的TVL增长26.8%,有回暖迹象 3、NFT市场数据飙升,交易额达9.46亿美元 4、链游使用量占行业48% 5、与去年相比,1月份区块链漏洞损失最低 区块链领域正在多元化发展,2023年1月,从各…...
MySQL索引的介绍以及优缺点
1.索引简介 索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。 使用索引可以快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。 索…...
Java_小项目书城
1.概述 书城的基本功能: 展示书籍上新书籍下架书籍退出应用 书城项目所涉及到的知识点: 用户交互–键盘录入分支结构,循环结构面向对象的思维,封装对象集合的使用 2.菜单的编写 这部分代码就是读取用户键盘的录入࿰…...
Unreal Engine08:Pawn的实现
写在前面 Pawn继承于Actor,增加了一些用于控制和提供玩家视角的功能,这里主要是介绍一下Pawn类的实现。 一、创建一个Pawn的C类 创建的C类也是放在Source文件夹中的Public和Private文件夹中;选择Pawn作为继承的父类;头文件中除…...
408强化(二)线性表纯享版
目录 一、顺序表(数组)和链表总览 二、考情分析 2.1 从历年考情可以看出,如果一个方法出现了第2次,一般是以下情况: 2.2 没有考过的地方 三、 共同操作或考法 3.1 多指针后移 3.2 逆置 3.3 空间换时间的操作 3.…...
ubuntu下如何使用wireshark抓包,保姆级教程
Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。 一、安装wireshark 打开终端&…...
世界上最健康的程序员作息表!「值得一看」
昨晚看了一篇“传说中”的“世界上最健康的作息时间表”,开始纠结自己还要不要5点半起床。 都说程序员这一行,猝死概率极高,究其原因还是加班太狠、作息不规律、缺乏运动… 今天和大家分享一下这篇文章,还是非常值得参考的&#…...
Java中多继承的实现
1 问题Java是一种面向对象的只允许单继承的语言,那么怎样在Java中实现多继承呢?2 方法多层继承如果要直接继承类,子类是不可以直接多继承的,但是可以通过多层继承来实现多继承,但多层继承一般不建议超过三次。接口接口…...
蓝桥杯 stm32 USART 串口发送数据
文章代码使用 HAL 库。 文章目录 前言一、串口原理图二、CubeMX 创建工程。三、串口发送函数:四、串口助手 配置:五、详细代码:注意:连续发送数据六、printf 重定向问题代码示例:实验效果:总结前言 USART : ( Universal Synchronous/Asynchronous Receiver/Transmitter…...
Spring之AOP底层源码解析
Spring之AOP底层源码解析 1、动态代理 代理模式的解释:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。 举个例子 public class UserService {public void test() {System.out.println("test.…...
人脸识别——景联文科技提供3D头模数据采集业务!
“拿起手机刷脸解锁、上下班考勤、支付订单,刷脸已极大地便利了我们的生活。清华大学新闻学院教授沈阳表示,中国人平均每天要暴露在各种摄像头下超过500次。人脸识别已成了我们生活中重要的一部分。由于2D人脸识别容易受到姿态、表情、光照等因素影响&am…...
SpringBoot集成Flink-CDC 采集PostgreSQL变更数据发布到Kafka
最近做的一个项目,使用的是pg数据库,公司没有成熟的DCD组件,为了实现数据变更消息发布的功能,我使用SpringBoot集成Flink-CDC 采集PostgreSQL变更数据发布到Kafka。 一、业务价值 监听数据变化,进行异步通知…...
酷开系统壁纸模式,将氛围感死死拿捏!
古希腊哲学家柏拉图曾经说过:“美感是起于视觉、听觉产生的快感,以人的感官所能达到的范围为极限。”而电视则恰恰就是视觉听觉的完美融合体,当一台开启的电视可以给我们带来视听享受的时候,一台待机状态下的电视又如何取悦于我们…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
【题解-洛谷】P10480 可达性统计
题目:P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M,接下来 M M M 行每行两个整数 x , y x,y x,y,表示从 …...
数据挖掘是什么?数据挖掘技术有哪些?
目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...
零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)
经过前面几期的内容我们学习了很多网络安全的知识,而这期内容就涉及到了前面的第六期-RCE模块,第七期-File inclusion模块,第八期-Unsafe Filedownload模块。 什么是"遍历"呢:对学过一些开发语言的朋友来说应该知道&…...
Unity-ECS详解
今天我们来了解Unity最先进的技术——ECS架构(EntityComponentSystem)。 Unity官方下有源码,我们下载源码后来学习。 ECS 与OOP(Object-Oriented Programming)对应,ECS是一种完全不同的编程范式与数据架构…...
npm install 相关命令
npm install 相关命令 基本安装命令 # 安装 package.json 中列出的所有依赖 npm install npm i # 简写形式# 安装特定包 npm install <package-name># 安装特定版本 npm install <package-name><version>依赖类型选项 # 安装为生产依赖(默认&…...
