Android Https “中間人攻擊” 攻防戰

在密碼學和計算機安全領域中,中間人攻擊(Man-in-the-middle attack,縮寫:MITM)是指攻擊者與通訊的兩端分別建立獨立的聯繫,並交換其所收到的數據,使通訊的兩端認爲他們正在通過一個私密的連接與對方直接對話,但事實上整個會話都被攻擊者完全控制。

中間人攻擊原理:

Https中間人攻擊,最常見的攻擊方式:SSL/TLS證書欺騙攻擊,即劫持客戶端網絡請求,僞造證書,如下圖所示:


客戶端被中間人攻擊的主要原因:

客戶端對返回的證書鏈校驗不嚴謹

證書鏈默認校驗原理(如下圖):
1、網站的證書鏈通常分爲三級(不完全是):CA根證、CA二級證書、域名證書;
2、CA根證作爲移動設備系統預埋、默認授信的證書(可在手機設置裏面看到);
3、當Https網絡請求時,服務端默認返回除CA根證外的證書鏈;
4、從域名證書信息中查找自己的簽發根證,逐級直到CA根證;
5、從CA根證取出公鑰校驗其簽發證書的簽名,逐級直到域名證書;

如果手機中已安裝了抓包工具的CA根證(如Charles、Fiddler導出的根證書文文件),當我們Https請求時,抓包工具會返回經過僞造的證書。所以,當通過上面這種常規的校驗方式時,無論怎麼校驗都是通過的,因爲:這三個證書都是抓包工具僞造的。

中間人攻擊方式:
1、將中間人的CA根證安裝到移動設備授信證書列表中;
2、攔截Https網絡請求,僞造完整證書鏈;
3、逐級查找證書鏈時,完全正確;
4、逐級校驗證書籤名信息時,完全正確;
5、這樣客戶端會認爲服務器返回的證書沒有問題,可以繼續操作;

如何防禦?

1、將服務器CA根證預埋客戶端,僅基於該CA根證校驗;
2、將服務器CA根證的公鑰預埋客戶端,判斷公鑰合法性;
3、Https雙向校驗;
4、除了使用Https,業務數據再單獨加密(安全性高);
防禦方式一:將服務器CA根證預埋客戶端,僅基於該CA根證校驗;
通常做法:

1、將服務器對應的CA證書放置客戶端:

a、可以是單個CA根證書文件
     --  程序中設置使用該CA根證校驗
     --  但是,CA根證也有過期時間,如果CA根證過期,需要升級客戶端,比較麻煩

b、也可以是預埋多個CA根證書文件,可使用bks證書庫來管理
     --  程序中設置使用該bks證書庫校驗
     --  如果當前CA根證過期,bks中還有其他CA根證可備選,僅升級服務端即可(服務端更換匹配的證書)

2、代碼中指定使用該CA根證書校驗(非設備授信清單裏的根證)
3、這樣中間人抓包就會失效了,因爲咱們指定的CA根證書中並不包含其根證。

如何破解(後面再詳細介紹)?

1、Root設備,安裝Xpose工具,抹掉指定根證校驗的代碼即可;
2、Root設備,安裝Xpose工具,安裝JustTrustMe.apk,禁止TLS證書驗證;

防禦方式二:將服務器CA根證的公鑰預埋客戶端,判斷公鑰合法性

與方式一類似,請參考方式一即可。

防禦方式三:Https雙向校驗

在方式一的基礎上,本地再預埋客戶端證書,當Https通信時,做兩次校驗,即:客戶端對服務器證書進行認證,服務器對客戶端證書進行認證,以防止證書被篡改。

這種校驗方式的破解難度,要比方式一難很多,即使將本地的客戶端校驗給破解了,也很難解決服務器端的校驗邏輯。但是要注意本地證書庫密鑰的管控,儘量不要直接硬編碼到程序中。

防禦方式四:除了使用Https,業務數據再單獨加密(安全性極高)

這種方式也是目前很多銀行和支付軟件常用的方式,Https僅是作爲常規的加密手段,更重要的是應用內業務數據單獨加密的邏輯,即:客戶端與服務器握手時,單獨約定密鑰,使用約定密鑰對業務數據進行加密,加密後的數據再通過Https傳輸。
這樣,即使設備被Root、Hook,破解了Https,獲得的仍然是密文數據。
除此之外,一些銀行或支付軟件會還會採用本地預埋證書的方式進行單/雙向校驗,以增加Https被破解的難度。

開發者如何對自己的APP Https抓包?

1、如果APP沒有采用上面的防禦方式,就比較簡單了:
知識點:
1、手機設置中授信的根證列表,有兩種:系統級、用戶級
2、第三方根證,默認只能安裝在用戶及授信的根證列表中
3、谷歌在安卓7.0修改了安全策略,用戶添加的CA證書(用戶級授信根證列表)不能再用於安全連接

常規抓包方式:
1、7.0以下手機,安裝抓包工具CA根證,配置抓包代理,直接抓包即可
2、7.0以上手機,增加程序配置,設置用戶級授信根證列表可信任:networkSecurityConfig,抓包
3、7.0以上手機,Root,將抓包工具CA根證安裝到系統級授信根證列表中,直接抓包即可
4、Root手機,安裝Xpose工具,安裝JustTrustMe.apk,禁止TLS證書驗證,抓包;

2、如果APP採用了方式一:

常規抓包方式:
1、註釋指定本地CA根證校驗的代碼,然後參考上面的抓包方式
2、將抓包工具的根證也放在本地(如:導入bks),參與Https校驗(注意:千萬別打包到生產包中)
3、Root手機,安裝Xpose工具,安裝JustTrustMe.apk,禁止TLS證書驗證;

3、如果APP採用了方式二:

參考上面抓包方式

4、如果APP採用了方式三、四:

代碼在手,邏輯自由 o(*^@^*)o  哈哈~

能不能抓包成功,是由開發者對程序代碼邏輯的熟悉度決定的,好好分析一下~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章