Android 系統(tǒng)各個(gè)版本上https的抓包

一栅隐、本文側(cè)重點(diǎn)在哪?

  1. https 的客戶端和服務(wù)器端的請(qǐng)求流程,加了Charles之后對(duì)請(qǐng)求有什么影響(中間人攻擊)
  2. 我們?cè)瓉?lái)怎么抓https包的
  3. Android 7.0 (api 24 ) 和 targetSdkVersion 對(duì)抓包的影響
    開(kāi)發(fā)者對(duì)自己app的抓包,
    逆向工程師對(duì)別人app的抓包
  4. 有 CA 簽名的證書訪問(wèn)https的app和自簽名證書app
    微博和我們自己的app
  5. 設(shè)置 VirtualApp 為debug模式捏题,并且設(shè)置VA 的targetSdkVersion <24

二、測(cè)試環(huán)境

  • Android EVA-AL00 7.0 API 24 華為,安裝了Charles根證書刻肄,并且設(shè)置了代理
  • Android EVA-AL00 6.0 API 23 華為,安裝了Charles根證書融欧,并且設(shè)置了代理
  • 微博客戶端敏弃,微博熱搜榜接口這個(gè)接口當(dāng)時(shí)是用oppo測(cè)試機(jī)抓的不用關(guān)心里面的參數(shù)噪馏,能用就行
  • 網(wǎng)絡(luò)請(qǐng)求框架 okhttp3

三麦到、https 通信過(guò)程和中間人攻擊

下圖是https 客戶端和服務(wù)器端通信的基本流程

https 通信過(guò)程.png

那么如何抓包呢,原理其實(shí)說(shuō)起來(lái)也很簡(jiǎn)單欠肾,就是在客戶端給服務(wù)器端發(fā)消息的時(shí)候瓶颠,中間人(Charles)截取客戶端發(fā)送給服務(wù)器的請(qǐng)求,然后偽裝成客戶端與服務(wù)器進(jìn)行通信刺桃;將服務(wù)器返回給客戶端的內(nèi)容發(fā)送給客戶端粹淋,偽裝成服務(wù)器與客戶端進(jìn)行通信。

其實(shí)Charles就是這么做的,當(dāng)配置了Charles之后廓啊,理論上所有的http/https請(qǐng)求數(shù)據(jù)都被攔截到了欢搜。看下面一張簡(jiǎn)化的中間人抓包的圖:

中間人抓包圖.png

四谴轮、我們?cè)瓉?lái)怎么抓https包的

分為三步

  1. 手機(jī)上導(dǎo)入Charles根證書炒瘟,導(dǎo)入方式見(jiàn)Charles官網(wǎng)

    Charles導(dǎo)入根證書到Android設(shè)備上.png

  2. 電腦端Charles設(shè)置https抓包配置
    菜單欄 Proxy -->ProxySetting


    電腦端Charles設(shè)置.png
  3. 手機(jī)端配置代理


    手機(jī)端配置代理.png

理論上來(lái)說(shuō)按照上面的配置,配置之后第步,然后手機(jī)上安裝新浪微博客戶端之后就能抓到微博的數(shù)據(jù)了疮装。我們分別用Android6.0 和 Android7.0 的手機(jī)打開(kāi)微博客戶端看下效果:

發(fā)現(xiàn)在6.x系統(tǒng)上,微博打開(kāi)正常粘都,并且Charles顯示列出了已經(jīng)抓到的微博的接口api廓推。

但是在Android 7.x操作系統(tǒng)上,微博顯示網(wǎng)絡(luò)出錯(cuò)啦翩隧,請(qǐng)點(diǎn)擊按鈕重新加載如下圖:

Android 7.X系統(tǒng)微博抓包失敗

而且Charles上顯示確實(shí)抓到了包樊展,但是報(bào)錯(cuò)You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu.,Charles說(shuō)手機(jī)端沒(méi)有信任Charles的根證書堆生,但是我們手機(jī)上已經(jīng)安裝了Charles根證書了专缠,為什么會(huì)這樣?

原來(lái)在Android 7.0(API 24 ) 淑仆,有一個(gè)名為“Network Security Configuration”的新安全功能涝婉。這個(gè)新功能的目標(biāo)是允許開(kāi)發(fā)人員在不修改應(yīng)用程序代碼的情況下自定義他們的網(wǎng)絡(luò)安全設(shè)置。如果應(yīng)用程序運(yùn)行的系統(tǒng)版本高于或等于24蔗怠,并且targetSdkVersion>=24墩弯,則只有系統(tǒng)(system)證書才會(huì)被信任。所以用戶(user)導(dǎo)入的Charles根證書是不被信任的寞射。具體說(shuō)明看官方文檔在這個(gè)官方文檔里面說(shuō)了渔工,如何能指定信任用戶安裝的根證書從而可以實(shí)現(xiàn)抓包。

