ICMP 隧道——將流量封裝進 IMCP 的 ping 數據包中,旨在利用 ping 穿透防火牆的檢測

利用 ICMP 隧道穿透防火牆

之前穿透防火牆老是使用 SSH 隧道、DNS 隧道或 HTTP 隧道等等,今天來講一個利用 SNMP 隧道進行穿透工具--icmptunnel。git

簡介

icmptunnel 能夠將 IP 流量封裝進 IMCP 的 ping 數據包中,旨在利用 ping 穿透防火牆的檢測,由於一般防火牆是不會屏蔽 ping 數據包的。可是如今市面上已經有了不少相似的工具了,那麼 icmptunnel 又有哪些優點呢?icmptunnel 提供在狀態機防火牆和 NAT 網絡之間,更加可靠的鏈接。github

編譯

首先從 Github 上面 clone 下代碼:瀏覽器

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

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

示例

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

首先咱們須要在兩端設備上面禁止 ICMP 響應。下面這條命令會阻止內核響應 ping 數據包:網絡

# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 

隨後,在服務端以服務器模式啓動 icmptunnel,並給隧道接口分配一個 IP 地址:ssh

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

在客戶端,使用 icmptunnel 鏈接上服務器,並給隧道接口分配一個 IP 地址:工具

# ./icmptunnel <server> opened tunnel device: tun0 connection established. (ctrl-z) # bg # /sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0 

如今,咱們就擁有一個端到端基於 ICMP 數據包的隧道了。其中服務器地址爲 10.10.0.1,客戶端地址爲 10.10.0.2。在客戶端能夠嘗試經過 SSH 鏈接服務器:post

# ssh root@10.0.0.1 Password: 

固然也能夠把遠程服務器看成一個加密的 SOCKS 代理:ui

# 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 流量的方法:

  • 檢測同一來源 ICMP 數據包的數量。一個正常的 ping 每秒最多隻會發送兩個數據包。而使用 ICMP 隧道的瀏覽器在同一時間會產生上千個 ICMP 數據包。
  • 注意那些 ICMP 數據包中 payload 大於 64 比特的數據包。固然 icmptunnel 能夠配置限制全部數據包的 payload 爲 64 比特,這樣會使得更難以被檢測到。
  • 尋找那些響應數據包中 payload 跟請求數據包不一致的 ICMP 數據包。
  • 檢查 ICMP 數據包的協議標籤。例如,icmptunnel 會在全部的 ICMP payload 前面增長 'TUNL' 標記以用於識別隧道,這就是特徵。

工具地址:https://github.com/jamesbarlow/icmptunnel

相關文章
相關標籤/搜索