1. 程式人生 > >Android 系統各個版本上https的抓包

Android 系統各個版本上https的抓包

code小生,一個專注於 Android 領域的技術分享平臺

作者:奮鬥der小鳥
連結:https://www.jianshu.com/p/3b4cd6fdd8a9
宣告:本文是 奮鬥der小鳥 原創,轉發等請聯絡原作者授權。

本文側重點在哪

  1. https 的客戶端和伺服器端的請求流程,加了Charles之後對請求有什麼影響(中間人攻擊)

  2. 我們原來怎麼抓https包的

  3. Android 7.0 (api 24 ) 和 targetSdkVersion 對抓包的影響

  4. 開發者對自己app的抓包,

  5. 逆向工程師對別人app的抓包

  6. 有 CA 簽名的證書訪問https的app和自簽名證書app
    微博和我們自己的app

  7. 設定 VirtualApp 為debug模式,並且設定VA 的targetSdkVersion <24

測試環境

  • Android EVA-AL00 7.0 API 24 華為,安裝了Charles根證書,並且設定了代理

  • Android EVA-AL00 6.0 API 23 華為,安裝了Charles根證書,並且設定了代理

  • 微部落格戶端,微博熱搜榜介面,這個介面當時是用oppo測試機抓的不用關心裡面的引數,能用就行

  • 網路請求框架 okhttp3

https 通訊過程和中間人攻擊

下圖是https 客戶端和伺服器端通訊的基本流程

640

https 通訊過程.png

那麼如何抓包呢,原理其實說起來也很簡單,就是在客戶端給伺服器端發訊息的時候,中間人(Charles)擷取客戶端傳送給伺服器的請求,然後偽裝成客戶端與伺服器進行通訊;將伺服器返回給客戶端的內容傳送給客戶端,偽裝成伺服器與客戶端進行通訊。

其實Charles就是這麼做的,當配置了Charles之後,理論上所有的http/https請求資料都被攔截到了。看下面一張簡化的中間人抓包的圖:

640

中間人抓包圖.png

我們原來怎麼抓https包的

分為三步

  1. 手機上匯入Charles根證書,匯入方式見Charles官網https%3A%2F%2Fwww.charlesproxy.com%2Fdocumentation%2Fusing-charles%2Fssl-certificates%2F

  1. 640Charles匯入根證書到Android裝置上.png

  2. 電腦端Charles設定https抓包配置

選單欄 Proxy -->ProxySetting

640電腦端Charles設定.png

  1. 手機端配置代理

640

手機端配置代理.png

理論上來說按照上面的配置,配置之後,然後手機上安裝新浪微部落格戶端之後就能抓到微博的資料了。我們分別用Android6.0 和 Android7.0 的手機開啟微部落格戶端看下效果:

發現在6.x系統上,微博開啟正常,並且Charles顯示列出了已經抓到的微博的介面api。

但是在Android 7.x作業系統上,微博顯示網路出錯啦,請點選按鈕重新載入如下圖:

640

Android 7.X系統微博抓包失敗

而且Charles上顯示確實抓到了包,但是報錯You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu.,Charles說手機端沒有信任Charles的根證書,但是我們手機上已經安裝了Charles根證書了,為什麼會這樣?

原來在Android 7.0(API 24 ) ,有一個名為“Network Security Configuration”的新安全功能。這個新功能的目標是允許開發人員在不修改應用程式程式碼的情況下自定義他們的網路安全設定。如果應用程式的SDK高於或等於24,則只有系統證書才會被信任。所以使用者匯入的Charles根證書是不被信任的。具體說明看官方文件在這個官方文件裡面說了,如何能指定信任使用者安裝的根證書從而可以實現抓包。

Android 7.0 (api 24 ) 和 targetSdkVersion 對抓包的影響

這裡要分兩種情況:

  • 抓自己開發的app的網路包

  • 抓第三方app的網路包,比如微部落格戶端

