2020年4月18日 星期六

開放網路上的 mitmproxy 服務架設筆記

mitmproxy 運作原理 好奇你手機上的 apps 都在傳什麼資訊給哪些網站嗎? 假設你有足夠的耐性, 可以試著把封包側錄下來分析。 如果是 http (未加密) 的連線, 可以用 wireshark -- 請搜尋 「wireshark 封包」。 但現在幾乎所有連線都變成加密的 https 了。 這時可以用 mitmproxy

我自己沒有耐性, 不過 有新鮮的肝可以操 有認真的學生可以派作業 :-) 網路上已有很多 mitmproxy 中文教學文: [簡潔詳細深入、 ...] 這一篇只是筆記一下自架 mitmproxy 服務的經驗。 它的運作原理, 12 這兩篇解釋得很清楚, 尤其是圖畫得超棒, 借來貼在這裡。 簡單地說, https 的 "secure" 來自底層的 TLS 協定, 照理來說是不怕中間人攻擊的。 因此整件事的重點就是必須在客戶端設定: 全然信任自架的 mitmproxy, 也就是要把 mitmproxy 的身份識別 (CA certificate) 匯入到客戶端成為它所信任的 憑證頒發機構 (Certificate Authority)

這篇要處理的情境是:

  1. 在公開的伺服器上架設一個 「mitmproxy 服務」, 省掉每位學生自架的麻煩。 學生只需要設定客戶端, 這可以降低參與的門檻。
  2. 我的 debian 伺服器的 python 有點舊; mitmproxy 需要 3.5 以上才能運作。
  3. 最好要讓學生可以從網頁界面操作/研究 (降低門檻!)
  4. 客戶端用 firefox 測試。 (因為我的測試用 android 虛擬環境還沒架好...)

首先是 python 版本太舊的問題。 Python 有 virtualenv, 但我覺得那對開發者比較有用, 因為他們要面對很多不同的版本、 需要經常切換。 我只是要讓 mitmproxy 能動而已。 所以我用 root 的身份 編譯並安裝較新的 python。 重點: 設定的時候需要指定 --with-ensurepip=install 像這樣: ./configure --enable-optimizations --enable-shared --with-ensurepip=install 另外, 安裝的時候要用 make altinstall 這樣才不會把系統預設的版本蓋掉。 (這很重要嗎? 我也不知道...)

其次, 我在伺服器上建一個新的帳號 (useradd ...), 在他的 ~/.bashrc 裡面加這幾句:

alias python='/usr/local/bin/python3.7'
alias pip='/usr/local/bin/pip3.7'
export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib
export PATH=$HOME/.local/bin:$PATH

那麼這個用戶的 python 及 pip 就固定用 3.7 版 (我編譯的是 3.7 版) 這樣不是簡單很多嗎?

再來是安裝 mitmproxy 本身。 以下都是以這個新用戶的身份執行。 很簡單, 就一句話: pip install --user mitmproxy 。 然後用 mitmweb 指令就會啟動 mitmproxy 在 port 8080 等待客戶端連線, 順便帶出一個瀏覽器視窗, 指向 127.0.0.1:8081 讓監控者觀察。 如果希望自己手動開瀏覽器 (例如我想用 firefox 不想用 chromium-browser) 那就指定 --no-web-open-browser ; 如果希望本機 (伺服器以外) 的任何客戶端也都能使用 mitmproxy 的服務 (這裡我卡關好久) 那就指定 block_global=false ; 但是這樣有點危險, 至少也順便用 -p 把它搬到非正規的 port (例如 3255) 去服務吧。 最終我的指令長得像這樣: mitmweb --no-web-open-browser --set block_global=false -p 3255

但是這個網頁介面只能從伺服器本機查看。 這個如果開放給所有人看就太危險了 (而且好像也找不到選項可以打開)。 所以以上其實是用 novnc 連線完成的。

最後用 firefox 來當測試客戶端。 包含兩個步驟:

  1. 把 ~/.mitmproxy/mitmproxy-ca-cert.pem 下載回來客戶端電腦, 進 firefox 的設定, 「Privacy and Security」 => 「Certificates」 那一節的 「View Certificates」 => 「Authorities」 分頁下的 「Import」 選擇剛剛下載回來的 mitmproxy-ca-cert.pem。
  2. 一樣在 firefox 的設定裡, 「General」 分頁最下面的 「Network Settings」, 對話框中設定 「Manual proxy configuration」, 「HTTP Proxy」 欄位填伺服器名稱, 「Port」 欄位填 3255 (以上面的例子來說), 緊接下方的 「Use this proxy server for all protocols」 打勾。

儲存設定之後, 再開其他網頁時, 就會看到 novnc 視窗 (我用 chromium-browser 連 novnc) 裡面的瀏覽器 (看 127.0.0.1:8081 的那個分頁) 開始動起來囉。

為了研究手機 apps 如何偷窺用戶 (例如 小影 Camera360 和美圖秀秀), 我和學生只好偷窺它們在傳什麼資料。 我架的 mitmproxy "服務" 是拿來 「以其人之道還治其人之身」 的還擊工具; 路人請不要亂入試用, 否則所有的通訊內容都會被我側錄偷窺看得一清二楚啊 :-) 讓我們一起用 mitmproxy 研究熱門的 apps 看看有誰把個資偷偷傳到中國去吧!

把 mitmproxy-ca-cert.pem 匯入到 firefox 之一 把 mitmproxy-ca-cert.pem 匯入到 firefox 之二

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。