5、Android真机抓包:真机代理设置、真机证书安装、真机流量捕获

好,到了这一章,咱们终于要上真机了。

模拟器里抓包虽然方便,但说实话,很多App在模拟器里根本跑不起来——要么检测环境,要么直接闪退。我当年第一次做银行App的渗透测试时,就吃了这个亏。模拟器里装了半天证书,结果App一打开就提示“检测到风险环境”,直接退出。没办法,只能老老实实上真机。

真机抓包,说白了就三步:设代理、装证书、抓流量。每一步都有坑,咱们一个一个说。

5.1 真机代理设置

先讲代理设置。这一步看起来简单,但很多人第一步就翻车了。

5.1.1 手动设置代理

Android手机设置代理的路径大同小异:

  • Wi-Fi设置 → 长按当前连接的Wi-Fi → 修改网络 → 显示高级选项
  • 代理 → 选择“手动”
  • 主机名 → 输入你电脑的IP地址(抓包工具所在机器)
  • 端口 → 输入抓包工具监听的端口(比如Charles默认8888,Burp默认8080)
小技巧: 我个人习惯在电脑上先开一个HTTP服务,用手机浏览器访问一下,确认IP地址能通。别等到抓包工具都配好了,才发现手机和电脑不在同一个网段。

5.1.2 代理设置后的验证

设置完代理后,怎么确认生效了?

打开手机浏览器,随便访问一个HTTP网站(注意,是HTTP,不是HTTPS)。如果抓包工具里能看到请求,说明代理通了。

如果看不到?嗯,常见原因就这几个:

  • 手机和电脑不在同一个Wi-Fi下(别笑,我见过有人手机连的4G,电脑连的公司Wi-Fi)
  • 防火墙没放行端口(Windows防火墙、Mac的防火墙,或者公司网络策略)
  • 抓包工具没开启代理监听(比如Charles要勾选“Proxy” → “Windows Proxy”或“Mac OS X Proxy”)
注意: 有些App会检测系统代理设置。如果设置了代理后App无法联网,说明它做了代理检测。这时候就需要用VPN抓包或者Drony这类工具来绕过。后面章节会讲。

5.2 真机证书安装

代理通了,但你会发现——HTTPS的流量全是乱码。为什么?因为证书没装。

HTTPS抓包的原理,说白了就是中间人攻击。抓包工具生成一个自己的CA证书,手机信任了这个CA,抓包工具就能解密HTTPS流量。如果不装证书,手机不认这个“假证书”,连接就会失败。

5.2.1 导出抓包工具的CA证书

不同工具导出证书的方式不一样:

工具 导出方式
Charles Help → SSL Proxying → Save Charles Root Certificate
Burp Suite Proxy → Options → Import/Export CA certificate → Export
mitmproxy 运行 mitmproxy 后,访问 mitm.it 下载

导出的证书一般是 .pem 或 .crt 格式。我个人习惯用 .crt,因为Android对 .pem 的支持有时候会抽风。

5.2.2 Android 7.0+ 的证书信任问题

这里有个大坑,我必须重点说。

Android 7.0(API 24)开始,系统默认只信任系统级CA证书,不信任用户安装的证书。也就是说,你按老方法把证书装到“设置 → 安全 → 从存储设备安装”,对大多数App来说根本没用。

为什么会这样?因为Google觉得用户自己装的证书不安全,容易被中间人攻击。但对我们做安全测试的人来说,这简直是噩梦。

解决方案有两个:
  1. Root手机,把证书装到系统分区(后面会详细讲)
  2. 使用VirtualXposed或太极等框架,在虚拟环境中安装证书(适合不想root的情况)

5.2.3 用户级证书安装步骤

虽然用户级证书对Android 7.0+的App无效,但至少能让浏览器和部分不检测证书的App正常工作。步骤很简单:

  1. 把证书文件传到手机(可以用微信、QQ、或者adb push)
  2. 打开“设置” → “安全” → “加密与凭据” → “从存储设备安装”
  3. 选择证书文件,输入名称(随便起),确定
  4. 到“信任的凭据” → “用户”标签页,确认证书已安装
