在一次測試中偶然遇到一個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
沒有任何關於密鑰的代碼。感覺事情並不尋常,可能掉到了什么詭異的坑里。
-
代碼不完整,可能密鑰沒脫出來
-
證書庫可能有什么問題
網上找了httpsURLConnection類的雙向https的實現demo——幾乎完全一致。那一定是證書庫有什么玄學的問題,找到了關於證書文件格式的介紹(
https://blog.csdn.net/zzhongcy/article/details/22755317)幾個相關的文件格式如下:
Emmmmm,開始了兜兜轉轉之旅,之后再次查看了代碼中涉及的函數說明
第一次調用load使用的密碼是keystore的解鎖密碼
第二次調用init使用的密碼Keystore中的恢復密碼——推測就是私鑰證書的密碼。
福爾摩斯:“當你排除了所有的不可能,無論剩下的是什么,即使再不可能也一定是真相。”密碼肯定沒有問題,一定是keytool有點問題,網上找了款證書管理的工具portecle,兩次輸入相同密碼,成功打開獲取私鑰證書:
生成了p12格式的客戶端證書,心里真是的萬馬奔騰。
導入burpsuite,啟動抓包:
還是失敗,推測可能是證書信任或者服務端證書缺少的問題 ,將另一個bks庫中的ca證書和server證書導出,導入到windows證書庫中,成功抓包:
后續加密的方式解決起來就是一些常規方式了。