APP Https雙向認證抓包


       在一次測試中偶然遇到一個https雙向認證的手機app(fiddler抓包提示需要提供客戶端證書),平時一梭子能搞定地抓包姿勢沒有效果了,本着所有客戶端發出的數據都是操控的想法,決定搞一搞,無非是采用什么方式的問題。雙向認證只要拿到客戶端加密的私鑰證書就行了。
       很不巧,手機app被加殼了,基本上告別動態調試的方式。
       在assets目錄下發現了用於雙向認證的證書庫文件,如下:
       要使用證書庫,我們還需要找到證書庫的密碼, 脫殼獲取部分源代碼,通過關鍵字定位到了如下代碼:
       關鍵代碼在函數m8196a中,具體代碼如下:(因為沒有寫過相關雙向認證和keystore的相關代碼,只能通過java api 文檔查查函數說明,補充了注釋)
 
      String str = "X509";
        String str2 = "BKS";
        Application b = MyApplication.m5574b();
        SSLSocketFactory sSLSocketFactory = null;
        try {
            KeyStore instance = KeyStore.getInstance(str2);
            KeyStore instance2 = KeyStore.getInstance(str2);
            InputStream open = b.getAssets().open(f7624a); // 取了客戶端證書的keystore
            InputStream open2 = b.getAssets().open(f7625b); // 取了服務端相關證書的keystore文件
            instance.load(open, f7626c.toCharArray()); // 通過密鑰庫密碼打開客戶端 keystore
            instance2.load(open2, f7627d.toCharArray());// 通過密鑰庫密碼打開服務端keystore
            open.close();
            open2.close();
            SSLContext instance3 = SSLContext.getInstance("TLS");
            TrustManagerFactory instance4 = TrustManagerFactory.getInstance(str);
            KeyManagerFactory instance5 = KeyManagerFactory.getInstance(str);
            instance4.init(instance2);
            instance5.init(instance, f7626c.toCharArray());// 再次輸入了密鑰庫的密碼
            instance3.init(instance5.getKeyManagers(), C2639d.m8197a(instance4.getTrustManagers()), null);
            sSLSocketFactory = instance3.getSocketFactory();// 完成了sslsocketfactory
            return sSLSocketFactory;
        } catch (KeyStoreException e) {
              ………….省略
對於keystore認識的缺乏的我開始了繞圈之路。誤以為已經搞定了雙向認證,打開了burpsuite導入證書:
       Pkcs12格式,暴露了我對證書相關格式的盲區,google告訴我用keytool可以進行證書格式的轉換,如下:
       Emmmm? 還需要密鑰口令,本着試試相同密碼的嘗試(代碼訪問了同一個密碼兩次)(畢竟代碼里沒有看到其他密碼)——繞圈的開始
復制,粘貼——go
       Emm 手動輸入試試
       Emmmm,what?
       代碼里沒有看到相關密碼,決定搜搜相關的調用,上級調用在函數m5660a
       沒有任何關於密鑰的代碼。感覺事情並不尋常,可能掉到了什么詭異的坑里。
  1. 代碼不完整,可能密鑰沒脫出來
  2. 證書庫可能有什么問題
網上找了httpsURLConnection類的雙向https的實現demo——幾乎完全一致。那一定是證書庫有什么玄學的問題,找到了關於證書文件格式的介紹( https://blog.csdn.net/zzhongcy/article/details/22755317)幾個相關的文件格式如下:
       Emmmmm,開始了兜兜轉轉之旅,之后再次查看了代碼中涉及的函數說明
       第一次調用load使用的密碼是keystore的解鎖密碼
第二次調用init使用的密碼Keystore中的恢復密碼——推測就是私鑰證書的密碼。
福爾摩斯:“當你排除了所有的不可能,無論剩下的是什么,即使再不可能也一定是真相。”密碼肯定沒有問題,一定是keytool有點問題,網上找了款證書管理的工具portecle,兩次輸入相同密碼,成功打開獲取私鑰證書:
生成了p12格式的客戶端證書,心里真是的萬馬奔騰。
導入burpsuite,啟動抓包:
       還是失敗,推測可能是證書信任或者服務端證書缺少的問題 ,將另一個bks庫中的ca證書和server證書導出,導入到windows證書庫中,成功抓包:
       后續加密的方式解決起來就是一些常規方式了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM