HTTP

HTTP 流量監控 (Traffic Monitor)


Photo by Fiddler.
 
(5-2) 代理 (proxy)、隧道 (tunnel) 與 閘道 (gateway)
 
使用 TLS (i.e., HTTPS),
會變成 使用者代理 (User Agent)代理 (proxy) 進行 TLS/SSL handshake
除非 代理 (prxoy) 也有 TLS/SSL 憑證,且 使用者代理 (User Agent) 信任該憑證,
使用者代理 (User Agent) 無法直接源伺服器 (Origin Server) 建立安全連線。
 
TLS on Proxy
 
 
大多數 流量監控 (Traffic Monitor),正是使用此原理,
使用者代理 (User Agent)源伺服器 (User Agent) 之間,
加入中介 (e.g., Proxy、Gateway),並讓 User Agent 信任該憑證
 
如此一來,HTTP 或 HTTPS 訊息內容皆能一覽無遺 !
而此種代理 (proxy),又稱 除蟲代理 (debugging proxy)
 
 
本篇將介紹幾種 debugging proxy,無論開發、測試都非常實用!
 


 

Fiddler

Fiddler 是一老牌的 debuggin proxy,雖標榜全瀏覽器、系統 即平台,
我都只用在 Windows (其他平台需用如 Mono 的跨平台方案)。
 
其 UI/UX 我實在無法喜歡 😐,但:
重點是 免費!
重點是 免費!
重點是 免費!
 
各位就放心到 官網 下載吧 !
 
 

信任憑證

為了讓 User Agent 能與 proxy 建立安全連線 (i.e., HTTPS),
所有 debugging proxy 的第一步,幾乎都是 — — 信任憑證 (Trust Certificate)
 
安裝完成,並打開 Fiddler 後,會看到類似的畫面 :

 
 
選擇上方選單 Tools → Telerik Fiddler Options (Telerik 為公司名稱) :

 
 
選取 HTTPS 分頁 → Trust Root Certificate (信任根憑證),
接著會出現詢問視窗: 若想攔截 HTTPS 流量,就選 YES 吧!

 
 

匯入/出 憑證

然而,每個 使用者代理 (e.g., 瀏覽器) 的信任政策不一,
先隨便連個網站,查看是否正常,否則,需依各自方式設定 (大同小異) :
 
例如,FireFox 並不信任此憑證,而產生 SEC_ERROR_UNKNOWN_ISSUER 錯誤:

 
解法很簡單:

將憑證匯入給 FireFox,並信任它即可!

 
Q: 問題是 憑證 (certificate) 從何而來 ?
 
 
A: 跟 Fiddler 要。
 
 
首先,選取 HTTPS 分頁 → Export Root Certificate to Desktop (匯出根憑證至桌面) :

 
進入 FireFox 的選項頁面 → 進階 → 憑證:

 
檢視憑證清單 → 匯入 → 信任:

 
大功告成 !

 
 

設置代理

既然說是 debugging「proxy」
連線就得通過此 代理 (proxy),才能被有效監控。
 
proxy
 
大部分應用,都會自動設定完成,所以無需擔心,
然而,若有串接 連接鍊 的需求,則需自行設置,
例如,個人通常依不同用途、規則,串接 4~5 個 proxy。
 

設置 代理 (proxy) 需知道 IP 位址 即 連接埠 (port)。

 
Fiddler 的 IP 位址通常使用 127.0.0.1 的 localhost 即可,
而 埠號 可以從 選項頁面的 Connections 找到 (預設為 8888)。
 
Windows :

 
macOS :

 
 
咦 ? 為何 macOS 不是設置 127.0.0.1 ?
 

127.0.0.1 是 localhost,顧名思義 — — 本地主機,
我使用的 Fiddler 是在 Windows 上,
與 macOS 為不同主機,當然無法使用啦 !

 
若屬相同的網路環境,能以 ipconfig 指令 (windows) 獲取區域 IP:
(macOS 則使用 ifconfig 指令)

 

也能用相同的方式,監控 移動裝置 (e.g., 手機) 喔 !

 
 

監控訊息

接著,便能從 Fiddler 主頁面的 會話列表 (Session List)
選取欲檢測的訊息,並利用右方的 Inspectors (檢測器) 查看訊息內容 !
 
其中,上方是 請求訊息、下方是 回應訊息:

 
要在茫茫訊息海中,找到心儀的對象,是相當不容易的 😱,
可以使用右方的 Filters (過濾器),設置相關規則,
讓 會話列表 (Session List) 僅顯示感興趣的目標 !
 
 

檢視

Fiddler 提供了多種的 訊息 檢視 (view) 方式,相當方便 !
Raw 為例, 是指 Fiddler 「接收」的 原始訊息 (Raw Message),
可以看到 請求目標 為 絕對形式 (absolute-form) :

 
 
不同於 Raw,Headers 檢視,是 Fiddler 「發送」的訊息表頭,
可以看到 請求目標 已轉為 原始形式 (origin-form) :

 
 
Fiddler 還有許多功能,如 請求/回應 攔截 (intercept)
礙於篇幅,就不多做介紹啦,交給各位餵狗囉 😄 。
 


 

