作者:軒夏
中間人攻擊(Man-in-the-Middle Attack,簡稱“MITM攻擊”)是一種“間接”的入侵攻擊,這種攻擊模式是通過各種技術手段將受入侵者控制的一臺計算機虛擬放置在網絡連接中的兩臺通信計算機之間,這臺計算機就稱為“中間人”。通過中間人攻擊可以竊取信息、進行篡改、欺騙等多種攻擊。
對于Android平臺上的中間人攻擊已經討論的比較多,今天來聊聊iOS平臺上的中間人攻擊,以及iOS的可信證書管理。
在未做特殊說明的情況下,本文所有實驗環境為:
iPhone 5 + iOS 8.1.2 + 已越獄。
iOS平臺上根據中間人攻擊的難度,可以將中間人攻擊分為3個等級:
1) level1:在沒用向手機中安裝攻擊者證書的情況下可以進行中間人攻擊
2) level2:在向手機中安裝攻擊者證書的情況下可以進行中間人攻擊
3) level3:在向手機中安裝攻擊者證書的情況下也不可以進行中間人攻擊
對于這三種情況,我們以一個例子分別對這三種情況進行說明。借用Owasp關于iOS https中間人演示的例子,稍做修改。正常情況下,程序啟動時如圖1,點擊“Fetch Secret”程序請求server端數據并顯示,如圖2。
圖 1 啟動界面
圖 2 正常獲取數據
在此次連接的NSURLConnection對象的delegate類中只實現一個connection:didReceiveAuthenticationChallenge:
方法,如圖3。
圖 3 連接校驗方法
設置burp suite,開啟代理,如圖4。
圖 4 burp suite設置
手機設置代理為burp suite運行pc的地址,如圖5。
圖 5 手機代理設置
運行程序,點擊“Fetch Secret”,程序正常獲取到了與圖2相同的數據,burp suite也截獲了所有信息,如圖6,中間人攻擊成功。
圖 6 burp suite截獲數據
修改程序,在NSURLConnection對象的delegate類中實現connection:willSendRequestForAuthenticationChallenge:
方法,如圖7。
圖 7 連接校驗方法
其他設置與1.1.1小節完全相同,程序發現連接異常,終止獲取數據,如圖8,burp suite也理所當然獲取數據失敗。
圖 8 獲取數據失敗
此時,向手機中安裝burp suite證書,如圖9。
圖 9 安裝burp證書
重新打開應用,點擊“Fetch Secret”,應用正常獲取數據,burp suite也截獲了全部數據,中間人攻擊成功。
繼續對程序進行修改,將公鑰證書放入應用中,并修改connection:didReceiveAuthenticationChallenge:
方法在連接過程中獲取證書信息,對server端證書進行強校驗,如圖10。同時,注釋掉connection:willSendRequestForAuthenticationChallenge:
方法,因為如圖實現了這個方法,方法connection:didReceiveAuthenticationChallenge:
將不會被調用。
圖 10 連接校驗方法
其他設置不變,手機中依然安裝有burp suite證書,打開應用,點擊“Fetch Secret”,應用無法正常獲取數據,如圖11,burp suite也不能截獲數據,中間人攻擊失敗。
圖 11 證書錯誤
一般來說,建議應用信任手機中的所有證書即可,在應用中置入公鑰證書對連接進行強校驗確實最為安全,但會引發諸多問題,如證書更新、證書過期、證書作廢等。
如果需要更新客戶端證書,都必須升級客戶端版本,而升級客戶端是一個較為漫長的過程。 例如證書被黑客竊取,需要緊急作廢證書,而許多用戶卻有沒有及時升級客戶端的習慣,這將可能導致大面積用戶使用出現網絡異常的情況。就目前來看,也確實很少看到有應用將安全級別做到level3。
上一章節中談到向手機中導入可信證書的問題,小生在編寫一個iOS工具的時候無意發現iOS證書管理的一個有趣的地方。通過“Settings”->“General”->“Profiles”可以查看當前設備信任的證書列表,但這個列表就真的是設備信任的證書列表嗎?
按照上一章節建議,將應用防中間人級別設置為level2,即應用信任當前設備上的所有證書,如果要使用burp suite對該應用進行中間人攻擊,需要向設備中安裝burp的證書,而目前設備上的信任證書如圖12所示,設備上只有一個用于連接公司內網的員工證書。
圖 12 證書列表
在這樣的情況下,burp suite應該不能獲取到應用的通信內容,而結果如何了。為了排除結果受到iOS系統在https通信時的10分鐘緩存機制,先對設備進行重啟或靜置10分鐘;啟動應用進行通信,發現應用正常獲取到了與圖2所示相同的數據,而burp suite也成功截獲了與圖6所示相同的通信內容。這是什么鬼……
iOS系統下有一個有一個sqlite3文件,其絕對路徑為:
“/private/var/Keychains/TrustStore.sqlite3”
該文件中存儲的才是當前設備真正信任的證書列表,而通過“Settings”->“General”->“Profiles”查看到的證書列表與該文件中存儲的證書列表可以不同步,如果我們手動對該sqlite3文件進行更改,就能讓手機實際的可信證書列表與在“Profiles”中看到的完全不一樣。小生寫了一個工具,對該sqlite3文件進行管理,查看該文件中的存儲,如圖13。
圖 13 證書列表
其中,ID為0的證書是圖12中看到的用于連接公司內網的員工證書;ID為1的證書為burp suite證書,而這張證書沒有在“Profiles”中顯示。這就是導致能中間人的原因。
我們刪除掉該sqlite3文件中的ID為1的證書,如圖14,并對設備進行重啟或靜置10分鐘,再進行2.1章節中的實驗。
圖 14 刪除burp證書
打開應用,點擊“Fetch Secret”,應用報錯,如圖15。
圖 15 證書錯誤
如果重新將burp suite證書手動插入TrustStore.sqlite3文件中,如圖16,并對設備進行重啟或靜置10分鐘,再進行2.1章節中的實驗,發現中間人攻擊成功。而本文中對TrustStore.sqlite3文件的所有手動操作,都不會影響到“Profiles”中的任何顯示,“Profiles”始終只顯示一張員工證書。
圖 16 插入證書
根據2.1和2.2小節的描述,如果攻擊者通過越獄插件、甚至是通過某些猥瑣手段逃過App Store檢查的惡意應用,對已越獄的iphone手機上的文件“/private/var/Keychains/TrustStore.sqlite3
”進行修改,向其中插入了一張攻擊者證書,例如burp suite證書,攻擊者就可以在受害者的網關上神不知鬼不覺的進行中間人攻擊(當然level3安全級別下的應用是沒門的),受害者完全不知情,因為受害者通過“Settings”->“General”->“Profiles”查看可信證書的時候,不會發現任何異常,即可以在不顯示證書的情況下竊取受害者數據、進行篡改等。
所以,對于已越獄的手機,不要以為“Settings”->“General”->“Profiles”下沒有安裝一些奇奇怪怪的證書就高枕無憂了。
iOS系統的中間人攻擊方法與防范措施,總結在在0x01章節中,小生認為普通應用只需要信任當前設備上的所有可信證書即可。關于iOS系統的可信證書列表,越獄過的朋友還是去檢查下“/private/var/Keychains/TrustStore.sqlite3
”文件中是否有“Profiles”中未顯示或顯示不對等的情況。