抓包
相关原理:
MITM(Man-in-the-middle)工作原理:
对于双向加密的HTTPS,正常情况下,即使能以中间人的方式拿到通信报文,但是因为没有密钥,同样也不能看到具体的传输内容。基于HTTPS加密通信的建立过程,和密钥交换方式,如果在加密通信建立之前,截取服务端发送的包含证书的报文,伪装成服务端(从第一个SSL/TLS包截取域名,利用内置的ca证书创建公钥证书和私钥),把自己的证书发给客户端,然后拿到客户端返回的包含对称加密通信密钥的报文,以服务端自己的公钥加密后发给服务端,这样一来,双向加密通信建立完成,而中间人实际拿到了通信的密钥,所以可以查看、修改HTTPS的通信报文,这就是典型的Man-in-the-middle attack即MITM中间人攻击。
简化理解:
总结:
- 即中间人攻击,抓包工具双向伪装,在connect建立前通过伪造证书获取秘钥,从而实现中间人抓取和修改request与response数据。
- https抓包实现的基础,是将中间人的CA证书导入到目标机上,让客户端认为你就是服务端。
- server一般不关心client,但是可以校验,详情见扩展7双向认证。
使用方法:
fiddler:
常用抓包工具之一,部署安装步骤见扩展,安卓6以下可直接抓包,6以上按此方法
- 获取fiddler ca证书:
fiddler默认抓http,选择Tools->Options,
- 勾选https->Capture HTTPS CONNECTs->Decrypt HTTPS traffic,若https使用了不可信任的证书,勾选下面的ignore xx error
- 切换connections->allow remote computers to connect(否则模拟器连不上)
- 安卓端设置wifi代理,使用浏览器打开pc端ip+端口号(例如198.168.0.1:8888,ip获取方法可百度,端口号默认8888,如有需求可自行修改),进入后会看到fiddler提供的页面,点击fiddlerRoot certificate可获取fiddler证书。(连不上代理见解决方法3)
- 安装MT管理工具(官网下载:https://mt2.cn/,直接导入),在/data/misc/user/0/cacerts-added目录找到刚下载好的证书,移动到/etc/security/cacerts/目录下(此步骤是因为安卓7以上只信任系统证书,此处将用户证书移动到系统证书目录下),若提示目录只读见解决方法4,ios此ca证书处理方式相同,安装证书后,在证书信任设置中选择“针对根证书启用完全信任”
- 抓取成功:bilibili举例
http canary(小黄鸟)
- 安装证书:设置 → SSL 证书设置 → 导出 HttpCanary 根证书 → System Trusted(.0)自动导入,方便得很。
- 小米为例:设置 -「密码与安全」-「系统安全」-「加密与凭据」-「安装证书」-「ca证书」-「仍然安装」-「选路径(httpcanary/cert/HttpCanary.pem)」不同手机路径可能会有差别,专门找隐私,安全,加密,证书这些字样的路径找。
- 设置目标应用,就可以抓包了。
- 小黄鸟几个特点:
- 可以注入(修改request和response)
- 可以直接返回结果,包括图片,音视频
- 可以屏蔽和数据筛选
- 插件齐全(Host屏蔽、Mime-Type屏蔽、图片音频视频下载、请求性能统计等)
charles
- 部署 MITM 代理服务器:在电脑上启动 Charles,默认会在这台电脑的 8888 端口部署 Charles 的 Web 服务器
- 通过代理等方式将网络流量归集到 MITM 主机:在电脑命令行执行 ipconfig 获得本地 IP 地址(也可以通过 Charles 的
Help→Local Ip Address
查看),然后将手机和电脑连接到同一个局域网下,再修改手机连接 Wifi 的高级设置,设置代理到电脑的 IP 地址和 8888 端口号 - 客户端信任 MITM CA 证书: Charles 抓包也需要在手机上信任 Charles CA 证书。根据指引,会让你在手机浏览器访问
chls.pro/ssl
下载证书,安装证书的方法与 Fiddler 相同 - 报文重放:在 Charles 上重放请求很简单,有两种方式:右键点击一个请求,选择
Repeat
或Repeat Advanced
直接重放;或者选择Compose
先编辑再重放。其中 Repeat Advanced 适合做压力测试。
- 弱网模拟:
打开Proxy→Throttle Settings
进入弱网配置页面,其中Throttle preset
提供了多种预置的网络环境模拟配置,可以直接在此基础上修改。
- 修改请求:
Charles 本身是一个代理服务器,可以拦截 HTTP 请求 / 响应进行修改后再放行。在 Charles 上配置 Rewrite:tools里面
常见问题及解决办法:
- Android 7以上对安装证书限制:
安卓7以前信任系统证书和用户证书,7以后只信任系统证书,解决方法
- 修改App的AndroidManifest网络安全配置,信任用户自导入证书(基本上用于自己开发的app)。
AndroidManifest 中配置 networkSecurityConfig
网络安全配置详情:https://developer.android.com/training/articles/security-config - Root测试机或自编译系统,把Fiddler根证书设置为系统预置证书。
- 调低targetSdkVersion:
安卓7以上可以抓到targetSdkVersion<24的包,Google后来要求大于28了,所以可以找历史版本 - 平行空间抓包:
利用宿主系统运行其他应用,但要注意平行空间的版本 4.0.8625 以下才是 targetSdkVersion < 24
- 安卓版本:
可使用夜神模拟器,选择多版本安卓os - 连不上代理:
- Fiddler代理没有勾选Allow remote computers to connect
- 代理服务器地址不对,eg写错误成了127.0.0.1
- 模拟器网络设置没设对(夜神模拟器为例,网络设置不要选择桥接)
- 移动系统证书提示只读(由于没有设备,此处未经实践lol):
- 安卓设备请确保root
- 连接安卓设备,确保安卓设备打开了“usb调试”选项,然后打开终端,输入adb shell,进入后输入 su,以root权限调试
- 执行mount | grep /system,会看到如下信息
/dev/block/platform/1021c000.rksdmmc/by-name/system /system ext4 ro,noatime,nodiratime,noauto_da_alloc,data=ordered 0 0
ro说明只读 - 输入命令cat /proc/mounts
- 找到/system的路径:/dev/block/platform/1021c000.rksdmmc/by-name/system
- 执行命令 mount -o rw,remount /dev/block/platform/1021c000.rksdmmc/by-name/system /system
- app提示网络错误:
可能是app使用了证书固定,Client 端内置 Server 端真正的公钥证书。在 HTTPS 请求时,Server 端发给客户端的公钥证书必须与 Client 端内置的公钥证书一致,请求才会成功。比如饿了么,比较麻烦,但Xposed 和 Magisk 都有相应的模块,用来破解证书固定,还是能抓。破解的原理大致是,Hook 创建 SSLContext 等涉及 TrustManager 相关的方法,将固定的证书移除。
扩展
扩展:
- http2协议多路复用形式:frame+stream形式
- https抓包原理:
http为明文报文,可以直接食用,但https为双向加密报文,需要破解, - CA证书:
分为用户证书和系统证书, - fiddler部署:
下载地址:https://www.telerik.com/fiddler,注意安装经典版本。 - fiddler有断点功能,也可以实现注入,可以打在request之前和response之后
- fiddler使用过程中忽然不能联网了:重启fiddler
原因:fiddler异常关闭,Fiddler是以代理WEB服务器的形式工作的,它默认使用代理地址:127.0.0.1, 端口:8888。 当Fiddler开启时会自动设置代理, 退出的时候它会自动注销代理,这样就不会影响别的程序。不过如果Fiddler非正常退出,这时候因为Fiddler没有自动注销,会造成网页无法访问。解决的办法是重新启动下Fiddler。 - 双向认证问题:
比如soul,server也会校验client,双向认证需要server支持,请求建立前server会向client请求公钥(不同于比如前面的固定证书公钥,也就是说同一个app可能存在多个公钥和秘钥),一般会将公钥存在包中,可以从包中提取,相关文章较多,不同app存放位置一般也不同,需要具体情况具体分析,这里就不细展开了,针对app找相关资料,还是可以抓的。
参考文献:
2.https://jishuin.proginn.com/p/763bfbd5f92e
3.targetSdkVersion:https://www.jianshu.com/p/358a3d42196e
4.fiddler抓取https原理:https://www.jianshu.com/p/54dd21c50f21
- VirtualHook:https://github.com/rk700/VirtualHook
- CertUnpinning:https://github.com/rk700/CertUnpinning