05:MITM 的五脏六腑——中间人的里里外外
大家好我是毛衣哥。前四期铺垫了那么多这一期终于到实战环节了。我们把中间人拆开看看它肚子里到底塞了什么——堵路、分身、造假、偷看、传话五步走完你也能当个白帽中间人。前四篇我们把 HTTPS 的加密和信任体系拆了个遍。这一期来点真格的——把中间人攻击拆成五个步骤每一步都讲清楚中间人做了什么以及每一步如果做砸了会发生什么。看完这篇你就知道装完那个证书之后中间人到底在你的流量上干了哪些事。我先把这五步列出来然后一个一个拆第一步堵路 —— 让流量走中间人这里过 第二步分身 —— 同时扮演两个角色 第三步造假 —— 即时签发假证书 第四步偷看 —— 解密、记录、展示 第五步传话 —— 透明转发不让任何一端察觉第一步堵路——怎么让流量走中间人这里过中间人最大的一个问题它得先让你把流量发给它而不是直接发给服务器。抓包工具怎么解决这个问题有四种方式。每个的技术含量天差地别。方式一HTTP 代理配置抓包工具最常用的方式你在系统偏好设置里配代理HTTP 代理填127.0.0.1:8888。然后你的浏览器发出的所有 HTTP/HTTPS 请求都先发到了127.0.0.1:8888——那里正好跑着 Charles 或 Fiddler。优点不需要任何特殊权限配置简单修改方便。缺点应用如果不读取系统代理设置很多移动 App 就这样就无效。方式二DNS 劫持这种方式更狠一点——不需要你配代理。中间人控制了一个 DNS 服务器。当你查询www.example.com时DNS 返回的不是真正的 IP而是中间人自己的 IP。你的浏览器以为www.example.com就在那里直接连过去了。优点客户端不需要任何配置——只需要使用中间人控制的 DNS 服务器。缺点如果你不用它的 DNS自己配了 8.8.8.8这一招就没用了。还有HTTPS 的证书校验会失败——浏览器连上去之后中间人给的证书不是 example.com 的。方式三ARP 欺骗局域网内这是所有方式里最黑客的一种。在同一个局域网里你的电脑和路由器都有一张 ARP 表记录了这个 IP 对应的 MAC 地址是什么。中间人伪造 ARP 包告诉路由器“我是 192.168.1.100你的 IP”。同时告诉你“我是 192.168.1.1网关”。结果你要发给www.example.com的数据包先到了路由器——但你的电脑以为网关是中间人所以数据先到了中间人那里。路由器觉得你是中间人也把数据发给中间人。优点不需要修改任何系统设置。在同一个 WiFi 下的任何人都可以对你这么做。缺点要实现双向冒充需要在同一局域网内HTTPS 还有证书问题需要把证书也处理了。方式四BGP 路由劫持国家级这是运营商级别的操作。通过 BGP 协议宣告一条更优的路由让互联网上所有发给某个 IP 范围的流量都先经过你的路由器。优点一个机房、一个省、甚至一个国家的流量都能劫持。缺点需要操作骨干路由器。BGP 泄漏如果被监控发现立刻会被全球通报。但抓包工具用的是最简单的一种——方式一。你配个代理就行。第二步分身——同时扮演两个角色流量到了中间人这里中间人要做的第一件事同时扮演两个角色。视角一跟服务器的通信 中间人以客户端身份→ 跟 example.com 完成真正的 TLS 握手 → 拿到会话密钥 A中间人←→服务器 → 开始接收真正的响应数据 视角二跟客户端的通信 中间人以服务器身份← 跟你的浏览器完成假的 TLS 握手 ← 用假证书欺骗你的浏览器 ← 拿到会话密钥 B客户端←→中间人 ← 等待你发出 HTTP 请求关键是这两个角色互不知道对方的存在。中间人同时维护着两条连接。一条是真正的连接——它跟 example.com 正常说话。一条是假的连接——它冒充 example.com 跟你说话。在代码里这种双通道管理的架构大概长这样// MITM 中分身阶段的核心逻辑 function handle_client_connection(client_conn, target_host, target_port): // 1. 跟真正的服务器建立连接 server_conn tcp_connect(target_host, target_port) tls_handshake(server_conn, as_clienttrue) // 以客户端身份握手 // 2. 从 SNI 获取目标域名 target client_conn.client_hello.sni // 3. 动态签发假证书 fake_cert sign_cert(interceptor_ca, target) // 4. 跟客户端握手用假证书 tls_handshake(client_conn, as_servertrue, certfake_cert) // 5. 同时维护两条通道 while client_conn.is_connected() AND server_conn.is_connected(): // 客户端方向解密 → 记录 → 加密转发 client_data tls_decrypt(client_conn, key_B) record_to_storage(client_data) tls_encrypt(server_conn, key_A, client_data) // 服务器方向解密 → 记录 → 加密转发 server_data tls_decrypt(server_conn, key_A) record_to_storage(server_data) tls_encrypt(client_conn, key_B, server_data)如果中间人在分身这一步失败了会怎样假设中间人成功跟 example.com 建立了连接拿到了真正的网页但跟你的连接建立失败比如你的浏览器不信任假证书——那你的浏览器会直接显示一个连接不安全的红色警告页面拒绝继续。实际上中间人是在两条连接都建立之后才开始做第四步和第五步的。第三步造假——即时签发假证书这是前面花了四期铺垫的核心。中间人已经截获了你的 ClientHello从 SNI 里知道你要访问example.com。它打开自己的 CA 证书就是你装的那个用它的私钥签发一张新的证书马上要签发的证书内容Version: 3 Serial Number: 随机生成一个 Issuer: CNCharles Proxy CA这是你自己装的那个 CA 的名字 Subject: CNexample.com这是中间人替你填的冒充的域名 Validity: Not Before: 现在 Not After : 现在 1 年 Subject Public Key Info: Public Key Algorithm: RSA Public-Key: 中间人自己生成的一对临时密钥对把公钥放进来 X509v3 extensions: Subject Alternative Name: DNS:example.com DNS:www.example.com然后用自己的 CA 私钥签名生成签名值。整个过程耗时多少如果证书已经缓存在内存里Charles 会对常用的域名缓存证书是微秒级的。如果需要重新生成是毫秒级的。如果造假失败了会怎样一种情况中间人用了一个过期的 CA 证书来签。你装的那个抓包 CA 过期了Charles 旧版本常见的问题。这时候浏览器检查证书链会发现这个 CA 已经过期了。另一种情况中间人用的 CA 跟你的系统中安装的不匹配。比如你装的是 Charles 的 CA但中间人用了 Fiddler 的 CA。你的浏览器不信任那个 CA报错。但最关键的造假条件只有一个你必须在系统中安装过中间人 CA。你永远不需要记住这个条件。因为它每次都会以安装证书的方式提醒你。第四步偷看——解密、记录、展示两条连接都建立好了。假证书也发出去了。现在中间人手握着两把会话密钥钥匙串 会话密钥 B客户端 → 中间人能解密你发过来的加密数据 会话密钥 A中间人 → 服务器能解密服务器发回来的加密数据解密过程以你的浏览器发一个 POST 请求为例你的浏览器加密→ 中间人收到 [一堆密文] 中间人用会话密钥 B 解密 POST /login HTTP/1.1 Content-Type: application/x-www-form-urlencoded usernameadminpassword123456 中间人记录到本地 timestamp: 2026-07-28 12:34:56 src_ip: 你的 IP dst_ip: example.com method: POST path: /login body: usernameadminpassword123456看到了吗你的登录密码在中间人看来就是明文的。中间人然后把这条记录的格式调整一下显示在抓包工具的界面上——Charles 的Structure视图里就多了一条请求你可以点开查看完整的请求和响应。解密过程中的边界问题如果请求体很大比如一个文件上传几十 MB中间人会怎么做它可以解密前几 KB 就展示给你看流式显示也可以等全部解密完再展示需要更多内存大多数抓包工具选择方案一——先把头部解密显示出来HTTP 请求行 请求头body 等下载完了再慢慢显示第五步传话——透明转发解密并记录完之后中间人需要做最后一步把这次请求原样发给真正的服务器。中间人从记录中取出原始请求在解密的时候就已经保存了原始字节 → 用会话密钥 A中间人 → 服务器重新加密 → 发往真正的 example.com服务器收到加密数据解密响应。响应的数据回到中间人中间人再做一遍解密记录→重新加密的循环然后发回给你。整个过程两端都没有任何感知服务器觉得我是一个正常的客户端连上了我在跟我正常通信你觉得我连的是 example.com地址栏有小锁没问题的如果传话出了问题会怎样假设中间人在解密 → 重新加密的过程中把数据破坏了一点点——比如改了一个字节。那么服务器收到的请求就跟你发的不同了。如果你发的是一次银行转账请求金额从 100 变成了 1000——但中间人没有改它原样转发了。但如果中间人故意改了它完全可以改。这就是 HTTPS 没解决的问题——它只能保证传输过程中没人改但不能保证中间人端到端没有改。因为你装了中间人的 CA中间人在你的终端和服务器之间插了一整层。不过大多数抓包工具是诚实的不会改你的数据。它们只管看和记。如果五步中任何一步失败了来看看各种失败场景步骤失败了会怎样用户看到什么第一步堵路流量不走中间人抓包工具什么都没抓到一切正常抓包工具界面空白第二步分身两条连接有一条没建立成功浏览器打不开网页第三步造假假证书不被信任浏览器红色警告您的连接不是私密连接第四步偷看解密失败密文无法解析抓包工具显示乱码第五步传话数据破坏服务器收到乱码网页加载失败或显示错误内容所以当你看到抓包工具界面有内容时——说明五步全部走通了。一个有意思的问题中间人能看到自己的流量吗答案是不能。因为中间人自己访问 HTTPS 网站的时候它也只是一个普通客户端。如果它没有在系统里装自己的 CA通常不装因为不需要那它的浏览器跟服务器之间的 TLS 握手就是正常的——中间人的抓包工具看不到自己浏览器的流量。但如果在中间人的系统上装了它自己的 CA——那就形成了一个自指的循环中间人抓中间人自己的包。这在调试抓包工具本身的 bug 时偶尔会用。下期预告装了一个证书你的 HTTPS 就全裸了。我们只讲一件事那个安装证书的弹窗到底授予了抓包工具多么大的权限。DumpAny 怎么做五步中的每一步在 DumpAny 内部都是一个独立的模块。堵路代理配置、分身双通道管理、造假动态证书签发、偷看解密记录、传话透明转发——每个模块都可以独立升级和替换。这种架构的好处是如果我们想支持新的协议比如 MySQL 或 Redis只需要在偷看这一步加一个新的协议解析器前四步完全复用。第一步: 堵路代理配置让流量经过我第二步: 分身扮演客户端和服务器第三步: 造假动态签发假证书第四步: 偷看解密-记录-展示第五步: 传话重新加密-转发 聊几句TLS 握手七步中你觉得最关键的是哪一步为什么你平时会去看 TLS 握手的细节吗还是在用工具一键搞定如果有一天互联网的 CA 体系崩塌了你觉得会发生什么你有没有遇到过证书相关的线上问题怎么排查的

