第 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)

  1. 安装 SSL 证书:选择 Help → SSL Proxying → Install Charles Root Certificate,并在钥匙串/受信任根证书颁发机构中设为始终信任。
  2. 开启 SSL 代理:Proxy → SSL Proxying Settings,添加 *.example.com:443 或 *:443(全域名)。
  3. 配置设备代理:将手机/模拟器 WLAN 代理设为 Charles 所在机器 IP + 端口 8888。
  4. 抓取并验证:触发 OkHttp 请求,在 Charles 中看到“🔓”图标表示 TLS 解密成功。
# 检查 Charles 代理是否工作(终端在 Charles 机器上执行)
curl -x http://127.0.0.1:8888 https://api.example.com/v1/user -v

4.3.2 Wireshark 配置(全平台)

  1. 设置 TLS 解密密钥(用于查看 HTTPS 明文):配置 Edit → Preferences → Protocols → TLS → (Pre)-Master-Secret log filename。
  2. 在应用端导出密钥:设置环境变量 SSLKEYLOGFILE=~/sslkeys.log,然后启动 OkHttp 应用。
  3. 开始捕获:选择对应网卡,输入过滤表达式 tcp.port == 443。
  4. 检查隐私字段:在解密后的 HTTP/2 流中查找 password、 等关键词。

4.3.3 mitmproxy 代理设置(命令行 / Docker)

  1. 启动 mitmproxy:mitmproxy -p 8080 --set block_global=false
  2. 安装 CA 证书:设备浏览器访问 mitm.it,下载对应平台证书并信任。
  3. 编写拦截脚本(如检测请求中是否包含 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)

  1. 捕获指定接口:tcpdump -i en0 host api.example.com -w capture.pcap
  2. 限制包大小(避免文件过大):tcpdump -i en0 -s 0 -W 10 -C 100 -w capture.pcap
  3. 查看实时统计:tcpdump -i en0 -n -v 'tcp port 443'
  4. 后分析:将 capture.pcap 拉到有 Wireshark 的机器上,配合密钥日志解密。
常见故障定位表(抓包阶段)
现象可能原因应查看的点
Charles 显示⚠️未安装根证书或未信任System Trust 设置
Wireshark 看不到解密内容SSLKEYLOGFILE 未生效确认环境变量,检查进程是否继承
mitmproxy 连接被拒设备未配置代理或防火墙阻断ping 代理IP,查看 --listen-port
tcpdump 文件过大未限制抓取条件添加 -c 1000 或 -W 10 -C 50

4.4 原因定位:从抓包数据到泄露链路

获取原始流量后,按以下故障树逐层排查:

  1. 检查请求 URL 中的敏感参数(GET 方式最易泄露)
  2. 检查 POST Body 中的明文敏感字段(如身份证、支付密码)
  3. 检查 HTTP 头部(如 Authorization: Bearer xxx 是否出现在不应出现的请求)
  4. 检查 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 抓包”的合规验证。
抓包排查工具搭建与排查流程 1. 现象识别 2. 工具选型 Charles · Wireshark · mitmproxy · tcpdump 3. 配置与数据采集 安装证书 · 代理设置 · TLS 密钥 · 启动抓包 4. 原因定位(故障树排查) 5. 修复动作 → 复测 → 预防 关键 HTTPS 解密 证书 信任 环境 变量 过滤 规则 敏感 字段 正则 匹配