這兩種情況有什麼區別的,第一種app是我們自己開發的,我們手裡有原始碼,能夠修改,能夠做到像官方文件裡面說的一樣進行配置。第二種我們沒有原始碼,要想做到像官方文件裡面配置的話,只能反編譯後,把配置檔案新增進去然後重新打包,但是重新打包就會遇到很多坑。

如何能在Android 7.0 上成功的抓自己開發的app的https的包

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

  1. 作業系統,通過apk裡面的配置檔案控制app的證書信任機制

Android 官方文件裡的配置方式進行配置,文件裡面講的很詳細,7.0之後對於自己app可選擇的可信任的證書鏈控制很細。我這裡只新增一種方式,讓我們自己開發的app能夠信任Android手機上使用者匯入的根證書。

如下圖所示,手機的根證有兩種,一種是系統預裝的,一種是使用者自己匯入的:

640

手機上的證書分為兩種.png

配置方式:

新增如下檔案 res/xml/network_security_config.xml 到你的程式碼裡面:

<network-security-config>
 <debug-overrides>
   <trust-anchors>
     <!-- Trust user added CAs while debuggable only -->
     <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>

然後配置好之後,這樣就可以直接訪問,https請求,並且通過Charles抓包了。

  1. 降低 targetSdkVersion 的版本來繞過Android 7.0(api 24)上網路的安全機制
    如果我們不想像上面一樣配置這麼複雜的東西,可以通過降低targetSdkVersion的方式來達到一樣的效果,在gradle檔案中配置 targetSdkVersion < 24 就可以了。

defaultConfig {
       applicationId "me.febsky.okhttp.test"
       minSdkVersion 19
       targetSdkVersion 22
       versionCode 1
       versionName "1.0"
       testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
   }

網路請求測試程式碼如下,別忘了子啊manifest檔案中申請網路請求許可權:

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請求框架的協議棧,讓框架不驗證證書
    這裡我們用的是okhttp的網路請求框架,如何新增信任證書或者,不驗證證書,可以參考官網文件,或者自行搜尋。這會因為你使用的框架不同而不同。

如何在Android 7.X上抓第三方app的https包

一般情況下第三方我們都是抓第三方app的包,為了分析別人的資料。但是像上面所說的前兩種方式一般在第三方app上不會存在的,誰也不想讓自己的app被抓包不是。

  1. 我們可以通過重打包的方式強行修改配置,或者強行降低 targetSdkVersion,或者強行修改別人原始碼裡面的信任證書的程式碼,然後再重打包就好了(分別針對上面1,2,3裡面所說的方法,只不過通過逆向的方式新增)。

  2. 通過使用Xposed的 JustTrustMe 模組來信任所有的證書,Xposed不會用的看這裡

  3. 哈哈,使用Android 7.0 以下的系統安裝應用,並抓包

使用自簽名證書的應用和雙向驗證的應用

在抓取一些第三方應用的包的時候,他們比較頑固:其一呢,客戶端通過指定的方式只信任某一個證書;其二,我們一般來說只有客戶端驗證服務端公鑰證書是不是合法,但是某些app,比如支付寶,採用雙向驗證的方式,在通訊過程中,伺服器會驗證app的公鑰證書,這時候,就沒辦法使用Charles(中間人攻擊的方式)抓包了。

自簽名證書的https和CA簽名的https 區別在哪裡?對https請求的影響又在哪裡?關於這些問題建議瞭解些證書和CA相關的概念以及證書分發的流程。

從前面的https 客戶端和伺服器端通訊的時序圖中可以看到,在握手過程中客戶端會驗證伺服器的公鑰證書。如果證書驗證不通過會終止請求。那麼問題來了,證書合不合法誰說了算?一般來說,在Android 手機出廠的時候會預裝一些證書,這些證書是CA的根證書,理論上來說預設是可信任的。如上圖:手機上的證書分為兩種.png 裡面的系統列表的證書就是。對於網站來說,這個驗證過程是由瀏覽器來做的,瀏覽器通過系統裡面預裝的CA的根證書來驗證這個伺服器的證書是不是由系統已經有的這些CA簽發的。如果是那麼就認為這個https的請求中的伺服器證書是可信的。