相关新闻

3步快速上手GraphvizOnline:在线图表编辑完整指南

3步快速上手GraphvizOnline:在线图表编辑完整指南

3步快速上手GraphvizOnline:在线图表编辑完整指南 【免费下载链接】GraphvizOnline Lets Graphviz it online 项目地址: https://gitcode.com/gh_mirrors/gr/GraphvizOnline 你是否曾为绘制复杂的流程图、组织结构图或网络拓扑图而烦恼?GraphvizO…

2026/10/12 4:34:45 阅读更多 →
51单片机矩阵键盘线反转法:高效IO扩展与按键识别实战

51单片机矩阵键盘线反转法:高效IO扩展与按键识别实战

1. 项目概述:从独立按键到矩阵键盘的必然选择在嵌入式开发,尤其是基于51单片机的项目中,人机交互是绕不开的一环。早期做项目,需要几个按键,就直接用几个IO口接上拉电阻和按键,这就是独立按键。但当你的需求…

2026/10/10 3:31:18 阅读更多 →
LangChain Agent 从入门到精通:从核心原理到生产级落地

LangChain Agent 从入门到精通:从核心原理到生产级落地

大家好,我是深耕大模型应用开发的技术博主。如果说大模型是智能体的 “大脑”,那Tool(工具)就是智能体的 “双手”—— 它解决了大模型知识滞后、不会精确计算、无法操作外部系统的核心痛点,是 Agent 能力落地的关键基…

2026/10/10 3:31:17 阅读更多 →

最新新闻

牛客寒假算法集训营第一场题解:双指针、树形DP与字符串DP实战

牛客寒假算法集训营第一场题解:双指针、树形DP与字符串DP实战

牛客寒假算法基础集训营第一场这套题,我印象挺深。难度曲线并不是那种“签到题送到嘴边、压轴题劝退所有人”的极端分布,前几道确实送分,但从G题开始就进入双指针、树形DP、字符串DP这些正经考点,最后两道又考模型转化和临场取舍。…

2026/10/12 6:04:34 阅读更多 →
Codex额度总不够用?揪出4种隐蔽的无效消耗

Codex额度总不够用?揪出4种隐蔽的无效消耗

1. 额度告急的真相:先别急着升级套餐用Codex写代码的人,十个里有八个都经历过这种场景:正写到关键逻辑,突然弹出一行提示说额度用完了,只能干瞪眼等到下一个重置周期。第一反应往往是"是不是我的Plus套餐太少了&q…

2026/10/12 6:04:33 阅读更多 →
特征工程实战全流程:从原始数据到房价预测 R² 0.82 的进阶之路

特征工程实战全流程:从原始数据到房价预测 R² 0.82 的进阶之路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 6:04:33 阅读更多 →
claude-mem 记忆层实战:为 Claude 构建持久化记忆系统

