第 4 章 抓包排查工具搭建:Charles/Wireshark 配置、mitmproxy 代理设置、tcpdump 抓取
隐私泄露问题的第一现场往往在网络请求的“电线”上。OkHttp 应用向外发送的每一个请求、接收的每一个响应,都可能携带敏感数据。搭建抓包环境是获取这些原始数据的起点,也是将“怀疑泄露”转化为“确切证据”的关键步骤。本章以故障排查视角,覆盖四种主流抓包工具的选型、配置与实战要点。
4.1 现象识别:何时需要抓包排查?
遇到以下现象之一,应立即启动抓包采集:
- Log 中看到意外请求 — 应用在后台向未知域名发送了 HTTPS 请求。
- 抓取到的响应包含不应出现的字段 — 例如登录接口返回了用户的手机号、身份证。
- 第三方 SDK 行为异常 — 怀疑 SDK 通过 OkHttp 拦截器上传了设备标识。
- 合规审计告警 — 数据安全平台报告存在未授权数据传输。
⚠ 启动抓包前务必确认合规要求:抓包可能涉及用户隐私数据的采集,生产环境下须获得数据安全负责人授权,并确保抓包链路不与真实用户流量混杂。
4.2 工具选型:对比矩阵
根据排查场景选择最合适的工具,避免“一个工具包打天下”造成的效率损失。
| 工具 | 适用场景 | 优点 | 局限 |
|---|---|---|---|
| Charles | HTTPS 请求/响应可视分析、断点修改 | 图形化良好、支持重放、Map Local | 仅支持 HTTP/HTTPS,不能抓非 HTTP 流量 |
| Wireshark | 全流量分析、底层协议、DNS 泄露 | 覆盖 TCP/UDP/TLS,可查看 TCP 重传 | HTTPS 解密需提前配置 TLS 密钥 |
| mitmproxy | CI/CD 环境、Python 脚本化拦截 | 可编程、命令行友好、自动生成 CA | UI 相对简陋,学习曲线略高 |
| tcpdump | 嵌入式/容器/服务器端无 GUI 场景 | 轻量、系统内置、可离线捕获 | 纯文本分析慢,需配合 Wireshark 解析 |
推荐组合:本地开发使用 Charles 快速检视,服务器环境使用 tcpdump + Wireshark 离线分析,自动化测试使用 mitmproxy 脚本化捕获。
4.3 工具配置与数据采集
以下按“排查流程”组织,每个工具均包含“配置 → 启动捕获 → 验证”三个步骤。
4.3.1 Charles 代理配置(macOS / Windows)
- 安装 SSL 证书:选择
Help → SSL Proxying → Install Charles Root Certificate,并在钥匙串/受信任根证书颁发机构中设为始终信任。 - 开启 SSL 代理:
Proxy → SSL Proxying Settings,添加*.example.com:443或*:443(全域名)。 - 配置设备代理:将手机/模拟器 WLAN 代理设为 Charles 所在机器 IP + 端口 8888。
- 抓取并验证:触发 OkHttp 请求,在 Charles 中看到“🔓”图标表示 TLS 解密成功。
# 检查 Charles 代理是否工作(终端在 Charles 机器上执行)
curl -x http://127.0.0.1:8888 https://api.example.com/v1/user -v
4.3.2 Wireshark 配置(全平台)
- 设置 TLS 解密密钥(用于查看 HTTPS 明文):配置
Edit → Preferences → Protocols → TLS → (Pre)-Master-Secret log filename。 - 在应用端导出密钥:设置环境变量
SSLKEYLOGFILE=~/sslkeys.log,然后启动 OkHttp 应用。 - 开始捕获:选择对应网卡,输入过滤表达式
tcp.port == 443。 - 检查隐私字段:在解密后的 HTTP/2 流中查找
password、等关键词。
4.3.3 mitmproxy 代理设置(命令行 / Docker)
- 启动 mitmproxy:
mitmproxy -p 8080 --set block_global=false - 安装 CA 证书:设备浏览器访问
mitm.it,下载对应平台证书并信任。 - 编写拦截脚本(如检测请求中是否包含
id_card字段):
# mitm_hook.py — 拦截并打印包含疑似隐私字段的请求
from mitmproxy import http
SENSITIVE_PATTERNS = ["id_card", "phone", "realname"]
def request(flow: http.HTTPFlow) -> None:
for p in SENSITIVE_PATTERNS:
if p in flow.request.pretty_url.lower():
print(f"[ALERT] 敏感字段 {p} 出现在: {flow.request.pretty_url}")
4.3.4 tcpdump 抓取(Linux / macOS)
- 捕获指定接口:
tcpdump -i en0 host api.example.com -w capture.pcap - 限制包大小(避免文件过大):
tcpdump -i en0 -s 0 -W 10 -C 100 -w capture.pcap - 查看实时统计:
tcpdump -i en0 -n -v 'tcp port 443' - 后分析:将
capture.pcap拉到有 Wireshark 的机器上,配合密钥日志解密。
常见故障定位表(抓包阶段)
| 现象 | 可能原因 | 应查看的点 |
|---|---|---|
| Charles 显示⚠️ | 未安装根证书或未信任 | System Trust 设置 |
| Wireshark 看不到解密内容 | SSLKEYLOGFILE 未生效 | 确认环境变量,检查进程是否继承 |
| mitmproxy 连接被拒 | 设备未配置代理或防火墙阻断 | ping 代理IP,查看 --listen-port |
| tcpdump 文件过大 | 未限制抓取条件 | 添加 -c 1000 或 -W 10 -C 50 |
4.4 原因定位:从抓包数据到泄露链路
获取原始流量后,按以下故障树逐层排查:
- 检查请求 URL 中的敏感参数(GET 方式最易泄露)
- 检查 POST Body 中的明文敏感字段(如身份证、支付密码)
- 检查 HTTP 头部(如
Authorization: Bearer xxx是否出现在不应出现的请求) - 检查 DNS 解析结果(Wireshark 查看
dns.qry.name,确认请求是否发往预期服务器)
⚠ 排查重点:OkHttp 的默认拦截器链中
RetryAndFollowUpInterceptor 可能因重定向泄露原始请求中的敏感 Header。抓包时注意观察 Location 响应头是否携带了原始 。
4.5 修复动作与复测
- 修复动作:基于抓包结果,修改 OkHttp 拦截器逻辑:
// 禁止在非 TLS 请求中发送 if (!request.isHttps()) { request = request.newBuilder() .removeHeader("Authorization") .build(); } - 复测:使用相同的抓包工具再次触发同样的场景,确认敏感字段不再出现。建议同时对比修复前后的抓包文件,确认“前有后有”的模式消失。
4.6 预防:抓包基建固化
- 将抓包配置脚本化(Dockerfile + mitmproxy 启动脚本),集成到 CI 环境。
- 在开发环境中预置
SSLKEYLOGFILE环境变量,方便随时抓包。 - 编写定期扫描脚本,自动分析抓包文件中的敏感关键词,并在检测到泄露时发送告警。
基准参考:将本章的工具配置步骤纳入团队《安全开发 SOP》,每次 PR 合并前自动执行一次“模拟用户操作 + tcpdump 抓包”的合规验证。