但是話說回來,我們在開發app的時候,請求網路一般用的是網路框架,這靈活性就比較好了,大多數的網路請求框架(HttpClient,OkHttp等)都支援修改這個證書驗證過程,就是我不用上面所說的瀏覽器驗證證書的過程,修改框架裡面這個驗證過程,(因為CA簽發證書是要花錢的好多公司都是用的自簽名的證書)指定框架在驗證的時候只會認為和我們公司一樣的證書才認為驗證成功,才能進行接下來的通訊。

其實上面 通過使用Xposed的 JustTrustMe 模組來信任所有的證書,Xposed不會用的看這裡 https://www.jianshu.com/p/01a9e86581b9 就是針對這些網路請求框架進行攻擊的 通過hook的方式強制讓這些網路框架信任所有的證書。

640

抓包相關

相關推薦

Android 系統各個版本https

code小生,一個專注於 Android 領域的技術分享平臺作者:奮鬥der小鳥連結:https

Android系統各個版本系統特性整理

閒暇無事,整理下Android各個版本系統特性,以方便後續檢視! 1. Android 1.1                               釋出時間:釋出於 2008 年9月 2.Android 1.5  Cupcake紙杯蛋糕 釋出時間:釋出於 2009

關於Android 7.0無法進行https的問題

在App進行資料請求的時候,如果每次都列印log去判斷是一件很不“人性化”的操作行為,所以一般都會進行抓包分析。   以最常用的軟體Fiddler來說,進行普通的http抓包沒什麼事,但是對https的抓包,要在本地安裝Fiddler 的證書才可以,因為https是加密的。又因為是自己安裝的攔截

Mac 下 android/iOS https

選擇 and 偏好設置 browser jdk 相對 需要 nbsp img 一.Charles簡介 Charles,是用Java開發的,所以跨平臺,不僅可以在Mac上使用,Linux以及Window下都是可以使用的,當然需要安裝JDK,才能運行,但目前是收費的。 二.

Android系統匯入burp證書實現取資料

Burpsuit設定代理 瀏覽器設定代理   瀏覽器訪問IP下載burp證書   匯出的證書後綴名為.der,這裡我們更改字尾名為.crt 匯入手機中 複製貼上在我們能記住的目錄 後

Charles工具破解和https問題解決:中文亂碼,Androidhttps亂碼

