有沒有好奇過:
- 軟體是怎樣與外界溝通?
- 有沒有偷偷連去一些不恰當的網站?
這次我會簡單介紹一些可以讓你「看得見」網絡流量的自由軟體。
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.X 或 xxxx:xxxx:xxxx:xxxx 樣式的東西。前者為 IPv4,後者為 IPv6 的位址。
例如,粗略來說(忽略系統網絡介面,協議詳細等),瀏覽器要連到網域 example.org ,取得網頁內容的時候:
- 瀏覽器會要求系統發送 DNS 請求到 DNS 伺服器,查詢 對應的 IP 位址(至於送到哪個 DNS 伺服器則視乎你網絡設定)
- DNS 伺服器會查找 DNS 記錄並 回答 你,「93.184.216.34 是對應 example.org 的 IP 位址」(example.org 換了主機,現在你所得的 IP 位址會跟這里的不一樣)
- 然後瀏覽器才會要求系統,向位於 93.184.216.34 的主機發送 HTTP 請求,以取得網頁內容
也許可以把 IP 想像為電話號碼,DNS 記錄為聯絡人名單(我們弄了 DNS 這東西,好像也是因為那堆數字太難記了)。
打開 Wireshark,選 any 的網絡介面。打開網頁瀏覽器,前往 example.org(或者你喜歡的其他網址)。回到 Wireshark,在頂部的輸入行里輸入 dns,你應該就會看到像以下的東西。(右下是一個名為 Lynx 的瀏覽器)
在這里你清楚可以看到封包內容,看到我剛提到的流程:
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:8080。127.0.0.1 是一個特殊的 IP 位址,意思是指你 本機(localhost)。
我們現今的網站等服務絕大多數都有使用 HTTPS 做傳輸加密,使中間人無法看見或者篡改你和網站之間的通訊內容。如果你不只想用 mitmproxy 監聽 HTTP 明文流量,HTTPS 的加密流量也想監聽的話,你需要在你瀏覽器或系統上信任 mitmproxy 的 SSL 憑證。
這樣的話,作為中間人的 mitmproxy 就可以解密你的 HTTPS 流量了。憑證的導入請參見官方的教學,或者 [Ubuntu] 將 mitmproxy Root CA 憑證加入信任清單。
以下是在其他瀏覽器前往 Wikipedia 後,mitmproxy 上的樣子。
官方文本:mitmproxy docs
另参見:
netstat (桌面系統通用)#
netstat 是一個命令行介面的網絡工具。基本上在大部分桌面系統都有預裝。
用法很簡單,以管理員身份執行 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 可以讓你完全省去手動排查哪些軟體擅自發出背景請求的時間。你甚至會驚訝於某些軟體的「廬山真面目」(比如 Firefox)。
Linux 桌面用必裝軟體。
官方使用教學:https://github.com/evilsocket/opensnitch/wiki
PCAPdroid (Android)#
PCAPdroid 是一個 Android 上的連接分析器。
功能在某程度上有點像 Wireshark,但它能夠針對單個應用分析。
沒有 root 的話則會佔用 VPN 的位子,以本地 VPN 的方式運行。
官方使用教學:PCAPdroid User Guide
personalDNSfilter (Android)#
personalDNSfilter 是一個適用於 Android 的 DNS 過濾器。同時它擁有很易讀的連接日誌(如下圖)。
作為 DNS 請求過濾器,對於指定的 DNS 請求,它會返回一個無效的 IP 位置(0.0.0.0),從而達到阻擋請求的效果。
personalDNSfilter 非常輕便易用,但易用的同時也支援從其他網站導入 hosts 主機黑名單,而且還能使用「萬用字元」(wildcard character)去訂立黑/白名單。
即是說,如果你想擋下任何包含 johndoe 字串的請求,輸入*johndoe*就可以了。johndoe.com,www.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 有很多大大小小的發行版,我不能保證全部),大概除了時間同步,或者軟體更新,是不會未經許可發出請求的(即使有你也能簡單關掉)。這才是一個作業系統或軟體應有的樣子。