五桥温、Android 7.0 (api 24 ) 和 targetSdkVersion 對(duì)抓包的影響

這里要分兩種情況:

  • 抓自己開(kāi)發(fā)的app的網(wǎng)絡(luò)包
  • 抓第三方app的網(wǎng)絡(luò)包引矩,比如微博客戶端

這兩種情況有什么區(qū)別的,第一種app是我們自己開(kāi)發(fā)的策治,我們手里有源碼脓魏,能夠修改兰吟,能夠做到像官方文檔里面說(shuō)的一樣進(jìn)行配置通惫。第二種我們沒(méi)有源碼,要想做到像官方文檔里面配置的話混蔼,只能反編譯后履腋,把配置文件添加進(jìn)去然后重新打包,但是重新打包就會(huì)遇到很多坑,并不一定能成功遵湖,所以需要使用其他方式達(dá)到抓包目的悔政。

引用官方文檔一句話:默認(rèn)情況下,來(lái)自所有應(yīng)用的安全連接(使用 TLS 和 HTTPS 之類的協(xié)議)均信任預(yù)裝的系統(tǒng) CA延旧,而面向 Android 6.0(API 級(jí)別 23)及更低版本的應(yīng)用默認(rèn)情況下還會(huì)信任用戶添加的 CA 存儲(chǔ)谋国。應(yīng)用可以使用 base-config(應(yīng)用范圍的自定義)或 domain-config(按域自定義)自定義自己的連接。

如何能在Android 7.0 上成功的抓自己開(kāi)發(fā)的app的https的包

目前我常用的有三種方式:

  1. 操作系統(tǒng)迁沫,通過(guò)apk里面的配置文件控制app的證書信任機(jī)制

Android 官方文檔里的配置方式進(jìn)行配置芦瘾,文檔里面講的很詳細(xì),7.0之后對(duì)于自己app可選擇的可信任的證書鏈控制很細(xì)集畅。我這里只添加一種方式近弟,讓我們自己開(kāi)發(fā)的app能夠信任Android手機(jī)上用戶導(dǎo)入的根證書。

如下圖所示挺智,手機(jī)的根證有兩種祷愉,一種是系統(tǒng)預(yù)裝的,一種是用戶自己導(dǎo)入的:


手機(jī)上的證書分為兩種.png

配置方式:

添加如下文件 res/xml/network_security_config.xml 到你的代碼里面赦颇,然后就能實(shí)現(xiàn)debug模式下二鳄,信任用戶自己安裝的根證書,比如Charles的證書:

<network-security-config> 
  <!-- Trust user added CAs while debuggable only -->
  <debug-overrides> 
    <trust-anchors> 
      <!--信任用戶安裝的證書-->
      <certificates src="user" /> 
    </trust-anchors> 
  </debug-overrides> 
</network-security-config>

然后在你 app的 manifest 文件中引入上面的文件, 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config" ... >
        ...
    </application>
</manifest>

然后配置好之后沐扳,這樣就可以直接訪問(wèn)泥从,https請(qǐng)求,并且通過(guò)Charles抓包了沪摄。

  1. 降低 targetSdkVersion 的版本來(lái)繞過(guò)Android 7.0(api 24)上網(wǎng)絡(luò)的安全機(jī)制
    如果我們不想像上面一樣配置這么復(fù)雜的東西躯嫉,可以通過(guò)降低targetSdkVersion的方式來(lái)達(dá)到一樣的效果,在gradle文件中配置 targetSdkVersion < 24 就可以了杨拐,但是這玩意在以后開(kāi)發(fā)規(guī)范中有可能是不允許的祈餐。
