安卓逆向8,解决app抓包抓不到的问题

####

有时候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,我们只是要数据,不是要对抗新版本,

###

 

 

####

posted @ 2021-08-25 10:00  技术改变命运Andy  阅读(6867)  评论(1编辑  收藏  举报