IP 是一種可路由(routed)的協定:網路上的節點不需要知道其他節點的確切位置。當某節點要送資料給一個沒有直接連線的節點時,它會把流量交給閘道節點(gateway node),由閘道再轉送到目的地。閘道通常也稱為路由器(router),也就是把流量從一處導向另一處的裝置。

以一個範例說明:用戶端 192.168.56.10 想送流量給伺服器 10.1.1.10,但兩者之間沒有直接連線。用戶端先把流量送給路由器 A,路由器 A 再送給與目標伺服器直接相連的路由器 B,最後由路由器 B 把流量交到伺服器手上。每一台閘道其實都不知道流量的最終落點,只知道自己直接相連的那幾個網路,因此它會查表決定「下一跳」要交給哪台閘道。

圖表 4-1:路由流量的範例

正因為節點不必知道所有其他節點的位置,這一層層轉送的機制才得以運作。而這也正是攻擊者的切入點:如果你能把自己的擷取裝置擺在「產生流量的系統」與「其最終目的地」之間、偽裝成必經的閘道,就能在那台系統上擷取流量。

使用 traceroute 追蹤路徑#

追蹤路徑(tracing a route)就是設法描繪出 IP 流量前往某個目的地時實際會走的路線。多數作業系統內建追蹤工具:類 Unix 平台多為 traceroute,Windows 則是 tracert

輸出中每一個編號列(1、2……)代表一台把流量往最終目的地轉送的閘道。所謂「跳數」(hop)指的是每兩台閘道之間的那一段網路:你的機器到第一台路由器是一跳,該路由器到下一台又是一跳,直到抵達終點。若超過最大跳數,追蹤程序就會停止探測——在 Windows 用 -h NUM、在類 Unix 系統用 -m NUM 指定上限。輸出同時會顯示從執行端到每個節點的來回時間(round-trip time)。

範例:對 Google 網域執行 tracert 的輸出
C:\Users\user>tracert www.google.com

Tracing route to www.google.com [173.194.34.176]
over a maximum of 30 hops:
  1      2 ms      2 ms      2 ms    home.local [192.168.1.254]
  2     15 ms     15 ms     15 ms    217.32.146.64
  3     88 ms     15 ms     15 ms    217.32.146.110
  4     16 ms     16 ms     15 ms    217.32.147.194
  5     26 ms     15 ms     15 ms    217.41.168.79
  6     16 ms     26 ms     16 ms    217.41.168.107
  7     26 ms     15 ms     15 ms    109.159.249.94
  8     18 ms     16 ms     15 ms    109.159.249.17
  9     17 ms     28 ms     16 ms    62.6.201.173
 10     17 ms     16 ms     16 ms    195.99.126.105
 11     17 ms     17 ms     16 ms    209.85.252.188
 12     17 ms     17 ms     17 ms    209.85.253.175
 13     27 ms     17 ms     17 ms    lhr14s22-in-f16.1e100.net [173.194.34.176]

路由表#

作業系統靠路由表(routing table)決定流量該交給哪台閘道。路由表是一份「目的網路 → 對應閘道」的清單。如果某網路與發送流量的節點直接相連,就不需要閘道,流量直接在本地網路上傳送即可。

  • 在多數類 Unix 系統用 netstat -r 檢視路由表。
  • 在 Windows 用 route print 檢視。

一個關鍵概念是預設閘道(default gateway)。當找不到負責與目的網路溝通的閘道時,路由表通常會把所有未知流量都交給預設閘道。在路由表中,預設閘道以目的地 0.0.0.0 這個佔位項表示。使用佔位項的好處是:即使網路組態改變(例如透過 DHCP 重新配置),路由表也不必跟著改;任何找不到相符路由的流量,都會被送往登記在 0.0.0.0 的那台閘道。

這個機制正好可以為你所用。面對一台作業系統與硬體綁成一體的嵌入式裝置,你可能無法碰它的網路組態、甚至連底層作業系統都摸不到;但只要能把自己的擷取裝置扮成它與目的地之間的閘道,就能攔到它的流量。

範例:Windows route print 的路由表輸出

0.0.0.0 那一列即預設閘道(此例指向 192.168.1.254)。

> route print

  IPv4 Route Table
  =============================================================================
  Active Routes:
  Network Destination           Netmask         Gateway      Interface Metric
              0.0.0.0           0.0.0.0 192.168.1.254 192.168.1.72           10
            127.0.0.0         255.0.0.0         On-link      127.0.0.1      306
            127.0.0.1 255.255.255.255           On-link      127.0.0.1      306
      127.255.255.255 255.255.255.255           On-link      127.0.0.1      306
          192.168.1.0     255.255.255.0         On-link 192.168.1.72        266
         192.168.1.72 255.255.255.255           On-link 192.168.1.72        266
        192.168.1.255 255.255.255.255           On-link 192.168.1.72        266
            224.0.0.0         240.0.0.0         On-link      127.0.0.1      306
            224.0.0.0         240.0.0.0         On-link 192.168.56.1        276
            224.0.0.0         240.0.0.0         On-link 192.168.1.72        266
      255.255.255.255 255.255.255.255           On-link      127.0.0.1      306
      255.255.255.255 255.255.255.255           On-link 192.168.56.1        276
       255.255.255.255 255.255.255.255           On-link 192.168.1.72        266
   =============================================================================

接下來幾節就示範如何把作業系統設定成閘道,以利流量擷取。