避坑指南: 我曾经遇到过证书安装后显示“已安装”,但抓包时仍然报错。后来发现是证书格式问题。Android要求证书必须是X.509格式,DER编码。如果导出的证书是PEM格式,可以用OpenSSL转换一下:
openssl x509 -inform PEM -outform DER -in charles.pem -out charles.crt

5.2.4 系统级证书安装(需要Root)

如果你手机已经Root了,那事情就简单了。把证书装到系统分区,所有App都会信任它。

步骤:

  1. 计算证书的哈希值:
    openssl x509 -inform PEM -subject_hash_old -in charles.pem | head -1
    会输出一串数字,比如 9a5ba575
  2. 把证书重命名为 9a5ba575.0
  3. 用adb把文件push到 /system/etc/security/cacerts/ 目录:
    adb push 9a5ba575.0 /sdcard/
    adb shell
    su
    mount -o remount,rw /system
    cp /sdcard/9a5ba575.0 /system/etc/security/cacerts/
    chmod 644 /system/etc/security/cacerts/9a5ba575.0
    reboot
警告: 操作系统分区有风险。搞不好会变砖。如果你不熟悉adb和root操作,建议先在旧手机上练习。我当年第一次操作时,不小心把 /system 目录权限改错了,结果手机无限重启……嗯,那台手机后来成了我的“专用砖头”。

5.3 真机流量捕获

证书装好了,代理设好了,终于可以抓流量了。

5.3.1 配置SSL代理

以Charles为例,抓HTTPS流量还需要额外配置:

  1. Proxy → SSL Proxying Settings
  2. 勾选“Enable SSL Proxying”
  3. 点击“Add”,Host填 *,Port填 443(或者填具体的域名和端口)
  4. 确定,重启抓包

Burp Suite的话,默认就会拦截HTTPS流量,只要证书装好了就行。

5.3.2 开始抓包

现在打开手机上的目标App,操作一下。回到电脑上看抓包工具——

如果一切正常,你应该能看到一条条HTTPS请求,点开就能看到明文内容。请求头、请求体、响应头、响应体,一览无余。

如果还是乱码?嗯,检查一下:

  • 证书是否真的装好了(去“信任的凭据”里确认)
  • SSL代理是否配置正确(Host和Port有没有填对)
  • App是否做了证书绑定(这个后面章节会讲)

5.3.3 过滤和搜索

抓包工具里流量一多,找起来就费劲。我一般会:

  • 按域名过滤(只看目标App的请求)
  • 按请求类型过滤(只看JSON、只看图片等)
  • 用关键词搜索(比如搜索“token”、“password”、“api”等敏感词)
个人习惯: 我会在抓包前先清空一次日志,然后只抓我需要的操作。比如登录流程,我就先清空,然后点登录,再看抓到的请求。这样不会混入其他无关流量。

5.4 知识体系总览

这一章的内容,说白了就是下面这张图。我画了个流程图,方便你理解整个流程:

Android真机抓包流程 第一步:设置代理 手机Wi-Fi → 手动代理 第二步:安装证书 导出CA → 安装到手机 第三步:捕获流量 配置SSL → 开始抓包 用户级证书(Android 7.0+无效) 设置 → 安全 → 从存储设备安装 系统级证书(需要Root) adb push → /system/etc/security/cacerts/ ⚠ 注意:Android 7.0+ 默认不信任用户证书,需Root或使用VirtualXposed 常见问题排查 ① 代理不通 → 检查IP/端口/防火墙 ② 证书无效 → 检查格式/安装位置 ③ 流量乱码 → 检查SSL代理配置

5.5 实战小贴士

最后,分享几个我踩过的坑:

  • 证书过期: Charles的CA证书默认有效期是10年,但如果你重新生成了证书,手机上旧的证书就失效了。记得重新安装。
  • 代理冲突: 有些手机同时开了VPN和代理,会导致抓包失败。关掉VPN再试。
  • App检测代理: 如果设置了代理后App直接报“网络异常”,说明它做了代理检测。这时候可以用Drony或者Postern这类工具,把代理转成VPN模式。

好了,真机抓包的基本操作就这些。下一章咱们会讲更高级的内容——当App做了证书绑定,你该怎么办。


公众号:蓝海资料掘金营,微信deep3321