claude-mem 记忆层实战:为 Claude 构建持久化记忆系统

1. 项目缘起与核心定位第一次看到 claude-mem 这个标题,我的直觉是:这应该是一个围绕 Claude 生态做“记忆层”的项目。事实也确实如此。它的核心目标很明确——给 Claude 这类大语言模型加上一层可持久化、可检索、可管理的记忆系统,让模型在…

2026/10/12 6:04:33 阅读更多 →
DeepSeek Harness局域网AI Agent平台Docker部署实战

DeepSeek Harness局域网AI Agent平台Docker部署实战

1. 为什么局域网里需要一个“能自己干活”的AI Agent平台最近两周,我帮三个不同背景的朋友搭过类似系统:一位做工业设备预测性维护的某公司工程师,想让大模型自动读取PLC日志并生成故障简报;一位高校实验室的某导师,希…

2026/10/12 6:04:33 阅读更多 →
有害气体控制洁净工程的底层逻辑:从过滤到吸附,从压差到监测

有害气体控制洁净工程的底层逻辑:从过滤到吸附,从压差到监测

空气里最危险的不是脏,而是失控:有害气体控制洁净工程的底层逻辑干了这么多年洁净工程,我越来越觉得“洁净”这个词会误导人。很多人一听到洁净室,想到的就是无尘、高等级过滤、白大褂和干干净净的地板,下意识把“颗粒…

2026/10/12 6:03:33 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →