當(dāng)你需要逆向分析一個(gè)網(wǎng)絡(luò)協(xié)議的時(shí)候,或者進(jìn)行一些關(guān)于網(wǎng)絡(luò)安全方面的行為的時(shí)候,你就需要去收集網(wǎng)絡(luò)中傳輸?shù)牧髁繑?shù)據(jù),通過(guò)收集網(wǎng)絡(luò)中的傳輸數(shù)據(jù)信息,你可以去理解網(wǎng)絡(luò)協(xié)議是怎么工作的,或許還能發(fā)現(xiàn)網(wǎng)絡(luò)中傳輸?shù)拿舾行畔ⅰ?/span>
如果網(wǎng)絡(luò)協(xié)議傳輸?shù)氖敲魑男畔ⅲ呛芎棉k,直接用tcpdump 或者wireshark等類似的抓包軟件就可以獲取網(wǎng)絡(luò)協(xié)議傳輸?shù)男畔?nèi)容,但是現(xiàn)在越來(lái)越多的協(xié)議使用了加密機(jī)制,比如HTTPS協(xié)議,這時(shí)候就需要MITM(中間人攻擊)進(jìn)行攔截加密協(xié)議。
本篇文章我會(huì)向大家介紹如何在 OSX上監(jiān)控一個(gè)app的HTTPS流量以及實(shí)驗(yàn)中遇到的問題。
0x01 正文
攔截HTTPS流量的基本步驟
1)生成一個(gè)根證書
2)安裝這個(gè)根證書
3)用proxychains 去代理指定的app
4)使用mitmproxy 去攔截流量
一些需要安裝的軟件
1、 安裝并配置proxychains
brew install proxychains-ng
創(chuàng)建一個(gè)名為 proxychains.conf 的文件,然后加入以下內(nèi)容:
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 這行最重要,它的意思是說(shuō)重定向app所有的流量到127.0.0.1:8080 (mitmproxy默認(rèn)監(jiān)控端口就是8080),然后我們就可以用mitmproxy在127.0.0.1:8080 監(jiān)控所有的流量了。
2、使用pip安裝并配置mitmproxy
pip install --upgrade pip
pip install mitmproxy
這兩行命令就可以安裝好mitmproxy
執(zhí)行以下命令運(yùn)行mitmproxy
./mitmproxy --host
接下來(lái)就是給系統(tǒng)安裝根證書,默認(rèn)情況下mitmproxy會(huì)自動(dòng)生成一個(gè)根證書(mitm-ca-cert.pem),這個(gè)根證書位于~/.mitmproxy下面。
首先執(zhí)行
open ~/.mitmproxy
然后,按下組合鍵 Command + Space ,然后輸入Keychain Access, 回車
然后找到mitmproxy根證書,雙擊 ,或者將mitmproxy根證書拖拽到Keychain Access 窗口中上述執(zhí)行OK,之后,你將會(huì)看到下圖顯示內(nèi)容

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

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

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

看到錯(cuò)誤信息,我好像知道了問題的原因了,網(wǎng)絡(luò)數(shù)據(jù)被Hook給了mitmproxy,mitmproxy給的證書requests根本不信任啊,因?yàn)閜ython 代碼根本不知道m(xù)itmproxy的根證書在哪兒啊,所以我們只要修改python代碼,在get請(qǐng)求中指定mitmproxy的根證書路徑即可
import requests
r = requests.get('https://calebfenton.github.io/', verify='/Users/caleb/.mitmproxy/mitmproxy-ca-cert.pem')
|