如何查看軟體發出的通訊請求

有沒有好奇過:

  • 軟體是怎樣與外界溝通?
  • 有沒有偷偷連去一些不恰當的網站?

這次我會簡單介紹一些可以讓你「看得見」網絡流量的自由軟體。


Wireshark (Windows/MacOS/Linux/FreeBSD)#

Wireshark is the world’s foremost network protocol analyzer. It lets you see what’s happening on your network at a microscopic level. It is the de facto (and often de jure) standard across many industries and educational institutions.

Wireshark 是一個非常有名的,功能強大的網路封包剖析器。支援 Windows,MacOS,Linux,FreeBSD 等。Wireshark 也經常被作為 學習網絡知識 的教學工具。


由於在絕大部分情況下,軟體都會透過先發出 域名系統Domain Name System/DNS) 的請求,取得對認該 域名Domain Name)的 IP位址Internet Protocol Address)後才會開始通訊的。 因此,我們過濾 DNS 的請求就基本上足夠了。

域名是 example.org 樣式的東西。 IP 位址是 X.X.X.Xxxxx:xxxx:xxxx:xxxx 樣式的東西。前者為 IPv4,後者為 IPv6 的位址。

例如,粗略來說(忽略系統網絡介面,協議詳細等),瀏覽器要連到網域 example.org ,取得網頁內容的時候:

  1. 瀏覽器會要求系統發送 DNS 請求到 DNS 伺服器,查詢 對應的 IP 位址(至於送到哪個 DNS 伺服器則視乎你網絡設定)
  2. DNS 伺服器會查找 DNS 記錄並 回答 你,「93.184.216.34 是對應 example.org 的 IP 位址」(example.org 換了主機,現在你所得的 IP 位址會跟這里的不一樣)
  3. 然後瀏覽器才會要求系統,向位於 93.184.216.34 的主機發送 HTTP 請求,以取得網頁內容

也許可以把 IP 想像為電話號碼,DNS 記錄為聯絡人名單(我們弄了 DNS 這東西,好像也是因為那堆數字太難記了)。


打開 Wireshark,選 any 的網絡介面。打開網頁瀏覽器,前往 example.org(或者你喜歡的其他網址)。回到 Wireshark,在頂部的輸入行里輸入 dns,你應該就會看到像以下的東西。(右下是一個名為 Lynx 的瀏覽器)


Wireshark DNS 過濾範例 Wireshark DNS 過濾範例

在這里你清楚可以看到封包內容,看到我剛提到的流程:

  • Standard query […] A example.org 的查詢
  • Standard query response […] A example.org A 93.184.216.34 的回答。

要排查一個程序,你可以打開 Wireshark 這樣使用。Wireshark 是在網絡接口上(比如 Wi-Fi 或以太網,還有虛擬的接口,像 VPN 用的 TUN)監聽所有封包的。它能的到的資訊非常可靠。

不過這個 DNS 排查方法有些要注意的地方:

  • Wireshark 因為是在網絡接口上監聽,它沒法得到程序名字或者 ID 的資訊,所以 Wireshark 不能告訴你封包是從哪個程序發出的,實際上要排查一般都要在乾淨的環境下進行(比如在虛擬機內進行)。

  • 我們預先假設了該軟體會發送 DNS 協議的封包。如果它們跳過了 DNS,這方法是會漏掉的(比如 IP 地址本來就先記了下來,那就不用發送 DNS 請求了,雖然這情況不常見)。要萬無一失的話就要在乾淨的環境下不開過濾去排查(但 STP 和 ARP 協議一般可以濾掉不看)。

官方 Wiki:https://wiki.wireshark.org/Home


mitmproxy (Windows/MacOS/Linux)#

mitmproxy is your swiss-army knife for debugging, testing, privacy measurements, and penetration testing. It can be used to intercept, inspect, modify and replay web traffic such as HTTP/1, HTTP/2, WebSockets, or any other SSL/TLS-protected protocols. You can prettify and decode a variety of message types ranging from HTML to Protobuf, intercept specific messages on-the-fly, modify them before they reach their destination, and replay them to a client or server later on.

mitmproxy 也是一個監聽流量的工具。支援 Windows,MacOS,Linux。

mitmproxy 顧名思義,它是作為一個中間人(Man in the Middle/MitM),以本地 代理伺服器(proxy)的形式監聽流量的。跟 Wireshark 相比,它只能抓取 HTTP 或 HTTPS 的流量。因此,它比較適合用於監聽網頁瀏覽器等使用 HTTP(S) 通訊的軟體。

使用時你需要轉送你想監聽的軟體的流量到 mitmproxy。mitmproxy 的預設網址是 127.0.0.1:8080127.0.0.1 是一個特殊的 IP 位址,意思是指你 本機(localhost)。

我們現今的網站等服務絕大多數都有使用 HTTPS 做傳輸加密,使中間人無法看見或者篡改你和網站之間的通訊內容。如果你不只想用 mitmproxy 監聽 HTTP 明文流量,HTTPS 的加密流量也想監聽的話,你需要在你瀏覽器或系統上信任 mitmproxy 的 SSL 憑證。