Charles 破解: 4.0.2 (Mac:/Application/Charles.app/Contents/Java)替換就破解了。 其實看這裡就夠了,下面總結下: 1.檢視電腦端ip.手機端編輯WiFi 繫結代理 手動 ip+埠。(手機wifi和電腦端網

android 真正能用的wireshark能用的第一種方法

題目起得有點大 見笑了 不過搜尋了一下確實沒什麼好辦法 但是我在這裡發現了一個於是推薦給大家 注意: 這個方法有個前提就是你所使用的手機包括電腦必須在一個區域網內 否則要修改ip和其他的一些東西(具體我沒做測試) 首先下載工具: ProxyDroid(android軟體)

移動端https那些事--進階篇

ssh nload 詳細 tro 盤古 支持 url 框架 官方下載 上一次和大家介紹了手機端https抓包的初級篇,即在手機未root或者未越獄的情況下如何抓取https流量,但是當時分析應用時會發現,好多應用的https的流量還是無法抓取到,這是為什麽呢? 主要原因還是

charles支持https配置

alt port 都是 手機瀏覽器 安裝完成 數據 基礎上 export tex 自從公司站點全部啟用https後,使用charles就不能像以前那樣愉快的抓包啦!不過沒關系,這裏教你怎麽配置charles,使其支持https抓包。之前有一篇介紹charles的使用,參考這

Mac使用Charles進行HTTPS

char mac AC 管理 無線 下載 ica 選擇 settings 第一步 配置HTTP代理,這步與抓取HTTP請求是一樣的: 選擇在8888端口上監聽,然後確定。夠選了SOCKS proxy,還能截獲到瀏覽器的http訪問請求。 第二步 安裝電腦端根證

CharlesHTTPS配置

char 警告 剛才 有時 port 沒有 機構 需要 ron 訪問我的博客 前言 由於工作中經常需要配置客戶端開發人員對接接口,有時候對接地不太順利,因此需要經常性地對公司 APP 進行抓包看請求,找出具體的原因。 在公司中開發使用的 Windows 臺式電腦,抓包工具選

DVWA_File Upload 檔案傳木馬 圖片馬的製作 Impossible的程式碼審計

鳴謝(本文大部分內容均轉載自): http://www.storysec.com/dvwa-file-upload.html   檔案上傳漏洞是指伺服器在接收使用者上傳的檔案的時候,沒有嚴格地加以限制和過濾, 如果黑客上傳了木馬,也就是常說的“掛馬”,進而拿到了webshell,就可以為所欲

Android7.0、8.0、9.0的https,charles解決方案

原文地址:https://blog.csdn.net/u011045726/article/details/76064048   Android7.0 和 Charles 的抓包 關於android手機在mac版charles上抓不到包這個問題困擾了很久,查閱了很多資料,發現是an

spy-debugger移動手機除錯和HTTP/HTTPS

簡介 一站式頁面除錯、抓包工具。用於遠端除錯微信、HybridApp等各種WebView樣式、手機瀏覽器的頁面真機除錯。便捷的遠端除錯手機頁面、抓包工具,支援:HTTP/HTTPS,無需USB連線裝置。 spy-debugger原理是集成了weinre,簡化了weinre需要給每

Https工具之Fiddler

簡介 抓包工具可以幫助開發或者測試人員很方便的檢視到實時資料傳輸內容。 操作說明 第一步:設定Fiddler 點選頂部選單欄的Tools>Options,具體選項可以按照我的配置來,只需配置前三個選項夠了。如下圖 第二步:配置手機代理

Charles--/安裝/破解/支援https

 一、安裝破解Charles   1.下載charles4.0.2版本,下面的jar包需要和charles版本對應   2.下載地址:https://www.cr173.com/soft/494576.html    2.1這裡下的是破解版裡面有破

charles Https

ssl ron width 端口號 使用 9.png 筆記本 代理ip tro 一、抓移動端http請求 1.在 Mac 中打開 Charles 應用;Proxy--Proxy Settings 設置port 8888,OK 2.設置手機HTTP代理:確保移

使用Charles進行http/https

昨天電視應用商店的音樂模組,運營同學突然告知無法播放音樂了。之前是客戶端同學先看客戶端日誌,然後告知服務端同學哪些接口出了問題。可客戶端同學離職了,這可就懵圈了。因為服務端我也是剛交接過來不久,不熟悉客戶端頁面和哪些資料介面對應。經客戶端的同學推薦,我發現了Charles抓包神器。下面我講解如何使用charl

fiddler 手機 https

fiddler手機抓包原理 fiddler手機抓包的原理與抓pc上的web資料一樣,都是把fiddler當作代理,網路請求走fiddler,fiddler從中攔截資料,由於fiddler充當中間人的角色,所以可以解密https 下面開始手機抓包設定教程 設定fiddle

Charles的Https及弱網配置

一、Charles的主要功能 (1)擷取Http 和 Https 網路封包。 (2)支援重發網路請求,修改請求引數,方便後端除錯。 (3)支援模擬弱網環境。 二、配置簡單抓包 1、設定系統代理:勾選Proxy—windos proxy(或Mac os x pro