一般情况下手机在安装了burpsuite的伪证书后,是可以抓大部分APP数据包的。但是也会会遇到一些APP是不能通过burpsuite抓包的情况。
这种现象往往表现在burpsuite没有拦截到任何数据请求信息,且在客户端返回类似“服务器连接错误”等提示。那怎么去解决抓不到包的问题呢?
什么是单向认证?
简单来说,单向验证的就是是客户端主动去校验服务端的证书,看看其服务端证书是否为客户端所承认的证书,如果证书校验出错就会无法与其建立连接。说白了就是APP使用SSL证书绑定(SSL Pinning)让客户端绑定了唯一可识别的证书,请求时当发现服务端证书和绑定的不一样时就不建立连接。
解决办法:Xposed框架+JustTrustMe模块(需root)
1、从下载好的文件中解压出Xposed,放到模拟器中安装:
2、打开软件后是未激活状态,需要进行在线安装:
3、安装完成后根据提示重启,重新进入软件显示成功激活即可:
4、接着解压出justTrustme文件,进行安装。结束后Xposed会自动提示该模块未激活。点击激活跳转到Xposed模块界面进行勾选,接着重启即可。
5、 接下来就可以用burpsuite等工具抓包了。
其实就是Xposed框架的justTrustMe模块,会将APP中所有进行证书验证的方法或者函数都进行hook。hook它就是一个钩子函数,通过这个钩子函数去修改了证书检验的结果,让其无论如何都可以继续进行通信。从而达到可以正常抓包的目的。
除此之外的方法
1、可以通过反编译APP文件,再篡改内部证书信息。难度较大,可能会遇到难搞的加壳、或者代码混淆的情况。
2、利用Frida框架进行APK注入,从而绕过证书检测。Frida工具中包含了一个能够让应用程序在运行时加载Frida的动态库,并允许我们对目标应用程序的代码和指令进行动态修改。
什么是双向认证?
双向认证的就是客户端校验证书的同时,服务端也要校验证书,无论哪个出现错误都会造成无法建议连接。相比 SSL Pinning 来说,两者实现的功能差不多但是使用双向认证会更贵点。
解决方法:反编译找证书私钥
1、先通过工具反编译APK文件,找到证书的文件。一般证书文件可能会放在assets或者res目录下,我是直接搜索证书文件格式后缀的如:crt、cer、p12、pfx等等。
2、找到证书文件后打开它会发现是需要私钥的。通过在反编译好的源代码中查找相关函数,找到私钥。
3、导入输入私钥后的证书到burpsuite后,即可正常抓包了。
至于怎么快速定位到私钥位置,可以关键字多搜索“key”、“password”、“ssl”等关键字,难点还是反编译后遇到难脱的壳和代码混淆的问题。
问题描述
有些情况下APP是不走代理服务的,比如说手机已设置好burpsuite代理,通过手机浏览器访问网页可以正常抓包。然后关掉burpsuite软件,手机浏览器不可访问任何网页,但是APP可以正常访问业务。那么就可以说明APP使用了默认禁用系统代理的网络请求框架。
解决方法:HTTP Debugger Pro
这个工具是全局抓http/https流量,可以通过这个工具抓取模拟器上的流量。
除此之外的方法
1、可以使用 Packet Capture 一款依托安卓系统自身 VPN 来达到免 Root 抓取数据包的应用程序,可以捕获 Android 手机上的任何网络流量。就是操作起来会比较麻烦,需要到手机里面复制数据包的请求,然后再发送到burpsuite中进行操作。
2、可以使用frida来hook网络请求框架的限制函数或方法,从而绕过验证。
问题描述
顾名思义就是说APP会对当前网络是否属于代理环境进行检测,如果属于就禁止建立连接访问。
解决方法:遇到这种检测机制,没啥好办法了。只能用hook出代理环境限制的函数或方法,从而绕过限制。
问题描述
有些情况下使用了JustTrustMe也无法成功获取数据包,可能是APP使用了自定义的库进行证书校验,导致无法匹配通用的Hook函数,导致抓包失败。
解决方法:通过反编译查看源代码,了解对应证书检验函数后重新编写Hook脚本。使用frida执行hook后再进行抓包。
问题描述
APP在安卓7.0或更高的系统下,无法抓取数据包。是因为安卓7.0开始 https 是不会走自己安装的证书的,根本原因是安卓sdk24可以设置只信任系统证书,所谓的中间人攻击就不起效果。
解决方法:使用低于7.0版本的安卓系统进行抓包。
原创文章从自己的公众号搬运过来的,感兴趣的可以关注一波呀。