ICMP隱蔽隧道從入門到精通
概述
衆所周知傳統socket隧道已極少,tcp、upd大量被防護系統攔截,dns、icmp、http/https等難於禁止的協議(固然還有各類xx over dns/icmp/http,後續再講)已成爲黑客控制隧道的主流。
本文從技術原理、實現方式、檢測防護等多個維度解釋隱蔽性最強的icmp隧道的相關知識,但不深刻探討編程實現,僅做爲一篇科普文章,因此用了「從入門到精通」這個標題,原本就是科普(〃’▽’〃),請大神繞過!謝謝!!php
起源
提及icmp其實要從最先的免費上網提及。
當年互聯網剛剛興起的時候,上網費是很貴的,難說一不當心上個網就能咱們窮學生傾家蕩產!後來聰明的同窗開始研究技術,雖然咱們的網絡斷了(不是撥號那種 沒法得到ip的,須要有ip),可是ping ip仍是能夠的,因而就利用icmp隧道將訪問轉發到本身的一臺放置在公網代理,利用代理中轉訪問公網,實現免費上網,雖然速率不高,可是免費嘛。
瞭解了起源,知道他的由來了,咱們就好奇了,這技術是怎麼回事?最後爲啥又成了黑客用的隱蔽隧道呢,其實正所謂技術本無罪,只是看被什麼人用罷了。咱們主要關注技術原理便可。html
技術原理
怎麼能夠實現這種神奇的通訊呢,這就要從協議這個東西的基本原理提及,打開rfc(https://www.rfc-editor.org/search/rfc_search_detail.php)查詢ping使用的icmp協議查看詳情RFC792
https://www.rfc-editor.org/info/rfc792
https://www.rfc-editor.org/rfc/rfc792.txt
你會發現icmp協議的結構以下:
其中0~31是各類協議頭部,那剩下的呢?固然就是data了!本來默認ping傳輸的是:
windows系統,默認傳輸32bytes,內容是abcdefghijklmnopqrstuvwabcdefghi,共32byteslinux 系統,稍顯複雜,默認Data傳輸的是48bytes,在Date以前多了一個Timestamp from icmp data頭,佔用8bytes,如e5 0d 44 5b 00 00 00 00(Jul 10, 2018 09:37:41.000000000 CST),詳情以下:
一、%%%%,4個%在0~f間變化,發送和返回相同,不一樣發送返回不一樣(筆者未深刻研究規律和表明內容),佔用2個bytes
二、090000000000,前兩位%%在變更,同一次ping操做,不管發送接收多少包,此數值不變,下一次ping則此值會變更(筆者未深刻研究規律和表明內容),佔用6bytes
三、101112131415161718191a1b1c1d1e1f20(規律是從10開始的16進制遞增,一直到20),佔用17bytes
四、!」#$%&’()+,-./01234567,佔用23bytes通過簡單的分析確認,windows固定傳輸的是abcdefghijklmnopqrstuvwabcdefghi,linux固定傳輸的是!」#$%&’()+,-./01234567,那咱們可否改變這些data填充咱們本身的數據呢? 答案是固然是能夠!
這就是icmp隱蔽隧道的原理:替換Data部分。windows簡單,替換後解決checksum便可,linux稍複雜,替換後要還要知足原有的其餘規律(筆者主要領域是windows,有興趣的讀者能夠研究下),防止鏈路上的設備對錯誤包進行拋棄處理。
此外,還有一點須要補充,ping的包大小,也就是data大小是能夠修改的,如修改成1024bytes,以windows爲例:則,從包體看效果以下,可見規律仍是同樣,重複罷了。
最後,還有一個關鍵問題!
你發送了修改了data的數據,對方的系統可否正常處理你的畸形ping數據呢?還有對方回包的畸形ping應答數據,你自身可否處理呢?很明顯,標準的 windows系統和linux系統是沒法處理畸形data的數據的,因此咱們還需本身的ping發送和應答程序替代系統的自己的ping。那麼接下來, 咱們就來看看各類畸形ping處理工具,也便是icmp隧道工具。python
工具實現
這裏咱們不用虛擬機演示,避免只是演示不能實踐的窘境!
筆者一開始接觸icmp shell時,參考各類用虛擬機演示的文章,發現用虛擬機ok可是真實環境不行,因此踩坑後爲了讓你們不踩,咱們採用真實的公網vps+內網終端演示,環境:
一、vps爲linux,內網終端爲windows;
二、vps沒法ping通內網終端的內網ip;
三、內網終端能夠ping通公網獨立ip的vps.
好,說明完,咱們看看怎麼實現:linux
icmp.sh
先說這個,是由於這個包括一個通用的icmp server端(前面說過,這個是必須的),能夠被其餘方式的被控端複用,下載在github找便可,操做以下git
正如前面說的,咱們的server端要替代系統自己的ping的應答程序,要不shell不穩定(現象是一直提刷屏,沒法交互輸入),先關閉系統的ping應答,方法以下(恢復系統應答則=0):
而後就能夠啓動咱們本身的icmp應答程序了
第一個ip爲vps的ip,是獨立的公網ip,建議用***便可
第二個ip是agent的公網ip,但這個所謂的公網ip有玄機,嚴格說這個ip應該是server端看到的ip,爲了獲得這個ip能夠從內網終端ping這個vps,在vps用tcpdump icmp獲取這個ip,而後填寫。以下:
若是您要用這個server做爲您本身的木馬組件則要自動斷定,建議anget木馬程序彈shell以前,先ping一下server(調整獨特ping大小,次數等,防止server誤判),server根據ping自動啓動server配置。shell
按照github上這個工具做者的文章,以下:
這個ip就是公網的vps的ip了。這樣在server端就能夠獲取到shell了
數據包分析,課件windows替換了data,大小增大到113編程
powershell icmp
同上
agent端
ip仍是sever的ip,我們的vps的ip,獲取shell,沒有亂碼,因此筆者仍是喜歡powershell這個神器!
meterpreter
雖然寫了這個,是由於筆者認爲它應該有icmp的反彈shell,可是居然沒找到,也許是尋找方法不對,有知道的同窗麻煩留言,感謝!
icmptunnel、ptunnel等
主要用做xx over icmp使用,相對複雜,可是可讓傳統的tcp、udp木馬再次有用武之地,後續探討。
固然除了以上還有不少其餘工具,如linux下的PRISM(也支持mac、安卓)等等,還有不少人本身的寫的python實現,能夠說是現有工具已經遍地開花,那就更別說專業黑客在本身的代碼中直接實現的了,因此對抗icmp隧道迫在眉睫!
檢測和防護
明白了原理,也模擬了工具的使用,那麼防護和檢測就簡單,只須要禁止ping就能夠徹底屏蔽此類隱蔽隧道風險,但若是要考慮用戶體驗,那就只有解析 包體了,而後作否認斷定,也就是說只要ping的data不是標準的windows、linux的data包體(標準大包爲合法)內容,則斷定非法,報警 攔截便可。
不過筆者沒研究除了windows、linux之外系統ping的實現,如macos、安卓各個版本、各個網絡設備等,建議安全防護者先解析包體,而後分析合法data,造成白data清單,最終再作「否」斷定。
最後的思考
咱們這裏只探討最多見的ping(ICMP類型爲0和8),那icmp的其餘類型是否能夠外傳、交互shell?繼續研究!