抓包
代理抓包
Fiddler, charles 能抓http/https/websocket 属于应用层
优点:配置简单,抓取解析ssl 方便
缺点:app 对代理抓包的检测越发厉害
https :
http 是明文传播,易被修改,易被拦截,网页弹广告
https 实在http 基础上加了一个安全层
https 特点:
- 数据加密,不再明文传播
- 使用数字证书(
CA Certificate Authority )做身份校验,防止数据被截获,只有合法证书持有者才能读取数据 - 数据完整性,防止数据被篡改,对数据做签名
HTTP OVER SSL 传输数据要先SSL 加密处理 ssl 握手协议 先商量好加密方式 交换证书 用证书加密 正式开始发送数据(用证书来给数据加密)
SSL层握手协议
- 1.
Client Hello 发给服务端:一串随机数 和 客户端支持哪些加密算法 一般是RSA 加密 2.Server Hello 回客户端:一串随机数 和 确定使用哪种加密算法 3.Certificate : 服务端把要公匙证书发给客户端 4.Client key Exchange : 客户端把自己的证书又发给服务端 5.Session Ticket :开始传输数据/用key 给http数据加密 传输给服务端
代理抓不到包的几种原因
请求没有走代理
可以设置走自己代理,安卓系统会优先走APP 设定的代理 http.route.default-proxy
判断方法
如何判断没有走我们的代理: 设置wifi 代理后 关闭fiddler 如果APP 还能正常访问 就是不走代理
解决方法:
ProxyDroid APP 全局代理 强制把IP 转发到指定端口上 原理: 使用 iptable 命令 实现端口转发 mumu 虚拟器iptable 会报错 案例:mm 应用市场
ssl pining(ssl证书验证) 目前大部分是这种导致抓不到包
APP 对服务端证书做校验 校验服务器的证书和域名。/这也叫单向认证 Fiddler/Charles 等的证书肯定是校验不过的 回看 中间人攻击 图解 和 SSL 层握手协议 APP 做ssl pining 的几种方式: 举例Python requests 库对ssl 的校验 requests.get(url, timeout=1, verify=false)
Python
requests urllib urlib3 aiohttp
Java的几种网络请求方式
HttpsURLConnection okhttp webview ssl pinning Native SSL
ssl pinning解决办法:
部分 ssl pinning 失效的原因:
Hook 失败,APP 的网络请求库代码被混淆,或者大厂自己实现了一套网络请求库
解决办法:
逆向APP ,找到证书验证的地方,修改xposed 的 justtrustme 或者 frida 的DroidSSLUnpinning 代码, 重新Hook
双向认证 使用者很少,会影响服务器性能
客服端对服务端发来的证书做校验 真实的服务端也对客服端证书做校验
双向认证解决办法:
客服端校验任然使用SSL unPinning 方法 服务端校验,需把APP 里的证书导入到代理抓包软件中,让代理抓包工具使用真实的APP 证书。charles 比较方便 配置
如何找到APP里的证书
反编译APP 在assert 文件夹里有.p12 .pem 之类文件cer ssl 反编译后,在源代码里大量搜索 Hook 监听Assert 文件夹 知道读了哪些文件 可能有密码 Hook java.security.KeyStore 查看密码
Wireshark
不需要对客服端做改变(设置代理IP ),是对网卡抓包 能抓传输层/网络层 抓TCP 包 抓经过网卡的所有TCP 包
跟代理抓包的区别 如何抓手机上的数据: 在电脑上开wifi 热点,手机联电脑的wifi 热点,共用一个网卡 360wifi 热点 http://wifi.360.cn/easy/pc/ 安卓虚拟机可以直接抓包,不需要热点
抓包过滤wireshark
演示wireshark 如何过滤数据包 根据目的IP抓包 ip.dst == 192.168.0.1 ip.addr == 192.168.0.1 按端口过滤 tcp.port == 80 tcp.port == 443 按协议过滤 ssl 关联过滤 ssl and ip.addr
特点:
抓https 需要把ssl 证书导入到wireshark ,不然没法解析https ,这个操作难度较大 tcp以 上的数据都能抓,http/https/socket 等
Hook 域名 把https 改成 http
让app 强行发http 包,请求会失败,抓不到response 数据,但是能抓到请求包 通用性太差
Hook 网络请求库
请求前打印出请求参数,响应后打印出返回数据
注意事项:
1.安卓7.0(包括7.0)以后,安卓系统不再信任用户安装的证书。(例如 fiddler/charles 的代理抓包证书) mumu 模拟器
解决7.0以后用户证书不信任问题两种方法:
(1)root 手机,把代理证书放到系统证书根目录下 用户CA 证书目录 /data/misc/user/0/cacerts-added 系统CA 证书目录 /system/etc/security/cacerts 问题: 有的手机root /system 分区是只能读 仍然不能把证书放到系统根目录, 比如魅族pro5 df 命令 mount -o rw,remount /system (2) hook 系统方法,强行让系统信任用户证书: 比如:使用xposed 框架的justtrustme 模块 和 frida 的DroidSSLUnpinning
技巧:
1.优先使用安卓系统低版本抓包 优先使用安卓4.0 5.0 6.0 抓包 2.优先使用APP 低版本抓包 比如微信7.0 以下 在安卓4.0-6.0 上 容易抓包微信小程序 优先使用能用的APP 最低版本
APP历史版本: https://wap.pp.cn/ apkpure.com 当安卓抓包很艰难时,试试iOS 抓包
|