ICMP隱蔽隧道從入門到精通

概述

衆所周知傳統socket隧道已極少,tcp、upd大量被防禦系統攔截,dns、icmp、http/https等難於禁止的協議(當然還有各種xx over dns/icmp/http,後續再講)已成爲黑客控制隧道的主流。
本文從技術原理、實現方式、檢測防禦等多個維度解釋隱蔽性最強的icmp隧道的相關知識,但不深入探討編程實現,僅作爲一篇科普文章,所以用了“從入門到精通”這個標題,本來就是科普(〃’▽’〃),請大神繞過!謝謝!!

 

起源

說起icmp其實要從最早的免費上網說起。
當年互聯網剛剛興起的時候,上網費是很貴的,難說一不小心上個網就能我們窮學生傾家蕩產!後來聰明的同學開始研究技術,雖然我們的網絡斷了(不是撥號那種 無法獲得ip的,需要有ip),但是ping ip還是可以的,於是就利用icmp隧道將訪問轉發到自己的一臺放置在公網代理,利用代理中轉訪問公網,實現免費上網,雖然速率不高,但是免費嘛。

瞭解了起源,知道他的由來了,我們就好奇了,這技術是怎麼回事?最後爲啥又成了黑客用的隱蔽隧道呢,其實正所謂技術本無罪,只是看被什麼人用罷了。我們主要關注技術原理即可。

 

技術原理

怎麼可以實現這種神奇的通信呢,這就要從協議這個東西的基本原理說起,打開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,共32bytes
linux 系統,稍顯複雜,默認Data傳輸的是48bytes,在Date之前多了一個Timestamp from icmp data頭,佔用8bytes,如e5 0d 44 5b 00 00 00 00(Jul 10, 2018 09:37:41.000000000 CST),詳情如下:
1、%%%%,4個%在0~f間變化,發送和返回相同,不同發送返回不同(筆者未深入研究規律和代表內容),佔用2個bytes
2、090000000000,前兩位%%在變動,同一次ping操作,無論發送接收多少包,此數值不變,下一次ping則此值會變動(筆者未深入研究規律和代表內容),佔用6bytes
3、101112131415161718191a1b1c1d1e1f20(規律是從10開始的16進制遞增,一直到20),佔用17bytes
4、!”#$%&’()+,-./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隧道工具。

 

工具實現

這裏我們不用虛擬機演示,避免只是演示不能實踐的窘境!
筆者一開始接觸icmp shell時,參考各種用虛擬機演示的文章,發現用虛擬機ok但是真實環境不行,所以踩坑後爲了讓大家不踩,我們採用真實的公網vps+內網終端演示,環境:
1、vps爲linux,內網終端爲windows;
2、vps無法ping通內網終端的內網ip;
3、內網終端可以ping通公網獨立ip的vps.
好,說明完,我們看看怎麼實現:

icmp.sh

先說這個,是因爲這個包括一個通用的icmp server端(前面說過,這個是必須的),可以被其他方式的被控端複用,下載在github找即可,操作如下

server端

正如前面說的,我們的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配置。

agent端

按照github上這個工具作者的文章,如下:

這個ip就是公網的vps的ip了。這樣在server端就可以獲取到shell了

數據包分析,課件windows替換了data,大小增大到113

powershell icmp

server端

同上

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?繼續研究!

審覈人:yiwang   編輯:邊邊

發佈了26 篇原創文章 · 獲贊 175 · 訪問量 189萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章