背景
拦截http proxy的软件很多,如 Fiddler
,Charles
等,能够实现对http通信的拦截,可以查验Request和Response参数,特别是移动设备快速普及,此类软件逐渐被用于移动设备APP的网络请求拦截。
Charles的使用
链接: https://pan.baidu.com/s/14ljJGK0r1UzN0hywbTWRXQ
提取码: 6xjn
PC端安装证书
导出证书
此时证书还是不被信任的,让不信任变成信任:
导出证书
输入密码
选择保存位置
注意
文件名不能少。
导入证书
打开Internet属性
窗口
Win + R
快捷键调出运行
对话框,输入inetcpl.cpl
,确定即可。
导入刚才导出的证书即可。
选择文件的时候注意筛选文件类型
配置抓包域名
Proxy
–>SSL Proxying Settings
–>SSL Proxying
中添加域名 比如
- Host:*.baidu.com
- Port:443
重启
配置后要重启被抓包的客户端和Charles
Android安装证书
Help
–>SSL Proxying
–>Install Charles Root Certificate on a Mobile Device or Remote Browser
设置手机代理 比如我的是192.168.2.1:8888
在浏览器中打开 http://chls.pro/ssl
或者扫描如下二维码
Android 手机可以在“设置–>安全–>从SD卡安装证书”中安装刚才下载的证书。
不用的Android位置不一样,我们可以搜索从SD卡安装
找到对应的配置,选择下载的证书安装即可。
下载的位置默认在Downloads
文件夹中。
证书到期
删除过期的SSL安全证书:打开Charles软件,依次选择Help
->SSL Proxying
->Reset Charles Root Certificate
。
然后再按照上面的经行证书导出和导入。
如果这时还是不能监控到https请求,可以依次选择Proxy
->SSL Proxying Settings
,在这个里面添加一个:
即可。
注意
Android端也要记得重新安装新证书。
APP无法抓包的原因
抓不到包,很可能目标APP使用了其它HTTP Client,比如自带一个libcurl的so,那样最终调用的是系统的Socket API,WLAN上设置的HTTP/HTTPS代理对它无效,但其实这种情况很少,市面上绝大多数的应用,都是使用URLConnection和OkHttp,尤其是近些年的应用,几乎都是清一色的OkHttp,所以绝大多数情况下都能抓到包,如果抓不到,很可能是应用自己进行了额外的SSL证书校验工作,根据情况再特殊分析特殊处理。
注意
Android7.0以后抓包失败:App自己不信任用户证书,只信任系统证书
简单来说,抓不到有几个可能:
- App自己不走代理,哪怕你设了代理。这种就只能强制走代理。
- App自己不信任用户证书,只信任系统证书
- App自己连系统证书也不信任,只信任特定证书。SSLPinning的问题。
像支付宝那样的变态,自己带了一个基于so的HTTP Client库,对于关键数据,都不走URLConnection和OkHttp,而是走自己的HTTP Client库,甚至一些WebView页面的渲染,都是先用自带的HTTP Client请求得到json数据,然后填到HTML模板里面,再在WebView里渲染出来。
还有一种情况
请求包虽然能抓到,但是内容加密了,这种只能逆向查看解密方法进行解密了。
APP HTTPS 抓包
Android从7.0开始系统不再信任用户CA证书(应用targetSdkVersion >= 24时生效,如果targetSdkVersion < 24即使系统是7.0+依然会信任)。
也就是说即使安装了用户CA证书,在Android 7.0+的机器上,targetSdkVersion >= 24
的应用的HTTPS包就抓不到了。
比如上面的例子,抓包工具用内置的CA证书,创建了www.baidu.com域名的公钥证书发给Client,
系统校验此证书时发现是用户CA证书签发的,sorry。。。那么,我们如果绕过这种限制呢?
已知有以下5种方式(低于7.0的系统请忽略)。
配置networkSecurityConfig
只能是自己的项目,自己的项目也不推荐,不安全。
配置networkSecurityConfig
如果我们想抓自己的App,只需要在AndroidManifest
中配置networkSecurityConfig
即可:
1 |
|
network_security_config
1 |
|
这样即表示,App信任用户CA证书,让系统对用户CA证书的校验给予通过。更多相关信息,详见
Network security configuration:
https://developer.android.com/training/articles/security-config
调低targetSdkVersion < 24
只能是自己的项目
如果想抓一个App的包,可以找个历史版本,只需要其targetSdkVersion < 24即可。
然而,随着GooglePlay开始限制targetSdkVersion,现在要求其必须>=26,2019年8月1日后必须>=28,国内应用市场也开始逐步响应这种限制。
绝大多数App的targetSdkVersion都将大于24了,也就意味着抓HTTPS的包越来越难操作了。
模拟器抓包(推荐)
这是最推荐的方式,使用简单。
模拟器中设置代理即可不用安装证书,因为网络走的本机,只要本机安装证书即可。
安装系统版本是Android6的模拟器
推荐模拟器
一定要选择Android6版本的。
链接:https://pan.baidu.com/s/1LwABhHS9OHLABvrHANA9lw
提取码:psvm
平行空间抓包
平行空间兼容性差,如不支持64位,需要插件。
http://www.parallel-app.com/index_cn.php
https://www.52pojie.cn/thread-1315784-1-1.html
如果我们希望抓 targetSdkVersion >= 24 的应用的包,那又该怎么办呢?
我们可以使用平行空间或者 VirtualApp 来曲线救国。
平行空间和 VirtualApp 这种多开应用可以作为宿主系统来运行其它应用,如果平行空间和 VirtualApp 的 targetSdkVersion < 24,那么问题也就解决了。
在此,我推荐使用平行空间,相比部分开源的 VirtualApp,平行空间运行得更加稳定。
但必须注意
平行空间的版本 4.0.8625 以下才是 targetSdkVersion < 24,别安装错了。
安装到系统 CA 证书目录
需要手机Root
对于 Root 的机器,这是最完美最佳的解决方案。如果把 CA 证书安装到系统 CA 证书目录中,那这个假 CA 证书就是真正洗白了,不是真的也是真的了。
由于系统 CA 证书格式都是特殊的 .0 格式,我们必须将抓包工具内置的 CA 证书以这种格式导出,HttpCanary 直接提供了这种导出选项。
操作路径:设置 → SSL 证书设置 → 导出 HttpCanary 根证书 → System Trusted(.0)
PS. 很不幸的 HttpCanary v2.8.0 前导出的证书名称可能不正确,建议升级到 v2.8.0 以上版本操作。
导出 .0 格式的证书后,
可以使用 MT 管理器将 .0 文件复制到 /etc/security/cacerts/
目录下,
或者通过 adb remount 然后 push 也可
(这里稍微提一下,别在 sdcard 里找这个目录)。
重新打包
重新打包目标APK,修改AndroidManifest.xml
我们可以使用Apktool等工具对目标APK进行解包,添加 net_security_config.xml
]并修改 AndroidManifest.xml
]然后重新打包。
但是现在很多应用都做了防打包处理,要么利用Apktool弱点,制造错误让Apktool抛异常,要么重新打包后程序校验自身证书,校验失败无法启动,罢工。
弱网测试
1、点击Proxy->Throttling Settings
2、勾选[Enable Throttling]使的限制网速可用,相当于开启了限制网速的功能
其中
Bandwidth:带宽 这个限制网速。
Utilistation:利用百分比宽带的利用比保持100%就行。
Round-trip:往返延迟测量客户端和远程服务器之间的第一次往返通信的毫秒延迟。它用于客户端向服务器和服务器向客户端的每次请求。
MTU:最大传输单元
Reliability (%):可靠率(是否丢包)。
Stability (%):稳定率 如果连接不稳定,则连接的质量会在不稳定的质量范围内随机下降。
Unstable quality range (%):不稳定的质量范围。
以下配置用于模拟不太好的2G蜂窝网络:
- 带宽256 kbps(上传和下载)
- 利用100%
- 延迟40 ms
- MTU为1500字节
- 可靠性90%
- 稳定90%
- 不稳定的质量范围为0%至10%