有时候app抓不到包,这不是工具的问题,而是你没有搞清楚网络协议,
网络协议
网络协议,比如http协议,这是全球通用的,大家约定好的,你要开发软件,就要遵守这个协议,
浏览器都是只能抓到应用层,
TCP/IP五层模型
五层协议:
应用层:用户使用的应用程序都归属于应用层,作用为规定应用程序的数据格式。
抓包工具,比如fiddler,Charles,都是只能抓应用层的协议,wareshark可以抓传输层的协议,但是一般不用这个软件太重了,
http协议,FTP,SMTP协议,都在应用层,
tcp,udp,在传输层,
ip协议,在网络层,
传输层:网络层帮我们找到主机,但是区分应用层的应用就是靠端口,所以传输层就是建立端口到端口的通信。(端口范围0-65535,0-1023为系统占用端口)
网络层:区分不同的广播域或者子网(否则发送一条数据全世界都会收到,是灾难)。
数据链路层:定义电信号的分组方式。
物理层:基于电器特性发送高低点电压(电信号),高电压对应数字1,低电压对应数字0。
c)OSI七层模型
七层协议:(应用层、表示层、会话层)、传输层、网络层、(数据链路层、物理层)
比如pc版本的qq客户端,你就抓不到包,因为这个没有用http协议,而是用的tcp协议,所以你抓不到
你发了一个微信消息给另外一个人,发生了什么?
这个就是遵守这个tcp/ip五层协议,
先从应用层往下封包,----然后到物理层开始传输,---到了对方那里之后开始从物理层开始解包,----一直到在微信里面开始展示出来,
抓包方式:
抓包方式
第一种抓包:代理抓包
1,代理抓包,比如fiddler,Charles,这都是使用的代理抓包,这是抓的应用层,这种是用的最多的,
优点:
配置简单/抓取解析SSL方便
缺点:
APP对代理抓包的检测屏蔽越发厉害
原理:
注意,这个fiddler这样的工具,只能抓http,https,websocket三种协议,比如发一个邮件是抓不到的,因为这是smtp协议,
这种代理抓包,又叫做中间人攻击,
所以这个工具的抓包原理是什么样的,就是使用的代理,把请求拦截,然后转发,
所以代理抓包这个抓包工具,既是充当了客户端,也是充当了服务端,
http和https的区别,
这个还是要想想原理,
HTTPS:
HTTP是明文传播,易被拦截,易被修改,网页弹广告。
HTTPS在HTTP的基础上加了一安全层(SSL或TSL)
HTTPS的特点:
1.数据加密,不再明文传播
2.使用数字证书(CA Certificate Authority)(赛门铁克),做身份校验,防止数据被截获,只有合法证书持有者
才能读取数据
3.数据完整性,防止数据被篡改。对数据做签名
代理抓不到包的原因第一种:app设置了自己的代理
主要是app设置了自己的代理,安卓会优先走app自己设置的代理,所以就不会走抓包工具的代理,
如果判断app没有走我们的fiddler代理呢?
就是保持网络连接,关闭抓包工具,如果app还能访问正常,就说明没有走我们的fiddler代理,因为正常是fiddler关闭了之后,整个的app就访问不了了,
怎么解决这个问题?
使用一个app,proxydroid,这个app强制把代理往fiddler上面转,
原理就是配置了全局代理,强制把ip指向指定的端口上,
案例:mm应用市场
具体怎么设置Charles手机抓包,网络上都有很多的教程,不多说,
一个app不能被代理工具抓包,
安装mm应用市场,这个app做了强制升级,否则就不让你用了,这是一个问题,也就是有些app,你是没有办法进行低版本的逆向的,
我们抓包这个app,是抓不到的,没有我们想要的东西,
第一步:
首先你要先能正常抓包到其他的app,证明代理设置是对的,可以抓到手机app的包,
这个时候,你把代理软件关闭,这个app是不能访问的,因为设置了代理,而代理关闭了,
第二步:
关闭代理,看看这个抓不到包的app,是否还能正常运行,
我们可以发现,这个app,没有受到代理的影响,也就是没有走我们设置的代理,
第三步:
我们要解决这个问题,
使用一个app,proxydroid,这个app强制把代理往fiddler上面转,
安装这个app,注意手机要root,
实际上,用了这个代理转发的app之后,可以不用设置手机wifi里面的代理转发了,
解决方法:
ProxyDroid APP 全局代理 强制把IP转发到指定端口上
原理: 使用 iptable 命令 实现端口转发
mumu虚拟器 iptable 会报错
案例:mm应用市场
代理抓不到包的第二种:ssl pining ssl证书校验,这个是大部分的app抓不到包的原因
就是app对服务端的证书做校验,我们也叫做单向认证,
而fiddler上面肯定是没有这个证书的,所以app会校验不过,
为什么浏览器不会出现这个问题,因为浏览器不会校验这个证书,而app是公司自己开发的,可以加这个校验的功能,
这个ssl pining ssl证书校验的原理
这种和不走代理还不一样,这种是走了代理,但是ssl证书验证,
抓包安吉星:
我准备在真机上面测试,
先安装两个app,安吉星,justtrustme,
记住关键点!,justtrustme安装了之后,要重启这个手机设备,这个justtrustme才会生效,
第一步,抓包发现是一个connect,是看不到内容的,
第二步:怎么解决这个问题,
ssl pinning解决办法:
1.使用Hook手段 Hook APP端网络请求库对 ssl证书的判断方法
借助xposed 模块 justtrustme apk 地址:https://github.com/Fuzion24/JustTrustMe ----通过安吉星演示
借助frida 程序 DroidSSLUnpinning https://github.com/WooyunDota/DroidSSLUnpinning ----这个没有演示,
解决的思路是直接强制校验证书通过
2,使用上面的justtrustme,有时候还是会抓不到的,
因为这个apk是使用hook网络请求库的方法, 但是如果你没有hook到这个网络请求库,就会失效,比如这个网络请求库是企业自己开发的,
怎么处理这种情况?
逆向APP 扣出里面的证书 放到charles里 让charles使用真实证书做代理(在双向验证中讲) ---这种没有演示
部分 ssl pinning 失效的原因:---这种没有演示
Hook 失败,APP的网络请求库代码被混淆,或者大厂自己实现了一套网络请求库
解决办法:
逆向APP,找到证书验证的地方,修改xposed 的 justtrustme 或者 frida的DroidSSLUnpinning 代码,
重新Hook
这个是一个比较麻烦的事情,
现在抓包反而成了一个问题,
1,mumu模拟器不能安装Xposed,也就不能使用justtrustme,也就不能使用fdex2脱壳,
2,夜神模拟器安装不上mac版本,这个让人恼火,虚拟机安装夜神又非常的慢,
3,真机是安卓8的版本,Xposed能用,但是fdex2,不能用,这个也让人恼火,
4,genymotion,最新的情况是可以Charles抓包了,
怎么办?
我觉得,
Xposed+justtrustme+安吉星+真机安卓8,尝试一下,
我发现这种方法,justtrustme,没有生效,还是抓不到,
Xposed+justtrustme+安吉星+genymotion安卓6,尝试一下,
还是不行,justtrustme,没有生效,还是抓不到,
到底是为什么?
我终于知道了,是因为这个安吉星app,是使用的双向认证!!!
手机有时候有的app能打开,有的app打不开,这是为什么?
很可能是有抓包代理,
因为有的app是通过代理的,只是有ssl验证,所以失败,
有的app是绕过代理的,所以是正常的
有的app是没有对代理进行处理的,没有绕过也没有ssl验证, 所以也是正常的,
细细分析一下,不要慌,
实在不行,重启手机,然后再分析,
代理抓不到包的第三种,双向认证
双向认证 使用者很少,会影响服务器性能 很难找到有app使用这种app
客户端对服务端发来的证书做校验
真实的服务端也对客户端证书做校验
这种为什么使用Charles不能抓到包,
因为你请求服务器的时候,Charles是把自己的证书携带着去请求服务器的,这种肯定是校验不过的啊,
双向认证解决办法:
客户端校验,仍然使用SSL unPinning方法,也就是客户端强制不校验这个ssl证书,强制通过,
服务端校验,需把APP里的证书导入到代理抓包软件中,让代理抓包工具使用真实的APP证书。charles 比较方便配置
示例:soul
如何找到APP里的证书?
反编译APP 在assert文件夹里有.p12 .pem之类文件cer ssl
反编译后,在源代码里大量搜索
Hook 监听Assert文件夹 知道读了哪些文件
可能有密码 Hook java.security.KeyStore 查看密码
然后把证书在Charles配置一下,
通常有上面三个手段,只要是走应用层的,就可以把大部分抓不到包的问题都解决了,
APP抓包相对繁琐,越来越多的 APP 在 https 请求和响应时,为了防止中间人攻击(或中间人抓包),会做证书认证,让抓包工具抓不到请求。
证书认证分单向认证和双向认证,双向认证是相较于单向认证而言的,单向认证就是只在 APP 侧做证书校验,单向认证有现成的解决方法,比如用各种 bypass ssl 校验的 hook 脚本既可让单向认证失效,例如:JustTrustMe 。如果 APP 的网络请求库有混淆,上述 bypass ssl 脚本无效,也有开源作者开发了自适配的 bypass 程序,可以 hook 混淆后的网络库。比如:JustMePlush 。 简单说了下单向认证如何解决,
开始说双向认证如何解决。
双向认证除了要在 APP 侧做证书校验外, 对方服务端还要做证书校验。对方服务端是要检测证书的,不提交真正的证书给服务端,肯定会请求失败。
双向认证抓包有两种解决方法:
一是:按照搞定证书的思路去想的话,就是要想办法拿到真正的证书。
二是:Hook SSL 对数据解密数据的地方。
方法一: 因为 APP 能正常跟服务端通信,所以真正的证书肯定是在 APP 里面。所以就是要想办法从 APP 里抠出证书。抠证书有开源的 Frida Hook 脚本。如下地址是开源作者写的 Frida Hook 脚本 https://gist.github.com/ceres- c/cb3b69e53713d5ad9cf6aac9b8e895d2gfgg 可以把证书从内存里读出来保存到本地,并且证书密码也能读出来,非常的方便。 该脚本的原理是: 因为 APP 在向服务端发请求时, APP 肯定会操作证书,所以如果能找到 APP 操作证书的代码地方, Hook 这部分代码,对参数做些输出打印,证书和证书密码就都有了。 大部分情况下,我们不用非常熟悉安卓原理,比如安卓在代码层面是如何操作证书的(当然熟悉更好)。因为资讯发达,一般灵活借助搜索引擎,灵活查阅资料,可以大体知道这些,就可以尝试去写 Hook 脚本去尝试看看。 查阅资料可以知道,安卓操作证书通常是 java.security.KeyStore 这个类,然后再了解下这个类的用法,参数形式。就可以尝试去 Hook 了。上述脚本就是 Hook java.security.KeyStore 这个类的 load 方法,load 方法的形参就是我们需要的证书和密码。 抠出的证书和密码,配置进 fiddler 或 charles 里面,就可以抓到双向认证的包。 PS: 还要注意证书的格式,抠出的证书可能是 jks 或 bks 格式的,fiddler 可能需要 p12 格式的, 所以要找工具先转换一下格式。
方法二: 如果只是想抓包,还有另一种方法,不需要抠证书的方法。虽然 https 在传输过程中是加密的,但在终端显示的时候,必然会解密,不然 APP 上都没法显示了。所以如果能知道安卓解密 SSL 加解密是哪个类, Hook 这个类, 类里相关方法的输入输出肯定就是传输的明文数据。 所以可以查阅资料,看看相关类的用法,就可以尝试去 Hook 打印输出看看情况。
也有开源作者开源了该 Hook 脚本, 比如 5alt 老板在google开源的脚本基础上做了修改了的 ssl_logger 。 https://github.com/5alt/ssl_logger 能够 Hook SSL 加解密的地方,它会把传输的数据保存为 pcap 格式。再使用 wireshark 打开该 pcap文件, 在 wireshark 上就可以看到明文的数据了。 如果要模拟向服务器发送请求的话,还是只能使用第一种方法,因为客服端必须要提交正确的证书,服务端才会正确响应。必须得抠出证书,模拟请求时必须带上证书,才能请求到数据。安卓上的证书好多是 jks/bks格式的, 如果使用 Python requests 库的话, 不支持这个格式, 所以要想办法把证书转成 cert 格式的。 上面两种方法都是使用 Frida 进行 Hook ,所以要有 Root 过的手机和明白Frida 怎么使用就能搞定。
对于爬虫来说,搞定抓包和请求参数加密的问题,大部分 Hook ,都可以通过 Hook 安卓系统 API 来找到 APP 代码位置,或直接搞定。其实很少人能很熟悉安卓系统的各种原理,大部分时候能灵活通过各种关键字能查到相关原理的讲解文献,文献里讲的 API 灵活点拿去 Hook 康康线索,就能搞定很多拉。 其实使用双向认证的 APP 还是少数, 对服务器性能多少有影响。
代理抓不到包的第四种,没有走应用层-----了解
socket通信是IP层,fiddler/charles抓不到,用wireshark抓包 在网卡混杂模式里讲wireshark
比如PC QQ
解析socket通信数据麻烦,要分析APP协议解析部分
代理抓不到包的第五种,私有协议----了解
这种不是通用的协议,
wireshark能抓到,不知道协议细节,解不了包。
需要分析APP协议解析部分
第二种抓包:网卡混杂抓包--了解
2,网卡混杂抓包,webshark,这个能抓传输层,和应用层,但是一般不用这个软件太重了,
第三种抓包:路由器抓包--了解
3,路由器抓包,网络组网方式,因为所有的流量都要从路由器过,使用特殊的路由器,可以进行路由器抓包,
公司有的老板,监控每一个员工的访问记录,就是路由器可以监控每一个机器的访问记录
这个也没有什么可将的,你去买一个有这个功能的路由器就可以了,
第四种抓包:hook域名--了解
4,hook域名,把https改成http,
5,hook网络请求库,比如request,
这种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
tricks:
1.优先使用安卓系统低版本抓包
优先使用安卓4.0 5.0 6.0抓包
2.优先使用APP低版本抓包
比如微信7.0以下 在安卓4.0-6.0上 容易抓包微信小程序
优先使用能用的APP最低版本
所以工具充分准备,
各种抓包工具都准备好,fiddler,Charles,wirsshark,
各种模拟器都安装一下,夜神,mumu,雷电,4.0 5.0 6.0
各种手机都准备一下,安卓4.0 5.0 6.0 7.0 root过的,还有苹果手机,
没有必要因为一个抓包非要搞定一个高版本的app,我们只是要数据,不是要对抗新版本,
标签:证书,APP,代理,Hook,app,安卓,抓包 From: https://www.cnblogs.com/pdxt666/p/17604742.html