defaultConfig {
        applicationId "me.febsky.okhttp.test"
        minSdkVersion 19
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

網(wǎng)絡(luò)請(qǐng)求測(cè)試代碼如下,別忘了配置manifest文件中申請(qǐng)網(wǎng)絡(luò)請(qǐng)求權(quán)限:

package me.febsky.okhttp.test;

import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread() {
            @Override
            public void run() {
                super.run();

                String url = "https://api.weibo.cn/2/guest/cardlist?" +
                        "networktype=wifi&uicode=10000327&moduleID=708&checktoken=" +
                        "&c=android&i=a52f1e4&s=c1108e87&ua=OPPO-OPPO%20R9m__weibo__6.8.2__android__android5.1" +
                        "&wm=9847_0002&aid=01AilAKZLB81znjKciZxofmqIMYg52EReWuEaQL7hIDXj6IR4." +
                        "&did=b87cc255f19b91ff8e202968adab0eb9fc159a2e&&v_f=2&v_p=33" +
                        "&from=1068295010&gsid=_2AkMg6ZSSf8NhqwJRmP0QzGPgb4l_wgjEieLBAH7sJRM3HRl-3T9jqnUstRUyD-wT6lM3A4HWHM1fFXBWuOYnxg.." +
                        "&lang=zh_CN&page=1&skin=default&count=20&oldwm=9893_0044" +
                        "&sflag=1&containerid=1087030002_2982_2_50&need_head_cards=0";

                OkHttpClient okHttpClient = new OkHttpClient.Builder()
                        .connectTimeout(10, TimeUnit.SECONDS)
                        .writeTimeout(10, TimeUnit.SECONDS)
                        .readTimeout(10, TimeUnit.SECONDS)
                        //.sslSocketFactory()
                        .build();

                Request request = new Request.Builder()
                        .url(url)
                        .build();

                okHttpClient.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        Log.e("Q_M", "GET -->" + e.toString());

                    }

                    @Override
                    public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                        Log.d("Q_M", "GET -->" + response.body().string());
                    }
                });
            }
        }.start();
    }
}
  1. 修改http請(qǐng)求框架的協(xié)議棧哄陶,讓框架不驗(yàn)證證書

這里我們用的是okhttp的網(wǎng)絡(luò)請(qǐng)求框架帆阳,如何添加信任證書或者,不驗(yàn)證證書屋吨,可以參考官網(wǎng)文檔蜒谤,或者自行搜索。這會(huì)因?yàn)槟闶褂玫目蚣懿煌煌至扰,F(xiàn)在的開(kāi)發(fā)者一般沒(méi)人這么用吧鳍徽,這么用了,還特么用啥https 案铱巍阶祭?绷杜?!

如何在Android 7.X 以上系統(tǒng)中抓第三方app的https包

一般情況下第三方我們都是抓第三方app的包濒募,是為了分析別人的數(shù)據(jù)鞭盟。但是像上面所說(shuō)的前兩種方式一般在第三方app上不會(huì)存在的,誰(shuí)也不想讓自己的app被抓包不是瑰剃。

  1. 我們可以通過(guò)重打包的方式強(qiáng)行修改配置齿诉,或者強(qiáng)行降低 targetSdkVersion,或者強(qiáng)行修改別人源碼里面的信任證書的代碼晌姚,然后再重打包就好了(分別針對(duì)上面1鹃两,2,3里面所說(shuō)的方法舀凛,只不過(guò)通過(guò)逆向的方式添加)俊扳。

  2. 通過(guò)使用Xposed的 JustTrustMe 模塊來(lái)信任所有的證書,Xposed不會(huì)用的看這里

  3. 有點(diǎn)偽~~猛遍,使用Android 7.0 以下的系統(tǒng)安裝應(yīng)用馋记,并抓包

  4. 使用雙開(kāi)沙箱應(yīng)用,比如VirtualApp懊烤,讓被抓包的應(yīng)用運(yùn)行到VA里面梯醒,并且修改VA的targetSdkVersion < 24,或者通過(guò)Manifest文件里面配置networkSecurityConfig屬性腌紧,讓他信息Charles證書茸习。

  5. 把 Charles 證書,打入到Android 系統(tǒng)信任證書里面去

六壁肋、使用自簽名證書的應(yīng)用和雙向驗(yàn)證的應(yīng)用

在抓取一些第三方應(yīng)用的包的時(shí)候号胚,他們比較頑固:其一呢,客戶端通過(guò)指定的方式只信任某一個(gè)證書浸遗;其二猫胁,我們一般來(lái)說(shuō)只有客戶端驗(yàn)證服務(wù)端公鑰證書是不是合法,但是某些app跛锌,比如支付寶弃秆,采用雙向驗(yàn)證的方式,在通信過(guò)程中髓帽,服務(wù)器會(huì)驗(yàn)證app的公鑰證書菠赚,這時(shí)候,就沒(méi)辦法使用Charles(中間人攻擊的方式)抓包了郑藏。

自簽名證書的https和CA簽名的https 區(qū)別在哪里衡查?對(duì)https請(qǐng)求的影響又在哪里?關(guān)于這些問(wèn)題建議了解些證書和CA相關(guān)的概念以及證書分發(fā)的流程译秦。

