13、利用 ICMP 隧道穿透防火牆

FLy_鵬程萬里發表於2018-06-09

以前穿透防火牆總是使用 SSH 隧道、DNS 隧道或 HTTP 隧道等等,今天來說一個利用 SNMP 隧道進行穿透工具–icmptunnel。

簡介

icmptunnel 可以將 IP 流量封裝進 IMCP 的 ping 資料包中,旨在利用 ping 穿透防火牆的檢測,因為通常防火牆是不會遮蔽 ping 資料包的。但是現在市面上已經有了很多類似的工具了,那麼 icmptunnel 又有哪些優勢呢?icmptunnel 提供在狀態機防火牆和 NAT 網路之間,更加可靠的連線。

編譯

首先從 Github 上面 clone 下程式碼:

git clone https://github.com/jamesbarlow/icmptunnel.git

隨後使用 make 命令進行編譯即可。

示例

注:這款工具只能在 Linux 下面使用。

首先我們需要在兩端裝置上面禁止 ICMP 響應。下面這條命令會阻止核心響應 ping 資料包:


隨後,在服務端以伺服器模式啟動 icmptunnel,並給隧道介面分配一個 IP 地址:

# ./icmptunnel –s
opened tunnel device: tun0 
(ctrl-z)
# bg
# /sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0

在客戶端,使用 icmptunnel 連線上伺服器,並給隧道介面分配一個 IP 地址:


現在,我們就擁有一個端到端基於 ICMP 資料包的隧道了。其中伺服器地址為 10.10.0.1,客戶端地址為 10.10.0.2。在客戶端可以嘗試通過 SSH 連線伺服器:

# ssh root@10.0.0.1
Password:
當然也可以把遠端伺服器當作一個加密的 SOCKS 代理:
# ssh -D 8080 -N root@10.0.0.1
Password:
至此,我們就可以在瀏覽器上使用本地 SOCKS 代理了。

工作機理

請求端的 Ping 工具通常會在 ICMP 資料包後面附加上一段隨機的資料作為 Payload,而響應端則會拷貝這段 Payload 到 ICMP 響應資料包中返還給請求端,用於識別和匹配 Ping 請求。

Windows 和 Linux 系統下的 Ping 工具預設的 Payload 長度為 64 位元,但實際上協議允許附加最大 64K 大小的 Payload。

對於隧道資料,icmptunnel 首先會指定客戶端和伺服器端。隨後,客戶端會將 IP 幀封裝在 ICMP 請求資料包中傳送給伺服器,而伺服器端則會使用相匹配的 ICMP 響應資料包進行回覆。這樣在旁人看來,網路中傳播的僅僅只是正常的 ICMP 資料包。

狀態防火牆和 NAT

那麼就出現了一個問題,隧道如何穿過狀態防火牆或 NAT?一些裝置會過濾沒有匹配響應資料包的 Ping 包。而在非對稱連線中,來自伺服器端的流量會大於客戶端,反之亦然,這樣客戶端可能會丟棄一些相應資料包,因為響應資料包多餘請求資料包。

icmptunnel 有一個機制來專門解決這個問題。客戶端會定期傳送一個空的 ICMP 請求資料包給狀態防火牆或 NAT,而這些請求資料包都會被記錄在防火牆狀態表中。同時通過保持傳送帶有載體的資料包,這樣客戶端會維持一個可以用於伺服器端傳送資料的“資料包視窗”。

檢測隧道

  • 檢測同一來源 ICMP 資料包的數量。一個正常的 ping 每秒最多隻會傳送兩個資料包。而使用 ICMP 隧道的瀏覽器在同一時間會產生上千個 ICMP 資料包。
  • 注意那些 ICMP 資料包中 payload 大於 64 位元的資料包。當然 icmptunnel 可以配置限制所有資料包的 payload 為 64 位元,這樣會使得更難以被檢測到。
  • 尋找那些響應資料包中 payload 跟請求資料包不一致的 ICMP 資料包。
  • 檢查 ICMP 資料包的協議標籤。例如,icmptunnel 會在所有的 ICMP payload 前面增加 ‘TUNL’ 標記以用於識別隧道,這就是特徵。

工具主頁

https://github.com/jamesbarlow/icmptunnel

相關文章