前言

HTTPS 采用 SSL/TLS 加密传输,常规 Fiddler、浏览器开发者工具只能查看前端请求,无法直接拿到 APP / 小程序加密接口原始报文;mitmproxy 实现中间人劫持 SSL 证书解密 HTTPS 流量,自动捕获请求头、加密参数、Cookie、接口密文,是 APP 逆向、小程序爬虫抓包核心工具。本章落地 mitmdump 脚本二次开发、证书部署、移动端 / 模拟器抓包、请求实时篡改、自动保存抓包数据,对接前面 JS 逆向、接口加密爬虫工程。

本文所需依赖官方文档超链接:

  1. mitmproxy 官方文档
  2. Requests 官方文档

一、HTTPS 中间人抓包原理

1.1 加密与劫持逻辑

  1. 客户端与目标服务器建立 SSL 握手,正常场景证书由 CA 机构签发;
  2. 配置手机 / 模拟器代理指向 mitmproxy 服务,客户端访问 HTTPS 域名;
  3. mitmproxy 下发自签根证书,伪装目标域名证书完成握手,双向解密收发报文;
  4. 明文请求经过中间人解析后再转发至真实服务器,实现全量 HTTPS 明文抓包。

1.2 适用场景

APP 爬虫抓包、微信小程序接口捕获、动态接口加密参数实时采集、请求参数篡改调试。

二、环境安装

bash

运行

# 安装mitmproxy套件(mitmproxy/mitmdump/mitmweb)
pip install mitmproxy==10.3.0
  • mitmweb:带网页可视化抓包面板;
  • mitmdump:无界面脚本化运行,生产环境首选。

三、证书安装关键步骤

  1. 启动任意一次 mitmdump,目录~/.mitmproxy/生成全套证书;
  2. mitmproxy-ca-cert.pem发送到手机,安卓安装证书至用户证书,iOS 描述文件安装并开启信任;
  3. 手机 WIFI 代理填写本机 IP+mitm 默认端口 8080。

四、模块 1:基础抓包脚本(保存全部请求到本地 JSON)

新建capture_all.py

python

运行

from mitmproxy import http
import json
import os

SAVE_DIR = "./mitm_capture/"
os.makedirs(SAVE_DIR,exist_ok=True)

def response(flow: http.HTTPFlow):
    """请求响应结束触发,存储接口数据"""
    # 过滤非目标域名,按需修改关键词
    target_key = "api.goods.com"
    if target_key not in flow.request.pretty_url:
        return
    data = {
        "url": flow.request.pretty_url,
        "method": flow.request.method,
        "req_header": dict(flow.request.headers),
        "req_body": flow.request.text,
        "resp_code": flow.response.status_code,
        "resp_body": flow.response.text
    }
    # 文件名去特殊字符
    filename = flow.request.pretty_url.split("/")[-1].replace("?","_") + ".json"
    with open(os.path.join(SAVE_DIR,filename),"w",encoding="utf-8") as f:
        json.dump(data,f,ensure_ascii=False,indent=2)
    print(f"已捕获接口:{flow.request.pretty_url}")

启动抓包命令:

bash

运行

mitmdump -s capture_all.py -p 8080

五、模块 2:中间人动态篡改请求参数(逆向调试神器)

修改请求入参、新增 sign 签名、替换 Cookie,绕过前端参数校验:

python

运行

from mitmproxy import http

def request(flow: http.HTTPFlow):
    # 匹配需要篡改的接口
    if "api/getprice" in flow.request.pretty_url:
        # GET参数修改
        if flow.request.method == "GET":
            flow.request.query["page"] = "1"
            flow.request.query["timestamp"] = "1750000000"
        # POST JSON参数篡改
        elif flow.request.method == "POST":
            import json
            req_json = json.loads(flow.request.text)
            req_json["userid"] = "999999"
            flow.request.text = json.dumps(req_json)
        # 自定义添加请求头Cookie
        flow.request.headers["Cookie"] = "sessionid=mitm_test_ck123"

六、模块 3:实时推送抓包接口至 Redis(对接分布式爬虫)

捕获接口 URL 与加密参数实时入 Redis 任务队列,爬虫自动消费:

python

运行

import redis
from mitmproxy import http

rds = redis.Redis(host="127.0.0.1",port=6379,db=0,decode_responses=True)
TASK_KEY = "dist:crawl:task_queue"

def response(flow: http.HTTPFlow):
    if "api/goods/list" in flow.request.pretty_url:
        url = flow.request.pretty_url
        rds.lpush(TASK_KEY,url)
        print(f"抓包推送任务至Redis:{url}")

配合前文 Redis 分布式爬虫,APP 上新数据自动生成抓取任务。

七、mitmweb 可视化调试(新手调试优选)

启动命令:

bash

运行

mitmweb -p 8080

自动打开浏览器可视化面板,实时筛选域名、查看请求报文、断点篡改参数。

八、模拟器抓包配置(雷电 / 夜神模拟器)

  1. WIFI 代理设置:IP 为电脑局域网 IP,端口 8080;
  2. 模拟器内安装 mitmproxy 证书;
  3. 启动 APP 自动抓取全部 HTTPS 接口。

九、常见异常与排错表

表格

故障 解决方案
HTTPS 访问提示证书不安全 重装证书,iOS 开启证书全信任,安卓 13 + 需系统证书挂载
部分 APP 抓包直接无网络 APP 启用 SSL Pinning 证书锁定,后续章节讲解证书绕过
抓不到小程序接口 微信自带 SSL 校验,配置系统级证书或 hook 绕过
端口占用 -p 更换监听端口,如 mitmdump -s xx.py -p8888

十、结合逆向链路落地流程

  1. mitmproxy 抓包拿到加密接口 URL、参数、sign 生成规则;
  2. F12/JS 逆向定位前端加密函数,解混淆还原算法;
  3. Python 复刻 AES/RSA/MD5 签名,构造密文对接爬虫请求;
  4. 抓到新接口自动推送 Redis,分布式集群自动抓取。

十一、本章总结

mitmproxy 中间人抓包核心价值:解密 HTTPS 原始报文、实时篡改参数、自动捕获 APP / 小程序接口;调试阶段用 mitmweb 可视化,生产爬虫自动化用 mitmdump + 脚本落地,抓包数据落地本地 / Redis 实现爬虫任务自动化。后续拓展:SSL Pinning 绕过、frida+mitm 联动 APP 脱壳抓包、抓包数据自动解析提取密钥与盐值。

更多推荐