5、Android真机抓包:真机代理设置、真机证书安装、真机流量捕获
好,到了这一章,咱们终于要上真机了。
模拟器里抓包虽然方便,但说实话,很多App在模拟器里根本跑不起来——要么检测环境,要么直接闪退。我当年第一次做银行App的渗透测试时,就吃了这个亏。模拟器里装了半天证书,结果App一打开就提示“检测到风险环境”,直接退出。没办法,只能老老实实上真机。
真机抓包,说白了就三步:设代理、装证书、抓流量。每一步都有坑,咱们一个一个说。
5.1 真机代理设置
先讲代理设置。这一步看起来简单,但很多人第一步就翻车了。
5.1.1 手动设置代理
Android手机设置代理的路径大同小异:
- Wi-Fi设置 → 长按当前连接的Wi-Fi → 修改网络 → 显示高级选项
- 代理 → 选择“手动”
- 主机名 → 输入你电脑的IP地址(抓包工具所在机器)
- 端口 → 输入抓包工具监听的端口(比如Charles默认8888,Burp默认8080)
5.1.2 代理设置后的验证
设置完代理后,怎么确认生效了?
打开手机浏览器,随便访问一个HTTP网站(注意,是HTTP,不是HTTPS)。如果抓包工具里能看到请求,说明代理通了。
如果看不到?嗯,常见原因就这几个:
- 手机和电脑不在同一个Wi-Fi下(别笑,我见过有人手机连的4G,电脑连的公司Wi-Fi)
- 防火墙没放行端口(Windows防火墙、Mac的防火墙,或者公司网络策略)
- 抓包工具没开启代理监听(比如Charles要勾选“Proxy” → “Windows Proxy”或“Mac OS X Proxy”)
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觉得用户自己装的证书不安全,容易被中间人攻击。但对我们做安全测试的人来说,这简直是噩梦。
- Root手机,把证书装到系统分区(后面会详细讲)
- 使用VirtualXposed或太极等框架,在虚拟环境中安装证书(适合不想root的情况)
5.2.3 用户级证书安装步骤
虽然用户级证书对Android 7.0+的App无效,但至少能让浏览器和部分不检测证书的App正常工作。步骤很简单:
- 把证书文件传到手机(可以用微信、QQ、或者adb push)
- 打开“设置” → “安全” → “加密与凭据” → “从存储设备安装”
- 选择证书文件,输入名称(随便起),确定
- 到“信任的凭据” → “用户”标签页,确认证书已安装
openssl x509 -inform PEM -outform DER -in charles.pem -out charles.crt
5.2.4 系统级证书安装(需要Root)
如果你手机已经Root了,那事情就简单了。把证书装到系统分区,所有App都会信任它。
步骤:
- 计算证书的哈希值:
openssl x509 -inform PEM -subject_hash_old -in charles.pem | head -1
会输出一串数字,比如9a5ba575 - 把证书重命名为
9a5ba575.0 - 用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
/system 目录权限改错了,结果手机无限重启……嗯,那台手机后来成了我的“专用砖头”。
5.3 真机流量捕获
证书装好了,代理设好了,终于可以抓流量了。
5.3.1 配置SSL代理
以Charles为例,抓HTTPS流量还需要额外配置:
- Proxy → SSL Proxying Settings
- 勾选“Enable SSL Proxying”
- 点击“Add”,Host填
*,Port填443(或者填具体的域名和端口) - 确定,重启抓包
Burp Suite的话,默认就会拦截HTTPS流量,只要证书装好了就行。
5.3.2 开始抓包
现在打开手机上的目标App,操作一下。回到电脑上看抓包工具——
如果一切正常,你应该能看到一条条HTTPS请求,点开就能看到明文内容。请求头、请求体、响应头、响应体,一览无余。
如果还是乱码?嗯,检查一下:
- 证书是否真的装好了(去“信任的凭据”里确认)
- SSL代理是否配置正确(Host和Port有没有填对)
- App是否做了证书绑定(这个后面章节会讲)
5.3.3 过滤和搜索
抓包工具里流量一多,找起来就费劲。我一般会:
- 按域名过滤(只看目标App的请求)
- 按请求类型过滤(只看JSON、只看图片等)
- 用关键词搜索(比如搜索“token”、“password”、“api”等敏感词)
5.4 知识体系总览
这一章的内容,说白了就是下面这张图。我画了个流程图,方便你理解整个流程:
5.5 实战小贴士
最后,分享几个我踩过的坑:
- 证书过期: Charles的CA证书默认有效期是10年,但如果你重新生成了证书,手机上旧的证书就失效了。记得重新安装。
- 代理冲突: 有些手机同时开了VPN和代理,会导致抓包失败。关掉VPN再试。
- App检测代理: 如果设置了代理后App直接报“网络异常”,说明它做了代理检测。这时候可以用Drony或者Postern这类工具,把代理转成VPN模式。
好了,真机抓包的基本操作就这些。下一章咱们会讲更高级的内容——当App做了证书绑定,你该怎么办。
公众号:蓝海资料掘金营,微信deep3321