這樣的話,作為中間人的 mitmproxy 就可以解密你的 HTTPS 流量了。憑證的導入請參見官方的教學,或者 [Ubuntu] 將 mitmproxy Root CA 憑證加入信任清單

以下是在其他瀏覽器前往 Wikipedia 後,mitmproxy 上的樣子。

Mitmproxy 範例 Mitmproxy 範例

官方文本:mitmproxy docs

另参見:


netstat (桌面系統通用)#

netstat 是一個命令行介面的網絡工具。基本上在大部分桌面系統都有預裝。


netstat 介面 (https://www.net7.be/blog/article/network_activity_analysis_1_netstat.html) netstat 介面 (https://www.net7.be/blog/article/network_activity_analysis_1_netstat.html)

用法很簡單,以管理員身份執行 netstat -nutpacw 的話就可以即時查看即時的連接狀況,包括程序名稱。詳細用法可以參見 https://zh.wikipedia.org/wiki/Netstat,或者 netstat -h (簡易說明)和 man netstat (詳細說明)。


OpenSnitch (GNU/Linux)#

OpenSnitch 是一個即時性的防火牆,它可以偵測連接並根據訂下來的規則來擋下連接。只適用於 GNU/Linux


OpenSnitch 介面 (https://user-images.githubusercontent.com/2742953/85205382-6ba9cb00-b31b-11ea-8e9a-bd4b8b05a236.png) OpenSnitch 介面 (https://user-images.githubusercontent.com/2742953/85205382-6ba9cb00-b31b-11ea-8e9a-bd4b8b05a236.png)

預設的規則是非常嚴謹(褒義)的白名單模式,沒有被允許的任何連接都會被擋下。在偵察到任何新的程序發出連接時,它會彈出視窗詢問你想採取的動作(是否允許該連接,還有此規則的有效期)。OpenSnitch 可以讓你完全省去手動排查哪些軟體擅自發出背景請求的時間。你甚至會驚訝於某些軟體的「廬山真面目」(比如 Firefox)。

Linux 桌面用必裝軟體

官方使用教學:https://github.com/evilsocket/opensnitch/wiki


PCAPdroid (Android)#

PCAPdroid 是一個 Android 上的連接分析器。


PCAPdroid 介面 (https://f-droid.org/repo/com.emanuelef.remote_capture/en-US/phoneScreenshots/2.jpg) PCAPdroid 介面 (https://f-droid.org/repo/com.emanuelef.remote_capture/en-US/phoneScreenshots/2.jpg)

功能在某程度上有點像 Wireshark,但它能夠針對單個應用分析。

沒有 root 的話則會佔用 VPN 的位子,以本地 VPN 的方式運行。

官方使用教學:PCAPdroid User Guide


personalDNSfilter (Android)#

personalDNSfilter 是一個適用於 Android 的 DNS 過濾器。同時它擁有很易讀的連接日誌(如下圖)。


personalDNSfilter 介面 (https://www.zenz-solutions.de/cms/wp-content/uploads/2022/09/gui.png) personalDNSfilter 介面 (https://www.zenz-solutions.de/cms/wp-content/uploads/2022/09/gui.png)

作為 DNS 請求過濾器,對於指定的 DNS 請求,它會返回一個無效的 IP 位置(0.0.0.0),從而達到阻擋請求的效果。

personalDNSfilter 非常輕便易用,但易用的同時也支援從其他網站導入 hosts 主機黑名單,而且還能使用「​萬用字元」(wildcard character)去訂立黑/白名單。

即是說,如果你想擋下任何包含 johndoe 字串的請求,輸入*johndoe*就可以了。johndoe.comwww.johndoe.xyz等全部都會擋下來。它也可以在連接日誌上讓你直接臨時新增或移除規則,不需要手動填寫,非常方便。要注意的是每次有規則變動的話都要手動 RELOAD FILTER(重新載入),或者 RESTART(重啟)。

如果沒 root 機的話,personalDNSfilter 會以本地 VPN 的方式運行,佔掉你 VPN 的位子(有 root 的話則可以和 VPN 同時運行)。開發者因此弄了個 OpenVPN for personalDNSfilter (基於 OpenVPN for Android 用戶端),用於在無 root 下同時使用 OpenVPN 和 personalDNSfilter。

詳細用法參見:personalDNSfilter help


結語#

現在,利用 Wireshark 等又酷又實用的工具,你應該能夠客觀地「看​得見」裝置上的軟體的網絡流量,不用再依賴口頭,或書面上的聲明,或者輿論去判斷一個軟體的好壞了。

當然,我不是說所有偵測到的連接都一定是好或不好,但我們要想想,這些連接有甚麼用途?開發者有沒有在清楚解釋每一個請求是在做甚麼?

我可以說,一個正常的 Linux 作業系統在你不做任何動作(Linux 有很多大大小小的發行版,我不能保證全部),大概除了時間同步,或者軟體更新,是不會未經許可發出請求的(即使有你也能簡單關掉)。這才是一個作業系統或軟體應有的樣子。