Fiddler抓安卓的HTTP/HTTPS包 常用方法

1,789 阅读6分钟

**安卓app抓包一般采用手机和电脑连在同一网络下,在安卓手机里设置wifi代理的形式来进行,windows上使用Fiddler,OSX系统上采用charles,本文讲解使用Fiddler抓安卓包 **


1、安装使用方法

       首先安装好fiddler后,我们要开启Fiddler的HTTPS抓包功能,否则只能看到HTTP请求的内容,而HTTPS请求则是密文。在Fiddler中点击 [Tools] — [Options] — [HTTPS] 勾选如下设置:

74ED898B-3EDF-44CA-B000-39ECD0446FA0.png

      然后在 [Connections] 选项卡中勾选 [Allow remote computers to connect],我们知道Fiddler默认在8888端口开启HTTP/HTTPS代理服务,不管是Android、IPhone还是PC等等设备和程序,只要设置了HTTP/HTTPS代{过}{滤}理,流量从Fiddler走,就可以抓包分析。此处开启远程访问,使得我们的Android/Iphone手机可以在WLAN设置上设置它为HTTP/HTTPS代理,从而手机上的应用的HTTP/HTTPS流量将从Fiddler走,Fiddler就能捕获它们。

C5C21973-8C8A-4078-A30E-4074B029E03F.png

      然后确保手机和PC在同一个局域网中,然后在手机上手动设置WLAN代理,把代理地址设置pc的地址。为此处我的PC内网IP地址是192.168.1.100,你需要根据自己的情况进行设置

      然后我们在手机浏览器中打开http://192.168.1.100:8888 下载Fiddler根证书并安装

这是Fiddler解密HTTPS通信的关键,Fiddler对HTTPS包解密的原理是中间人攻击,对客户端声称自己的服务端,对服务端声称自己的客户端,两头欺骗。当然要想欺骗成功,前提是让客户端信任自己的根证书,接下来就可以愉快的观看HTTPS请求明文内容了。


2、能抓的包

         使用上面方法一般能抓到的包请求包括:

                    1、android内置浏览器的请求

                    2、应用内置的webview

                    3、应用使用URLConnection或者OKHttp

          抓不到包,很可能目标APP使用了其它HTTP Client,比如自带一个libcurl的so,那样最终调用的是系统的Socket API,WLAN上设置的HTTP/HTTPS代{过}{滤}理对它无效,但其实这种情况很少,市面上绝大多数的应用,都是使用URLConnection和OkHttp,尤其是近些年的应用,几乎都是清一色的OkHttp,所以绝大多数情况下都能抓到包,如果抓不到,很可能是应用自己进行了额外的SSL证书校验工作,根据情况再特殊分析特殊处理


3、安卓抓包的变化(Android7.0以后抓包失败)

        以前我一直都是在Android5.1的手机上抓包分析应用,屡试不爽,但是近来使用Android7.1和Android8.1的手机,发现按照上面设置以后,尽管向Android导入了Fiddler的根证书,还是没法抓到HTTPS包的内容。

       猜想:很可能在Android7.0以及以后的版本,即便是导入了Fiddler根证书,但是APP的URLConnection、OkHttp、WebView,仍然不信任系统中导入的Fiddler根证书。

       后来证明确实是如此,在安卓官方文档中developer.android.com/training/ar…有如下说明

    

By default, secure connections (using protocols like TLS and HTTPS) from all apps trust the pre-installed system CAs, and apps targeting Android 6.0 (API level 23) and lower also trust the user-added CA store by default.

也即是:在Android 6.0 (API level 23)及以前,APP默认信任系统自带的CA证书以及用于导入的CA证书,Android 6.0 (API level 23)以后,APP默认只信任系统自带的CA证书,对于用户导入的不予理会。

那android apk中的代码关于 [network-security-config]部分,在Android 6.0 (API level 23)及以前默认是这样的:

<base-config cleartextTrafficPermitted="true”> 

   <trust-anchors>

       <certificates src="system" /> 

       <certificates src="user" />

    </trust-anchors>

</base-config>

Android 7.0 (API level 24) 及以后是这样的:

<base-config cleartextTrafficPermitted="true">

    <trust-anchors>

        <certificates src="system" />

    </trust-anchors>

</base-config>

        同时在上面的链接中,Google也给出了办法,怎么在Android7.0及以后的系统中,让APP信任我们手工导入的CA证书。那就是在编译APK之前,在你的Android项目的res文件夹下创建xml文件 [net_security_config.xml] 内容为:


<network-security-config xmlns:android="http://schemas.android.com/apk/res/android">

    <base-config cleartextTrafficPermitted="true">

        <trust-anchors>

            <certificates src="system" overridePins="true" />

            <certificates src="user" overridePins="true" />

        </trust-anchors>

    </base-config>

</network-security-config>

      然后在AndroidManifest.xml中的application标签下添加

android:networkSecurityConfig="@xml/net_security_config.xml"

编译安装,然后该APP就信任用户添加的CA证书,从而Fiddler就可以抓到它的HTTPS包并解密内容。


4、解决方法

强上的办法有四个:

① 重新打包目标APK,修改AndroidManifest.xml

        我们可以使用Apktool等工具对目标APK进行解包,添加 [net_security_config.xml] 并修            改 [AndroidManifest.xml] 然后重新打包。但是现在很多应用都做了防打包处理,要么利用Apktool弱点,制造错误让Apktool抛异常,要么重新打包后程序校验自身证书,校验失败无法启动,罢工。

② Root手机,安装Xposed框架,使用JustTrustMe模块干它

        这个方案实际上就是之前我们在 《Windows抓包指南(二):Fiddler抓不到的包是怎么回事?》中的思路在Android上的实践。Xposed的JustTrustMe模块Hook了Android SDK的HTTP库,强制跳过SSL证书验证,不管是真证书还是假证书,一律验证通过,于是Fiddler作为中间人攻击制造的假证书也被通过了。

JustTrustMe项目源代码:github.com/Fuzion24/Ju…

需要注意的是JustTrustMe有个坑,不要下载它Github中编译的Latest release版本,其实那是一个很古老的版本,对于APP内嵌的WebView没有做处理,安装以后,URLConnection、OkHttp通信的HTTPS是可以抓到了,但是APP内嵌的WebView仍然出错。所以最好git clone它的最新源代码,然后自行编译。

也可以下载我编译的最新版本:github.com/encoderlee/…

当然这个方案也有缺点,毕竟手机被Root后,还安装了Xposed框架,有的APP可是会检测的,发现手机被Root,或者自身被Xposed Hook,就罢工了。

③退缩,使用Android5.1 Android6.0的手机来抓包分析

④终极大法,购入Google亲儿子手机,比如Nexus Pixel,下载Android AOSP代码,直接修改Android系统源代码,强行验证所有SSL证书为真,编译,刷机,愉快工作。


5、变异的情况

① 二次加密

         有的APP,在涉及到关键数据通信时,会将正文二次加密后才通过HTTPS发送,我们抓包抓到的是一堆二进制base64

② 自带HTTP Client

         像支付宝那样的变态,自己带了一个基于so的HTTP Client库,对于关键数据,都不走URLConnection和OkHttp,而是走自己的HTTP Client库,甚至一些WebView页面的渲染,都是先用自带的HTTP Client请求得到json数据,然后填到HTML模板里面,再在WebView里渲染出来。

③ SSL/TLS Pinning,APP自带服务端证书,除了自带证书什么都不信