天天看點

ICMP隧道檢測分析--icmptunnel簡介安裝使用分析特征檢測思路

簡介

icmptunnel的工作原理是将你的内容封裝在ICMP echo資料包中,一般在ICMP資料包的 "data "字段中發送,并将其發送到你自己的代理伺服器。代理伺服器解壓縮資料包并轉發。傳入的以客戶為目的地的IP資料包再次被封裝在ICMP回複資料包中,并發回給客戶。

icmptunnel通過建立一個虛拟的隧道接口來工作。用戶端主機上的所有使用者流量被路由到icmptunnel在這個接口上監聽IP資料包。這些資料包被封裝在一個ICMP echo資料包中(即ICMP資料包的payload隻是原始IP資料包)。這個新産生的ICMP資料包被發送到客戶機外,通過受限的網際網路連接配接發送到代理伺服器。

代理伺服器收到這些ICMP資料包并解壓縮原始IP資料包。再進行IP僞裝後被重新傳送到網際網路上。是以,目标相信是代理伺服器發出的請求。然後,目标用一個IP資料包回應代理伺服器。這又被icmptunnel捕獲,封裝在一個ICMP回複包中,并發回給用戶端。

在用戶端,IP資料包被從ICMP回複資料包的payload中解析和注入。使用者應用程式從這個虛拟接口讀取,進而獲得适當的IP資料包。

+--------------+                         +------------+
|              |       ICMP traffic      |            |       IP traffic
|    Client    |  ------------------->   |   Proxy    |   ------------------>
|              |  <-------------------   |   Server   |   <------------------
|              |    through restricted   |            |     proper internet
+--------------+         internet        +------------+
           

github倉庫:https://github.com/DhavalKapil/icmptunnel

安裝使用

  • 編譯
git clone https://github.com/DhavalKapil/icmptunnel
cd icmptunnel/
make
           
  • 在伺服器端以root權限運作的隧道:
icmptunnel -s 10.0.1.1
           
  • 在用戶端執行

    route -n

    ,找到你的網關和相應資訊:
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.100.2    0.0.0.0         UG    0      0        0 ens33
           
  • 編輯client.sh
  • 用代理伺服器的IP替換
  • 用上面的Gateway位址替換
  • 用上面的Iface替換
  • 在用戶端,以root權限運作:
icmptunnel -c <server>
           

現在隧道應該成功運作,用戶端應該能夠通路網際網路。所有流量都将通過 ICMP 隧道進行傳輸。

分析特征

ICMP TTL的設定一般情況下與主機的作業系統相關,當然也可以手動去修改。

作業系統 TTL
UNIX 255
Linux 64
MS Windows 95/98/NT 3.51 32
MS Windows NT 4.0/2000/XP/2003 Server 128
FreeBSD 2.1R 64
VMS/Multinet 64
Windows XP 128

在源代碼icmp.c中233行可以看到TTL被固定為255,從流量中也可以看到TTL為255。

void prepare_headers(struct iphdr *ip, struct icmphdr *icmp)
{
  ip->version = 4;
  ip->ihl = 5;
  ip->tos = 0;
  ip->id = rand();
  ip->frag_off = 0;
  ip->ttl = 255;
  ip->protocol = IPPROTO_ICMP;

  icmp->code = 0;
  icmp->un.echo.sequence = rand();
  icmp->un.echo.id = rand();
  icmp->checksum = 0;   
}
           

檢測思路

  • 檢測同一來源 ICMP 資料包的數量。一個正常的 ping 每秒最多隻會發送兩個資料包。而使用 ICMP 隧道的浏覽器在同一時間會産生上千個 ICMP 資料包。
  • 尋找那些響應資料包中 payload 跟請求資料包不一緻的 ICMP 資料包。
  • 如果在内網中,可以檢查 ICMP 資料包的協定TTL值,icmptunnel 預設會設定所有的 ICMP 的IP層TTL值為255。内網拓撲容易确定具體的跳數,簡單計算可以印證。

繼續閱讀