zoukankan      html  css  js  c++  java
  • 安卓逆向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,我们只是要数据,不是要对抗新版本,

    ###

    ####

  • 相关阅读:
    mysql启动报错:Failed to start LSB: start and stop MySQL
    springboot学习源码
    A query was run and no Result Maps were found for the Mapped Statement
    mybaties报错:There is no getter for property named 'table' in 'class java.lang.String'
    redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set
    Missing artifact com.lowagie:itextasian:jar:2.1.7
    Vue.js安装及环境搭建
    高并发与多线程
    NoNodeAvailableException[None of the configured nodes are available:[.127.0.0.1}{127.0.0.1:9300]
    oracle中sys用户下all_tables表个字段说明
  • 原文地址:https://www.cnblogs.com/andy0816/p/15183683.html
Copyright © 2011-2022 走看看