抓包目的
线上的产品出现BUG无法通过代码注入或者获取日志的方式定位问题,或者要抓取第三方应用程序的接口。这时候就需要用到抓包了,它通过一种网络层的方式来获取所有的网络请求。
抓包原理
目前 Windows 上主流的抓包软件有两类
- 监听网卡(Wireshark)
- 监听端口(Fiddler)
Wireshark
Wireshark 通过 libpcap/WinPcap 从底层抓取网络数据包,并通过不同类型的网络接口(包括以太网、令牌环网、ATM网等)获取数据包。
Fiddler
Fiddler 抓包的原理主要是开启一个 HTTP 网络代理服务,监听并拦截本机某端口的 HTTP 请求,再将其转发到目标服务器。
其行为类似 中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)
区别
- Fiddler 仅作为监听 HTTP/HTTPS/FTP 的专用软件,简单好用,界面直观。
- Wireshark 是全能软件,除了 HTTP/HTTPS,TCP,ICMP 之类的包也不在话下,但是功能就比较复杂了,操作略显繁琐
下载 Fiddler
https://www.telerik.com/download/fiddler/fiddler4
Fliddler 抓取 PC 上的 HTTPS
https 的协议是带有安全功能,
- 工具栏 Tools —> Options,打开 Options 对话框。
- 因为我们要捕获的是 HTTPS,切换到 HTTPS 选项卡,勾选 Decrypt HTTPS traffic(解密 HTTPS 通信)
- 在弹出的 SCARY TEXT AHEAD:Read Carefully!(前面有可怕的文字:请仔细阅读),勾选 Yes,表示信任 Fiddler 的根证数。
下面,开始抓取 HTTPS 的网络通信了
- 删除之前的所有记录
- 浏览器打开百度,搜索一个关键词,我这里搜索 “数码宝贝”
- 右侧的选项卡切换到 “WebForms”,即可查看到所有请求参数了。该表格中的值字段会将 URLEncode 之后的字符进行解码,从而展现一个原始的字符串,方便查看。
Fiddler 抓取 Android 上的 HTTPS
获取证数
- 首先,将手机与PC连到同一个局域网(同一个WIFI)
- 工具栏 Tools —> Options,打开 Options 对话框。
- 在 Connections 选项卡中,勾选 Allow remote computers to connect,允许远程计算机连接
- 切换到 HTTPS 选项卡,点击 Actions 按钮,Export Root Certificate to Desktop,将 FiddlerRoot.cer 证数导出到桌面。
- 将 FiddlerRoot.cer 下载到手机中
将证数安装到手机
我用的是乐檬3S,andorid 6.0
如果直接点击证数文件,会提示 “无法安装该证数,因为无法读取证数文件”。
解决办法:
设置 —> 安全 —> 凭据存储 —> 从内部存储设备安装。然后打开证数,随便起一个名字,凭证用途选则 “VPN和应用”,点击确定。证数就被安装进去了。
设置 —> 安全 —> 凭据存储 —> 信任的凭据,可以看到,刚刚安装的 Fiddler 证数,被安装到用户证数,这一栏里了,还自动添加了一个前缀 DO_NOT_TRUST
但不影响,至此,证数安装成功
添加证数后,有的手机需要重启一下才能生效,否则很多信息捕获不到
设置代理
- 使用 ipconfig,查看当前网络地址。
- 在手机上长按 wifi,修改当前网络。勾选 “高级选项”,代理改为手动,服务器主机名填入“上面的IP地址”,端口号填入 8888(这个就是 Tools -> Option -> Connections 中监听的端口)
开始抓取
抓取百度搜索关键词
跟之前一样,清空抓取结果列表。然后使用手机浏览器,访问百度,我这里搜的关键词是 “圣斗士星矢”,从右侧的 WebForms 列表中,可以看到,访问记录已经被捕获了。
抓取酷狗音乐歌曲链接
手机打开酷狗APP,搜索 “年少有为” 这首歌,点击播放。这时候 Content-Type = audio/mpeg 的就是歌曲链接了。
高版本限制
Android 7.0 及后面的版本,即便是导入了 Fiddler 根证数,应用的 URLConnection、OkHttp、Retrofit、WebView,也仍然不会信任它。
原因在 Android 的官网上有说 https://developer.android.google.cn/training/articles/security-config.html
网络安全配置
借助网络安全配置功能,应用可以在一个安全的声明性配置文件中自定义其网络安全设置,而无需修改应用代码。您可以针对特定网域和特定应用配置这些设置。此功能的主要特性如下所示:
- 自定义信任锚:针对应用的安全连接自定义哪些证数机构(CA)值得信赖。例如,信任特定的自前面证数或限制应用信任的公共CA集
- 仅调试替换:在应用中以安全的方式调试安全连接,而不会增加安装设备的风险
- 选择停用文明流量:防止应用意外使用明文流量
- 证数固定:限制应用仅安全连接到特定的证数
添加网络安全配置文件
在 AndroidManifest.xml 中,application 标签下,添加 android:networkSecurityConfig 属性,指向 res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
配置文件格式
res/xml/network_security_config.xml 文件的格式如下
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="..."/>
...
</trust-anchors>
</base-config>
<domain-config>
<domain>android.com</domain>
...
<trust-anchors>
<certificates src="..."/>
...
</trust-anchors>
<pin-set>
<pin digest="...">...</pin>
...
</pin-set>
</domain-config>
...
<debug-overrides>
<trust-anchors>
<certificates src="..."/>
...
</trust-anchors>
</debug-overrides>
</network-security-config>
标签含义
- base-config 配置可信赖的域名和CA(应用范围的自定义)
- domain-config 配置可信赖的域名和CA(网域范围的自定义)
- domain 信赖的域名
- trust-auchors 信任其他CA
- debug-overrides 配置用于调试的CA
- pin-set 固定证数集合,可设置其有效时间
- pin 公钥的哈希值(X.509证书的 SubjectPublicKeyInfo)
- cleartextTrafficPermitted 允许明文的HTTP
自定义可信CA
应用可能需要信任自定义的 CA 集,而不是平台默认值。出现此情况的最常见原因包括:
- 连接到具有自定义证书授权机构(如自签名或在公司内部签发的CA)的主机
- 仅限您信任的CA(而不是每个预装CA)
- 信任未包含在系统中的其他CA
默认情况下,来自所有应用的安全连接(使用 TLS 和 HTTPS 之类的协议)均信任预装的系统CA,而面向 Android 6.0(API 级别 23)及更低版本的应用默认情况下还会信任用户添加的 CA 存储区。 应用可以使用 base-config(应用范围的自定义)或 domain-config(网域范围的自定义)自定义自己的连接。
因此,在 Android 7.0及以上的版本中,Fiddler 的证书会被安装到 “用户区”。但这个用户区又是默认不被信任的。因此,我们只需要添加上述配置,让应用程序信任用户区的 CA 即可
<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:android="http://schemas.android.com/apk/res/android">
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" overridePins="true" />
<certificates src="user" overridePins="true" />
</trust-anchors>
</base-config>
</network-security-config>
第三方程序,绕过限制
Android7.0及以上系统,默认只信任系统自带的CA
解决方案
1、直接使用低版本系统化的安卓手机(低于7.0)
2、使用Xposed或兼容Xposed的框架 + JustTrustMe
3、将抓包工具的证书直接安装到系统根目录中
4、VirtualXposed(VirtualAPP)
安装好后,把你要抓包的app在VirtualXposed克隆一份,连接抓包工具(例如fiddler),使用app就可以顺利抓包破解ssl pinning。