Charles


 
Charles,俗稱花瓶,
是令一輕量的 debuggin proxy,也支援全平台,
在 macOS 上,我使用它來處理所有簡易訊息。
 
介面清爽、簡單,個人相當喜歡 😀,可惜:
並非 免費!
並非 免費!
並非 免費!
 
各位可到 官網 下載試用 !
 
 

信任憑證

debugging proxy 幾乎都大同小異,
第一步,幾乎都是 — — 信任憑證 (Trust Certificate)
 
安裝完成後,可能出現以下詢問 (安裝 add-on),可自行選擇:

 
 
進入主畫面後,可以切換左上角的 Structure 與 Sequence 分頁,選個喜歡的瀏覽方式,
中間的 Filter (過濾器) 輸入框,能簡易的塞選訊息:

 
 
選擇上方選單 Help → SSL Proxing → Install Charles Certificate (安裝 Charles 憑證)

 
 
開始安裝:

 
 
自訂存放區:

 
 
確認警告:

 
 

匯入/出 憑證

老樣子,先隨便連個網站,查看是否正常,
否則,需依各 使用者代理 方式設定:
 
咦 !? 成功了 !?

 
 
fake
 
注意:

Charles 預設是 盲中繼 (blind relay) — — 隧道
純轉發 HTTPS 訊息,而不進行 TLS 交握。

 
因此,選擇上方 Proxy 選單 → SSL Proxing Settings :

 
 
並設置欲使用 SSL Proxy 的 主機,
這裡使用「*」,代表 所有 SSL/TLS 都進行代理,
並設置 HTTPS 的埠號 443 :

 
 
設完後,重新整理頁面,便可能看到錯誤畫面:

 
 

別怕,與上方的 Firefox 設置方式如出一轍。

 
首先匯出憑證:

 
 
記得,取個名字:

 
 
進入 Chrome 的設定 → 進階 → 管理憑證 → 匯入憑證:

 
 
別忘記選擇「受信任 的根憑證」喔 !

 
 
準備將訊息抽絲剝繭吧 😈!
 
 

設置代理 — iPhone

上方介紹了,以 區域 IP 監控跨主機訊息。
這邊示範,如何以相同的方式監控 iPhone !
(Android 手機,也大同小異喔 🤓)
 
首先,將 電腦 與 iPhone 連線至 相同的網路環境 (e.g., Wifi)。
接著利用 ipconfig/ifconfig 指令 或 網路設定頁面 (macOS) 取得主機 IP:

 
 
進入 iPhone 的 Wifi 設定,
選擇 i 進入進階選項,並設置主機的 IP 位址 與 埠號 (預設 8888) :

 
 

Per-host Certificate

接著,用 iPhone 連線到各網站,皆會出現以下警告 :

 
 
你可以選擇 詳細資訊 → 信任:

 
 
然而:

每換一個網域,你就得重新信任一次…

 
這種憑證,稱為 Per-host,會根據不同 Host 派發,
因此,直接信任所有 Per-host 的老爸 — — 根憑證 (Root Certificate) 才是良策。
 
 
(iPhone) 打開瀏覽器,輸入 chls.pro/ssl 即能下載根憑證:

 
 
選擇右上角方的「安裝」,即大功告成 !

 
 

監控訊息

如此,便能同時監控 電腦 與 移動裝置 (iPhone) HTTPs 流量 !

 
另外…,許多遊戲的排名、數值,也都能靠這招破解 😂,
大家可以嘗試看看 (咦? 😳:

(低調..)
 
 

取消代理

以 macOS 為例,
開啟 Charles 時,預設為自動進行代理設置,
正常來說,關閉 Charles 時,也會自動取消代理設置:

 

然而,一個例外是: iPhone USB

 
若 mac 以 iPhone USB 的方式上網,
設定選項中,並 沒有 提供 代理設定,將面臨無法關閉的問題,
造成沒打開 Charles 便無法上網 !
 
解決方式是 使用 終端機 (Terminal) 下指令,直接關閉對應介面的代理狀態:

networksetup -setwebproxystate "iPhone USB" off
networksetup -setsecurewebproxystate "iPhone USB" off

 
當然,其他介面也能以同樣方式 開啟/關閉:

networksetup -setwebproxystate "Thunderbolt Ethernet" off
networksetup -setsecurewebproxystate "Thunderbolt Ethernet" off

 
 
我怎麼知道介面名稱?

networksetup -listallnetworkservices

 
 
Debugging proxy 是監控 HTTP(s) 流量最常見的方式,但 不是唯一
有捕捉網路介面的 封包分析神器 — — Wireshark
另外,也有更強大的 debugging proxy — — Burp Suite
但它們做為 HTTP Monitor 皆殺雞用牛刀了,暫不介紹。
 
Charles 同樣支援 訊息攔截、反向代理、自動請求…等功能,輕巧且實用,
若經濟能力允許,可以找朋友團購喔 !
 

 
 

作者: 鄭中勝
喜愛音樂,但不知為何總在打程式 ? 期許能重新審視、整理自身所學,幫助有需要的人。

在《HTTP 流量監控 (Traffic Monitor)》中有 1 則留言

  1. 在 使用者代理 (User Agent) 與 源伺服器 (User Agent) 之間,
    这里写错了吧,源伺服器 应该叫 Origin Server

發表迴響