從前面的https 客戶端和服務(wù)器端通信的時(shí)序圖中可以看到峡捡,在握手過(guò)程中客戶端會(huì)驗(yàn)證服務(wù)器的公鑰證書。如果證書驗(yàn)證不通過(guò)會(huì)終止請(qǐng)求筑悴。那么問(wèn)題來(lái)了们拙,證書合不合法誰(shuí)說(shuō)了算?一般來(lái)說(shuō)阁吝,在Android 手機(jī)出廠的時(shí)候會(huì)預(yù)裝一些證書砚婆,這些證書是CA的根證書,理論上來(lái)說(shuō)默認(rèn)是可信任的突勇。如上圖:手機(jī)上的證書分為兩種.png 里面的系統(tǒng)列表的證書就是装盯。對(duì)于網(wǎng)站來(lái)說(shuō),這個(gè)驗(yàn)證過(guò)程是由瀏覽器來(lái)做的甲馋,瀏覽器通過(guò)系統(tǒng)里面預(yù)裝的CA的根證書來(lái)驗(yàn)證這個(gè)服務(wù)器的證書是不是由系統(tǒng)已經(jīng)有的這些CA簽發(fā)的埂奈。如果是那么就認(rèn)為這個(gè)https的請(qǐng)求中的服務(wù)器證書是可信的。

但是話說(shuō)回來(lái)定躏,我們?cè)陂_(kāi)發(fā)app的時(shí)候账磺,請(qǐng)求網(wǎng)絡(luò)一般用的是網(wǎng)絡(luò)框架,這靈活性就比較好了痊远,大多數(shù)的網(wǎng)絡(luò)請(qǐng)求框架(HttpClient垮抗,OkHttp等)都支持修改這個(gè)證書驗(yàn)證過(guò)程,就是我不用上面所說(shuō)的瀏覽器驗(yàn)證證書的過(guò)程碧聪,修改框架里面這個(gè)驗(yàn)證過(guò)程冒版,(因?yàn)镃A簽發(fā)證書是要花錢的好多公司都是用的自簽名的證書)指定框架在驗(yàn)證的時(shí)候只會(huì)認(rèn)為和我們公司一樣的證書才認(rèn)為驗(yàn)證成功,才能進(jìn)行接下來(lái)的通信逞姿。

其實(shí)上面 通過(guò)使用Xposed的 JustTrustMe 模塊來(lái)信任所有的證書辞嗡,Xposed不會(huì)用的看這里 就是針對(duì)這些網(wǎng)絡(luò)請(qǐng)求框架進(jìn)行攻擊的 通過(guò)hook的方式強(qiáng)制讓這些網(wǎng)絡(luò)框架信任所有的證書。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滞造,一起剝皮案震驚了整個(gè)濱河市欲间,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌断部,老刑警劉巖猎贴,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蝴光,居然都是意外死亡她渴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蔑祟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)趁耗,“玉大人,你說(shuō)我怎么就攤上這事疆虚】涟埽” “怎么了满葛?”我有些...
    開(kāi)封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)罢屈。 經(jīng)常有香客問(wèn)我嘀韧,道長(zhǎng),這世上最難降的妖魔是什么缠捌? 我笑而不...
    開(kāi)封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任锄贷,我火速辦了婚禮,結(jié)果婚禮上曼月,老公的妹妹穿的比我還像新娘谊却。我一直安慰自己,他們只是感情好哑芹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布炎辨。 她就那樣靜靜地躺著,像睡著了一般聪姿。 火紅的嫁衣襯著肌膚如雪蹦魔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天咳燕,我揣著相機(jī)與錄音勿决,去河邊找鬼。 笑死招盲,一個(gè)胖子當(dāng)著我的面吹牛低缩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播曹货,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咆繁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了顶籽?” 一聲冷哼從身側(cè)響起玩般,我...
    開(kāi)封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎礼饱,沒(méi)想到半個(gè)月后坏为,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镊绪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年匀伏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝴韭。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡够颠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出榄鉴,到底是詐尸還是另有隱情履磨,我是刑警寧澤蛉抓,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站剃诅,受9級(jí)特大地震影響巷送,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜综苔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望位岔。 院中可真熱鬧如筛,春花似錦、人聲如沸抒抬。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)擦剑。三九已至妖胀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惠勒,已是汗流浹背赚抡。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纠屋,地道東北人涂臣。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像售担,于是被迫代替她去往敵國(guó)和親赁遗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容