01 聲明
由於傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測以及文章作者不為此承擔任何責任。
雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用於商業目的。
02 正文
在一次測試中偶然遇到一個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格式的客戶端證書,心里真是的萬馬奔騰。

還是失敗,推測可能是證書信任或者服務端證書缺少的問題 ,將另一個bks庫中的ca證書和server證書導出,導入到windows證書庫中,成功抓包:

