应用抓包时Https数据包无法获取的原因,应用开启SSL Pinning的解决方法
  • 分类:Python
  • 发表:2019-05-02
  • 围观(10,006)
  • 评论(6)


众所周知,Fiddler是一款十分强大的抓包工具,也是我最常用的一款抓包软件.虽然网页抓包的话浏览器自带的网络调试工具就足以胜任,但是对于软件抓包的话就必须用到Fiddler等第三方工具了.Fiddler的强大不在于它可以抓取各个平台的数据包,还在于他的强大的调试拓展(虽然这些我都不是很会用).Fiddler对https加密的数据包同样有他的处理办法,通过伪造本地证书实现对Https数据包的捕获和处理.这些基础知识大家都轻车熟路了,但是在移动设备app的抓包过程中,我们经常会发现一种错误.


问题由来

我们按照网上的步骤一步一步搭建好虚拟机环境,并根据教程在设备中安装并信任了Fiddler的证书,但是发现在app抓包时出现了若干令人费解的问题:

问题一:我的虚拟机是连接了网络的,但是进入APP提示网络未连接
问题二:Fiddler虽然有数据包被捕获, 显示的状态码是200,但是host提示tunnel to,而且数据包内无数据

这到底是什么原因呢?不但安卓是这个问题,连IOS也是相同的问题,看来这是平台为了防止软件被抓包而采取的保护措施.但是问题似乎可以解决,为什么这么觉得呢,因为我看网上的人都能解决,为什么我不可以.搜索引擎启动:Fiddler抓app包提示无网络回车,这么多搜索结果看来这是个普遍问题啊.


阐述问题

根据我翻阅资料得到结果,问题的根本原因就是APP开启了SSL Pinning,才导致了这一系列的问题,为了解决这个问题,我们首先要了解一下以下几个概念以及什么是SSL Pinning.

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

HTTPS(Hyper Text Transfer Protocol Secure),即超文本传输安全协议,也称为http over tls等,是一种网络安全传输协议,其也相当于工作在七层的http,只不过是在会话层和表示层利用ssl/tls来加密了数据包,访问时以https://开头,默认443端口,同时需要证书,学习https的原理其实就是在学习ssl/tls的原理。

我们知道Https的数据包我们可以通过Fiddler伪造本地证数来解密数据包,同样的APP内传输的数据同样是Https传递的,为什么Fiddler无法抓取到数据包呢?或者说为什么Fiddler无法解密出发送的数据包的内容呢?这个就是SSL Pinning的范畴了.SSL Pinning是在开发时就将服务端证书一块打包到客户端里.这样在HTTPS建立时与服务端返回的证书比对一致性,进而识别出中间人攻击后直接在客户端侧中止连接. 这就是数据包无法获取的原因,因为我们的连接被APP主动终止了.

问题发现了,解决问题的思路就很清晰,只要解决这个SSL Pinning就可以了,因为SSL Pinning是一个函数校验,我们就可以通过hook使函数校验始终返回true,或者干脆不做校验,那么就很好的解决了这个问题.但是在实际操作当中,hook APP要对源代码做反编译,我也完全不会😅.我们这里介绍的是稍微简单的方法.


问题解决

安卓解决SSL Pinning的方法十分简单,只需要安装Xposed的JustTrustMe模块并且启动就可以了,如何安装Xposed和JustTrustMe模块下文会有一个简单的教程.

环境配置:Windows 10 + Genymotion(Android API:5.1 - API22) + Fiddler
SUPERSU 下载地址:https://download.chainfire.eu/696/supersu/
Xposed-sdk 下载地址:http://dl-xda.xposed.info/framework/(下载SDK22)
XposedInstaller 下载地址:https://forum.xda-developers.com/showthread.php?t=3034811

依次将下载的apk拖入Genymotion虚拟机,并重启虚拟机.如果无法安装请检测文件路径是否存在中文.

安装Xposed框架,安装过程会申请超级用户权限,点击允许,框架安装成功后重启虚拟机.然后再安装JustTrustMe插件:点击跳转,下载完成之后拖入安装,打开Xposed框架→选择模块→装载模块,然后完成之后重启模拟器.

重启之后打开APP之后你会神奇的发现不会出现未联网的错误了,Fiddler也可以正常解析数据包了,SSL Pinning的问题就得到了解决.IOS的同样有插件可以解决,但是需要设备越狱,然后安装插件SSL Kill Switch 2,地址:https://github.com/nabla-c0d3/ssl-kill-switch2.但是插件支持系统为IOS12以下,IOS12暂未支持,所以因为手头没有相应的设备所以无法测试,但是大概思路是相同的,要学会融会贯通不是么?

总结

所以有的时候你会发现,作为程序员在学习一门对自己来说新的技术时, 代码、框架往往不是阻碍学习的绊脚石,因为代码、框架都有完整的文档可以查阅.但是往往是开发环境的搭建是最折磨人的.比如说Java Tomcat环境,Python环境,数据库环境等等一系列的环境总是让人头大.不过如果环境搭建好了的话,一切就变得那么流畅,清晰.

环境的搭建又是必不可少的,像我入门Python的时候,Python的虚拟环境这个概念就让我呆了好久.之前所有的支持库都安装到pip环境下,也不知道什么是virtualenv.但是之后弄懂之后一切就变得那么井井有条.


共有 6 条评论

  1. 求学者

    使用了Xposed的JustTrustMe但是当模拟器设置了代理之后 打开App 还是显示没有网络。。

    1. Avatar photo

      Continuity

      你确定已经在手机端配置了相应的CA证书么?

  2. 求助

    在虚拟机中装了mitmproxy-ca-cert.cer,也配置了代理。怎么mimtproxy抓不到包呢

    1. Avatar photo

      Weiney

      1.本机通过控制台指令mitmweb或者mitmdump开启mitm服务
      2.虚拟机或者手机配置相应的本地代理,地址为电脑端本地IP,端口默认为8080
      3.虚拟机或者手机访问mitm.it就会跳转到相应的安装证数界面,安装证数
      完成上述操作后设备访问互联网电脑端就会有相应的数据包信息,要一步一步看看是哪里出了问题哦

  3. Pys

    “使用了Xposed的JustTrustMe但是当模拟器设置了代理之后 打开App 还是显示没有网络。。“我也是这个问题,一直没解决

    1. Avatar photo

      Weiney

      试着用老版本的抖音,手机端安装mitm证书,注意证书类型一定要是安卓
      实测mitm的证书是直接可用的,不需要安装xposed,和JustTrustMe插件

Top