當你需要逆向分析一個網絡協議的時候,或者進行一些關于網絡安全方面的行為的時候,你就需要去收集網絡中傳輸的流量數據,通過收集網絡中的傳輸數據信息,你可以去理解網絡協議是怎么工作的,或許還能發現網絡中傳輸的敏感信息。
如果網絡協議傳輸的是明文信息,那很好辦,直接用tcpdump 或者wireshark等類似的抓包軟件就可以獲取網絡協議傳輸的信息內容,但是現在越來越多的協議使用了加密機制,比如HTTPS協議,這時候就需要MITM(中間人攻擊)進行攔截加密協議。
本篇文章我會向大家介紹如何在 OSX上監控一個app的HTTPS流量以及實驗中遇到的問題。
0x01 正文
攔截HTTPS流量的基本步驟
1)生成一個根證書
2)安裝這個根證書
3)用proxychains 去代理指定的app
4)使用mitmproxy 去攔截流量
一些需要安裝的軟件
1、 安裝并配置proxychains
brew install proxychains-ng
創建一個名為 proxychains.conf 的文件,然后加入以下內容:
strict_chain
quiet_mode
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
http 127.0.0.1 8080
http 127.0.0.1 8080 這行最重要,它的意思是說重定向app所有的流量到127.0.0.1:8080 (mitmproxy默認監控端口就是8080),然后我們就可以用mitmproxy在127.0.0.1:8080 監控所有的流量了。
2、使用pip安裝并配置mitmproxy
pip install --upgrade pip
pip install mitmproxy
這兩行命令就可以安裝好mitmproxy
執行以下命令運行mitmproxy
./mitmproxy --host
接下來就是給系統安裝根證書,默認情況下mitmproxy會自動生成一個根證書(mitm-ca-cert.pem),這個根證書位于~/.mitmproxy下面。
首先執行
open ~/.mitmproxy
然后,按下組合鍵 Command + Space ,然后輸入Keychain Access, 回車
然后找到mitmproxy根證書,雙擊 ,或者將mitmproxy根證書拖拽到Keychain Access 窗口中上述執行OK,之后,你將會看到下圖顯示內容

如果你足夠細心的話,你會發現刪除安裝好的mitmproxy 根證書前面有個 紅叉 ,這表示系統并不信任這個根證書, 為了讓系統信任這個根證書,你需要這樣做:右鍵單擊mitmproxy根證書,然后選擇"Get Info"(如果你是英文界面的話),展開 "Trust"將: When using this certificate 修改為 Always Trust修改后的內容如下:

接下來, 你還需要執行以下命令,這樣系統才能完全信任這個根證書
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/.mitmproxy/mitmproxy-ca-cert.pem
OK,最后的mitmproxy證書信息界面如下:

看到了吧,mitmproxy 根證書前面的 紅叉 提示不見了,說明系統完全信任了這個根證書
3、開始使用mitmproxy
其實github上mitmproxy的手冊寫的非常好,很詳細,這里我就不過多解釋了
現在我們已經做好了
1)配置proxychains 將app的http流量指向了127.0.0.1:8080
2)安裝好了mitmproxy的根證書
3)mitmproxy運行OK
現在需要做的就是測試是否工作的OK
在另一個終端窗口執行:
proxychains4 -f proxychains.conf curl https://calebfenton.github.io/
現在切換到mitmproxy的運行窗口觀察是否有流量被捕獲到, 結果非常令人失望, 竟然沒有捕獲到任何流量,為毛?因為系統app 根本沒鳥你,我查了一下proxychains 在github上的問題反饋列表,找到了原因 (和SIP有關): https://github.com/rofl0r/proxychains-ng/issues/78 你可以這樣解決這個問題:
cp `which curl` .
proxychains4 -f proxychains.conf ./curl https://calebfenton.github.io/
或者你可以先安裝一個wget,然后將curl替換為wget
brew install wget
proxychains4 -f proxychains.conf ./wget https://calebfenton.github.io/
注: wget不是系統app
一旦你觀察到mitmproxy捕獲到了通信數據,mitmproxy現在工作是正常的, 說明剛才新安裝到系統的mitmproxy的根證書被系統信任了, proxychains 也正確地Hook了網絡通信數據,看起來都很OK,可能很多人都很滿足現在的一切了。
但是當我試圖用proxychains Hook python 代碼所產生的的網絡數據的時候, 問題出現了。
python 代碼如下(保存為文件req.py):
import requests
r = requests.get('https://calebfenton.github.io/')
print(r)
非常簡單的一段代碼(前提是你要安裝了requests庫),和上面curl起到的作用類似,但是執行proxychains4 python req.py 的時候出現了錯誤:

看到錯誤信息,我好像知道了問題的原因了,網絡數據被Hook給了mitmproxy,mitmproxy給的證書requests根本不信任啊,因為python 代碼根本不知道mitmproxy的根證書在哪兒啊,所以我們只要修改python代碼,在get請求中指定mitmproxy的根證書路徑即可
import requests
r = requests.get('https://calebfenton.github.io/', verify='/Users/caleb/.mitmproxy/mitmproxy-ca-cert.pem')
|