关于代理抓包,ssl pinning解决方案

**

详情见我的博客小生博客

**

抓包

代理抓包

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层握手协议
APPssl 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解决办法:

  • 1.使用Hook手段 Hook APP端网络请求库对 ssl证书的判断方法
    借助xposed 模块 justtrustme apk 地址:https://github.com/Fuzion24/JustTrustMe
    借助frida 程序 DroidSSLUnpinning https://github.com/WooyunDota/DroidSSLUnpinning
  • 2.逆向APP 扣出里面的证书 放到charles里 让charles使用真实证书做代理

部分 ssl pinning 失效的原因:

Hook 失败,APP的网络请求库代码被混淆,或者大厂自己实现了一套网络请求库

解决办法:

逆向APP,找到证书验证的地方,修改xposedjusttrustme 或者 fridaDroidSSLUnpinning 代码,
重新Hook

双向认证 使用者很少,会影响服务器性能

客服端对服务端发来的证书做校验
真实的服务端也对客服端证书做校验

双向认证解决办法:

客服端校验任然使用SSL unPinning方法
服务端校验,需把APP里的证书导入到代理抓包软件中,让代理抓包工具使用真实的APP证书。charles 比较方便
配置

如何找到APP里的证书

反编译APPassert文件夹里有.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模块 和 fridaDroidSSLUnpinning

技巧:

1.优先使用安卓系统低版本抓包
优先使用安卓4.0 5.0 6.0抓包
2.优先使用APP低版本抓包
比如微信7.0以下 在安卓4.0-6.0上 容易抓包微信小程序
优先使用能用的APP最低版本

APP历史版本:
https://wap.pp.cn/
apkpure.com
当安卓抓包很艰难时,试试iOS抓包

你可能感兴趣的:(安卓逆向,ssl,python,http)