0x00 前面
如果你是一干Web安全的,當你在測試目前大多數的手機APP應用程式時,你一定遇到過burpsuite無法抓到資料包的情況,開始你以為只是https的問題,但是當你使用了burpsuite偽證照也無法抓取到時,你心裡除了有句“MMP……”外,你一定也在思考這其中的蹊蹺。
為什麼https的網站使用偽證照可以抓到,而在app裡面同樣的方法就抓不到?答案是:app啟用了SSL Pinning(又叫“ssl證照繫結“).
HTTPS的原理你必然懂,在建立ssl通道的過程中,當客戶端向服務端傳送了連線請求後,伺服器會傳送自己的證照(包括公鑰、證照有效期、伺服器資訊等)給客戶端,如果客戶端是普通的瀏覽器,比如IE瀏覽器,則:
1. 使用內建的CA證照去校驗伺服器證照是否被信任,如果不被信任,則會彈出https的告警提示資訊,由使用者自己決定是否要繼續.
2. 同樣,使用者也可以主動的將伺服器證照匯入到瀏覽器的受信任區,下次開啟時該伺服器證照將會自動被信任.
為啥中間人可以劫持https流量,以及在瀏覽器上我們為什麼可以使用burp偽造證照,正是因為上面的2點,既:
1. 瀏覽器允許使用者自行忽略證照告警,使用者在無足夠的資訊保安意識時,可能會直接忽略劉瀏覽器的安全提示,在這篇文章的前2天以太坊錢包MyEtherWallet 就因為黑客使用“BGP流量劫持+HTTPS證照偽造“導致被幹的鼻青臉腫.
2. 瀏覽器允許“匯入證照到瀏覽器信任區“這個操作讓瀏覽器信任burp偽造的證照.
這種偽造證照的中間人攻擊給HTTPS帶來了很大的威脅。
0x01 SSLPinning瞭解一下
如果能夠這樣做,是不是就可以解決這種“中間人劫持+偽造證照“攻擊的問題:
客戶端在收到伺服器的證照後,對該證照進行強校驗,驗證該證照是不是客戶端承認的證照,如果不是,則直接斷開連線。
瀏覽器其實已經這樣做了,但是如“前面”所說,選擇權交給了使用者,且瀏覽器由於其開放性允許讓使用者自匯入自己的證照到受信任區域。
但是在APP裡面就不一樣,APP是HTTPS的服務提供方自己開發的客戶端,開發者可以先將自己伺服器的證照打包內建到自己的APP中,或者將證照籤名內建到APP中,當客戶端在請求伺服器建立連線期間收到伺服器證照後,先使用內建的證照資訊校驗一下伺服器證照是否合法,如果不合法,直接斷開。
當然攻擊者也可以通過把這個APP原始碼給逆出來,然後找到證照校驗這段邏輯,給他幹掉,或者乾脆把證照資訊換成自己的伺服器證照資訊,然後重新打包簽名,但是一旦APP做了程式碼加密和混淆,這個操作也會變得比較難搞。
因此這樣看來,通過預先把伺服器的證照資訊“繫結“在APP的native端,然後建立連線時使用預先內建的繫結資訊進行伺服器證照校驗,同時使用足夠的程式碼加密或混淆,是比較合適的解決辦法, 這個搞法就是“ssl pinning”.
補充:
不要將ssl pinning和https雙向認證搞混了,HTTPS協議本身是支援雙向認真的,既除了客戶端對伺服器證照進行驗證外,伺服器也可以要求客戶端提供自己的證照資訊並對其進行驗證,在APP上,HTTPS雙向認真的方案也可以防止中間人劫持,但這種雙向認證開銷較大,且安全性與”ssl pinning”一致,因此目前大多數APP都採用SSL Pinning這種方案。
0x02 使用Xposed + JustTruestMe來突破SSL pinning
如果你逆向比較在行,你就自己逆原始碼,然後過加密混淆,然後幹掉SSL pinning. 不過使用Xposed + JustTruestMe應該也不丟人。
Xposed是一個框架,它可以改變系統和應用程式的行為,而不接觸任何APK。
它支援很多模組,每個模組可以用來幫助實現不同的功能。
JustTrustMe 是一個用來禁用、繞過 SSL 證照檢查的基於 Xposed 模組。JustTrustMe 是將 APK 中所有用於校驗 SSL 證照的 API 都進行了 Hook,從而繞過證照檢查。
n 準備工作:
1. 準備一個有root許可權的andorid手機或者andorid模擬器
使用手機裝Xposed容易變磚,刷來刷去,很麻煩。個人習慣也推薦直接用andorid模擬器,現在很多andorid模擬器長又好看,廣告又少,各個是人才。
本文使用網易的MUMU模擬器,下載地址:http://mumu.163.com/baidu/ 對應的andorid版本為4.4。
2. 下載Xposed的apk安裝包,下載地址:
http://repo.xposed.info/module/de.robv.android.xposed.installer
在改頁面找到點選下載即可,預設的版本支援Android 4.0.3 up to Android 4.4. 版本
Download: de.robv.android.xposed.installer_v33_36570c.apk (770.28 KB)
注意官方的說明,如果你的模擬器andorid版本為5.0以上,請按照如下說明操作:
For Android 5.0 or higher (Lollipop/Marshmallow), these versions don't work! Use this instead:http://forum.xda-developers.com/showthread.php?t=3034811
3. 下載JustTrustMe模組
https://github.com/Fuzion24/JustTrustMe/releases/tag/v.2
注意下載 JustTrustMe.apk版本
n 安裝mumu模擬器
雙擊安裝即可,自己看著辦,安裝完開機,就是這個樣子的:
n 安裝Xposed
點選MUMU主介面由下角的APK+圖示,選擇下載好的Xposed installer的apk包,即可開始安裝,安裝完成後,桌面會生成對應的圖示,開啟
第一次開啟時,“框架”下面會有紅色字型提示更新
不要管,點選框架,進去,點選“安裝更新”,更新完成後,會提示重啟,注意這個時候可能會卡死。
如果不卡死,說明你你比較厲害,點選下面的重啟按鈕重啟。
如果卡死了,直接關閉模擬器,重新開啟即可,再次進入框架頁面,可以看到如下資訊,則說明更新完成。
n 安裝JustTrustMe
點選“模組”,此時還沒有可用的模組, 同樣的方法點選apk+匯入之前下載好的JustTrustMe的apk安裝包,系統會自動安裝,安裝完成後,在模組裡面點選“軟重啟”,再次開啟“模組”介面,即可看到JustTrustMe,勾選一下,啟用這個模組:
到這裡Xposed+JustTrustMe就安裝和啟動了。
接下來就是常規流程了:
1. 在你的MUMU模擬器所在的宿主機上開啟burpsuite,並啟用代理,主要使用實際的IP地址作為監聽地址
2. 給你的MUMU模擬器設定一個代理,因為MUMU模擬器做了很多裁剪,預設不提供wifi配置選項,這裡可以下載一個wifi萬能鑰匙,然後通過它呼喚出wifi設定介面:開啟wifi萬能鑰匙---未登入---設定---設定為wifi管理器---立即設定,即可看到如下選項,選擇wlan,進入wifi設定選項
滑鼠左鍵長安“WiredSSID”這個ssid名詞,會彈出如下選項,選擇修改網路,進入代理配置頁面
把代理選項配置成burp監聽的代理地址,儲存即可。
到這裡你一定會想,這個MUMU模擬器到底用的的是什麼方式與你的宿主機進行通訊的,你可以使用adb shell來看一下,adb是一個連線andorid的命令列工具,windows下的安裝和使用請自行GOOGLE。Mac下的安裝和使用:
1. brew cask install android-platform-tools //安裝adb工具
brew類似linux下的yum,不會用的自己google.
安裝完成後,執行:adb shell 即可連線到mumu虛擬機器
$ adb shell
cancro:/ #
cancro:/ #
cancro:/ #
在這裡可以使用大多數的linux命令,必然ls,vi等,檢視IP地址使用:netcfg
通過檢視ip地址以及ping命令測試,可以發現mumu虛擬機器是通過127.0.0.1進行橋接到宿主機的,因此可以直接使用宿主機的IP地址進行代理。
3. Xposed+JustTrustMe只是解決了SSLpinning的問題,因為通訊本身是HTTPS的因此我們還是需要安裝burp偽證照,直接匯出burp的證照,因為預設格式是.cer的,andorid不支援,需要將這個證照先匯入到瀏覽器在匯出成.pem(x509)格式,然後在MUMU模擬器的設定---安全—從SD卡安裝證照,通過MUMU的提供的共享資料夾將證照選擇到安裝即可,中間需要提示開啟PIN碼認真,開啟一下即可。
到這裡,你必然可以抓到啟用了SSL pinning的APP的HTTPS的資料包了。
#在網上找了一些資料,都寫的不夠完整,昨晚自己折騰了一下,算是一個筆記。勞動節快樂#
本文由看雪論壇 etlpom 原創,轉載請註明來自看雪社群