簡介
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。内網拓撲容易确定具體的跳數,簡單計算可以印證。