Kali Linux滲透測試——流量操控與隧道

筆記內容參考安全牛課堂苑房弘老師的Kali Linux滲透測試教程

一、流量重定向

重定向流量的IP和端口,不提供加密處理,明文傳輸,實現簡單,機密性差。原理如下圖所示,只要邊界防火牆開放至少一個端口,就有流量重定向的可能。

重定向原理

圖1 重定向原理

應用場景:

  • 重定向web流量,突破上網限制
  • 遠程桌面重定向
  • NC重定向獲得shell

Rinetd可以用來重定向TCP流量,在Transfer主機安裝,然後在/etc/rinetd.conf中進行配置:

# bindaddredd   bindport   connectaddress   connectport
  10.10.11.121  53         10.10.11.122     80

rineted命令啓動,這樣LAN中主機與Transfer的53端口交互的流量,都會被轉發到Server的80端口,在邊界防火牆看來,出入站的流量僅流經TCP 53端口,符合既定規則。

二、隧道&封裝

隧道技術 即使用多種加密技術在網絡節點之間建立安全管道,在不受信任的網絡環境中實現安全通信,本質是一種端口轉發技術。

分爲兩類隧道:

  • 點到點(IP2IP):建立在網絡層及以下,用於局域網之間的隧道通信,數據經過網絡邊界後變爲明文傳輸
  • 端到端(Port2Port):建立在傳輸層及以上,用於主機之間的隧道通信

可應用爲PPTP、L2TP、IPSec、SOCK4/5、SSL等VPN隧道,其中PPTP和L2TP工作在鏈路層,IPSec工作在網絡層,SOCK4/5工作在傳輸層,SSL工作在應用層,應根據不同的場景和需要選擇相應的VPN隧道,VPN隧道技術這裏不作介紹。

封裝技術 即使用一種協議封裝另一種協議(如:VoIP),利用網關設備拆包解析,實現不同類型網絡的互連互通。

隧道和封裝技術通常一起使用,下面介紹幾種常見隧道&封裝技術及實現方法:

(一)SSH隧道

SSH隧道提供端到端的加密,支持雙向通信,主要用於:

  • 將其他TCP端口的通信通過SSH連接進行轉發
  • 用SSH作爲傳輸層協議,對流量自動加密
  • 突破防火牆訪問規則限制,可用於番羽牆

注意:建立隧道(偵聽端口)和訪問端口(數據傳輸)是兩個獨立的過程。

1.本地端口轉發

LAN主機運行SSH客戶端並偵聽本機端口,通過建立SSH隧道,將經過隧道的流量轉發到遠程主機Server指定端口,基本原理如下圖所示:

本地端口轉發原理

圖2 本地端口轉發原理

實現方法:

首先修改Transfer主機SSH服務配置,在/etc/ssh/sshd_config中配置:

PermitRootLogin  yes   # 默認情況下不允許以root權限登錄
Port  53
PasswordAuthentication  yes

systemctl restart ssh.service重啓SSH服務,然後在LAN主機 (10.10.11.131) 配置SSH隧道:

ssh -fCNg -L <listen port>:<server ip>:<server port> user@<transfer ip> -p <transfer port>
# -f:後臺運行進程
# -C:壓縮通信流量,提高訪問速度
# -N:不執行登錄shell
# -g:複用訪問時作爲網關,支持其他主機訪問本地偵聽端口
# -L:監聽本機端口,SSH Client與監聽端口位於同一側

ssh -fCNg -L 7001:10.10.11.128:80 [email protected] -p 53
# 隨後LAN主機訪問10.10.11.131主機的7001端口實現SSH隧道訪問

2.遠程端口轉發

由於ACL、防火牆規則等原因,SSH與應用建立連接方向相反,此時需要SSH遠程端口轉發。此時,Transfer運行SSH客戶端並偵聽端口,通過建立SSH隧道,將LAN主機的訪問流量轉發到遠程主機Server指定端口 (之所以稱爲遠程端口轉發,是因爲SSH Client和偵聽端口不在隧道同一端),基本原理如下圖所示:

遠程端口轉發原理

圖3 遠程端口轉發原理

實現方法:

LAN主機上配置SSH服務,監聽53端口,方法同前,然後在Transfer (10.10.11.129) 配置SSH隧道:

ssh -fCN -R <lister port>:<server ip>:<server port> user@<lan ip> -p <lan port>
# -f:後臺運行進程
# -C:壓縮通信流量,提高訪問速度
# -N:不執行登錄shell
# -g:複用訪問時作爲網關,支持其他主機訪問本地偵聽端口
# -R:監聽遠程端口,SSH Client與監聽端口位於不同側

ssh -fCN -R 7002:10.10.11.128:80 [email protected] -p 53
# 隨後在10.10.11.131主機訪問本機7002端口實現SSH隧道訪問

注意:
① 端口轉發基於SSH隧道實現,在建立隧道時創建,不能爲已有隧道增加端口轉發
② 遠程端口轉發ssh命令-g參數失效,必須從偵聽端口的主機訪問
③ 通信過程中只有SSH隧道的流量是加密的,LAN主機訪問偵聽端口以及Transfer訪問Server過程是明文傳輸,若想進一步保證機密性,要使LAN中訪問Server與開放SSH偵聽端口爲同一臺主機,Transfer和Server爲同一臺主機

3.動態端口轉發

本地和遠程SSH端口轉發都是固定轉發IP和端口,每訪問一個新的IP:端口地址,就要新建一個SSH隧道,效率低,而且實際應用過程常常遇到以下情況:

  • 客戶端訪問應用繁多,可能對應不同服務器
  • 一些應用端口不固定
  • 部分網站不支持IP直接訪問

這時需要使用SSH動態端口轉發解決,相當於在端口偵聽的主機上開了sock4/5代理,可以訪問Transfer能夠訪問到的網絡範圍,如下圖所示:

動態端口轉發原理

圖4 動態端口轉發原理

實現方法:

Transfer主機配置SSH服務,方法同前,然後在LAN主機 (10.10.11.131) 配置SSH隧道:

ssh -CfNg -D 7010 [email protected] -p 53  
# 相當於在開啓SSH隧道的同時,在LAN主機本地偵聽sock4/5代理端口

在LAN主機設置sock代理爲10.10.11.131:7010,隨後LAN主機訪問10.10.11.131主機的7010端口實現SSH隧道訪問。

(二)DNS隧道

DNS協議工作在TCP/UDP 53端口,UDP端口用於DNS解析請求,TCP端口用於同一個域下DNS服務器數據同步,一般小型局域網都會使用公網DNS服務器作爲本地DNS服務器,所以如果防火牆限制嚴格,完全可以禁止TCP流量出站,此時基於TCP端口的隧道失效(如SSH隧道),需要搭建基於UDP的隧道。一般防火牆至少會開放UDP 53端口,可以利用DNS協議的工作原理實現UDP隧道,

DNS工作及隧道實現原理如下圖所示,本地主機(域名轉發服務器)到本地域名服務器之間爲遞歸查詢,本地域名服務器到權威域名服務器之間爲迭代查詢,圖中黃色箭頭代表指派關係,即本級域名服務器由上一級域名服務器指派

DNS隧道原理

圖5 DNS隧道原理

DNS隧道實現的前提是指派受自己控制的三級域名服務器 (利用域名服務商提供的域名服務器管理界面,管理所申請域名的主機記錄,同時也可以指派下一級子域的域名服務器)

1.Dns2tcp

(1)基本介紹

使用Dns2tcp實現DNS隧道連接:

  • C/S架構,客戶端運行dns2tcpc,服務器端運行dns2tcpd
  • 建立隧道的命令置於FQDN記錄的主機名部分,爲使命令大小限制儘可能大,通過查詢TXT記錄加密數據傳輸
  • 隧道建立後根據TTL時間重發隧道保持數據包
  • 基於此隧道可嵌套其他隧道技術
(2)使用方法

圖5中三級域名服務器作爲dns2tcp服務端,配置文件/etc/dns2tcpd.conf,然後運行服務:

# 配置/etc/dns2tcpd.conf
listen = 0.0.0.0      # 接受所有主機的訪問請求
port = 53             # 偵聽端口
user = nobody         # 使用nobody用戶運行服務
chroot = /tmp
key = password        # 隧道建立時需要驗證身份        
domain = a.lab.com    # 所要解析子域的域名,自身作爲該域的域名服務器
resource = ssh:127.0.0.1:22, socks:127.0.0.1:2048 # 隧道建立後提供的服務(資源)

dns2tcpd -F -d 1 -f /etc/dns2tcpd.conf
# 啓動服務端程序
# -F:前端運行
# -d:debug level 1-3,級別越高越詳細
# -f:指定配置文件

LAN主機作爲客戶端進行訪問:

dns2tcpc -c -k password -d 1 -l 2222 -r ssh -z a.lab.com
# -c:通信過程啓用壓縮算法
# -k:身份驗證密鑰信息
# -d:debug level
# -l:偵聽端口
# -r:指定訪問服務(資源)
# -z:要解析的域名(運行dnstcpd的域名服務器)

命令運行後,LAN主機開始偵聽本機2222端口,建立隧道的準備工作已完成,接下來在本機使用ssh [email protected] -p 2222連接2222端口,實現服務(資源)訪問,這些服務的協議在隧道傳輸時封裝在DNS協議中,到達dns2tcpd服務端後解包。

dns2tcpc只能偵聽本地的2222端口,LAN中其他主機對其無法實現訪問,要想實現網關功能,需要隧道嵌套DNS隧道一端已經偵聽在LAN本機2222端口,然後利用ssh命令在接入本機2222端口的基礎上,新建動態端口轉發隧道

ssh -CfNg -D 7070 [email protected] -p 2222 

2.Iodine

(1)基本介紹

Iodine與同類DNS隧道工具相比的優點:

  • 對下行數據不進行編碼,效率更高
  • 支持多平臺:Linux、BSD、Mac OS、Windows
  • 強制密碼支持,安全性更好
  • 最大16個併發連接(隧道)
  • 協商確定適合當前環境的DNS查詢類型
  • 自動運行隧道質量檢測工具,通信環境差時自動斷開連接

與Dns2tcp不同的是,Iodine建立的隧道具有如下特點:

  • C/S架構,客戶端運行iodine,服務器端運行iodined
  • 不基於資源的通用隧道,如同本網段內兩臺相鄰的主機通信
  • 客戶端和服務器端會生成隧道網絡接口dns0和接口IP地址
  • dns0接口IP地址應不同於客戶端和服務端的IP網段
(2)使用方法

首先在受控的三級域名服務器運行服務端:

iodined -f 192.168.1.1 a.lab.com
# -f:前端顯示
# 192.168.1.1爲服務器端隧道dns0接口IP地址

然後在LAN主機客戶端運行命令:

iodine -f a.lab.com 

隧道建立後需要藉助其他工具,進一步實現SOCK代理、HTTP代理等功能,如嵌套SSH隧道實現SOCK代理功能:在用Iodine建立DNS隧道、服務端配置SSH服務的基礎上,在LAN主機客戶端用ssh命令構建動態端口轉發隧道,實現隧道嵌套。

ssh -D 4321 -CfNg [email protected]

3.Ncat

被稱爲衆多NC衍生版軟件中最優的選擇,包含在Nmap工具包中,除了具備NC所有的功能外,還具有代理、隧道等功能。

代理功能:

ncat -l 8080 --proxy-type http --proxy-auth user:password
# 偵聽本地8080端口實現http代理功能
# 可以指定運行代理服務的用戶和密碼

Broker中介功能:
連接到Ncat broker模式的客戶端相當於連接到了一個HUB,其中任意一個客戶端發送的信息都會被其他客戶端接收。

可以應用在如下所示環境:A<->B不能訪問,但是A->C和B->C可以訪問,在C上運行ncat broker模式,A、B同時用ncat與之連接,這樣A向C發送的消息或命令就可繞過防火牆規則限制,轉發給B,如下圖所示。
Ncat broker模式應用場景

圖6 Ncat broker模式應用場景

使用方法:

ncat -l 3131 --broker
# 服務端開啓偵聽本地3131端口

ncat 10.10.11.128 3131
ncat 10.10.11.128 --sh-exec "echo `pwd`"
# 所有連接到ncat服務端的主機會共享發送的消息

(三)ICMP隧道

Ptunnle

(1)基本介紹

使用Ptunnle實現ICMP隧道連接:

  • 通過ICMP echo(ping requests)和reply(ping reply)實現隧道
  • 適用於只允許ping出站流量的環境
  • 支持併發連接(隧道)
  • 支持身份驗證
  • 需要root權限
  • 基於此隧道可嵌套其他隧道技術
(2)使用方法

服務端運行:

ptunnle -x password
# -x:設置隧道連接密碼

客戶端運行:

ptunnle -x password -p 10.10.11.128 -lp 2222 -da 10.10.11.129 -dp 22
# -p:ptunnle連接到的服務端IP
# -lp:在客戶端本機偵聽的端口
# -da:將流量轉發到的目標主機IP
# -dp:將流量轉發到的目標主機端口

Ptunnle客戶端與服務端(10.10.11.128)建立ICMP隧道,並在客戶端本機偵聽2222端口,這樣本機訪問2222端口的流量將被轉發到目標主機(10.10.11.129)的22端口,如在客戶端使用ssh [email protected] -p 2222即可登錄目標主機。

同時可嵌套SSH隧道實現網關轉發功能:在Ptunnle實現ICMP隧道、服務端配置SSH服務的基礎上,在客戶端用ssh命令構建動態端口轉發隧道,實現隧道嵌套。

ssh -CNfg -D 7009 [email protected] -p 2222

(四)HTTP/HTTPS代理隧道

Proxytunnle

(1)基本介紹

使用Proxytunnle實現HTTP/HTTPS隧道連接:

  • 通過標準的HTTP/HTTPS代理創建隧道
  • 通過HTTP CONNECT方法封裝信息
  • 適用於內網使用代理並且防火牆只允許代理服務器上網的場景,可以規避基於應用層過濾的規則

適用場景如下圖所示,LAN中只有代理服務器能夠上網,且防火牆僅允許HTTP/HTTPS流量出站,此時可以搭建HTTP/HTTPS代理隧道,隧道一端是內網代理,另一端是外網代理,外網代理將經由隧道的數據包進一步轉發給目標服務器。

HTTP/HTTPS代理隧道原理

圖7 HTTP/HTTPS代理隧道原理

(2)使用方法

環境準備:配置內網和外網代理,安裝squid並偵聽80端口,在/etc/squid/squid.conf中修改配置

apt install squid

# 在/etc/squid/squid.conf中修改配置
http_port 10.10.11.128:3128
http_access allow !Safe_ports
http_access allow all

squid    # 開啓代理服務,偵聽本地3128端口

在LAN中一臺主機運行Proxytunnle,搭建到本機代理的隧道並開啓偵聽端口:

proxytunnle -a 8800 -p 127.0.0.1:3128 -r 10.10.11.129:80 -d 10.10.11.128:22
# -a:本機偵聽端口
# -p:指定內網HTTP/HTTPS代理
# -r:指定遠程HTTP/HTTPS代理
# -d:指定遠程目標服務器

ssh [email protected] -p 8800
# 通過ssh連接隧道一端的偵聽端口,從而連接到遠程服務器(metasploitable:10.10.11.128)的sshd服務

(五)SSL/TLS隧道

Stunnel4

(1)基本介紹

使用Stunnel4實現SSL/TLS隧道連接:

  • 在無需修改原代碼的情況下將TCP流量封裝於SSL/TLS通道內
  • 適用於本身不支持加密傳輸的應用
  • 支持OpenSSL安全特性
  • 跨平臺,性能優

適用場景如下圖所示,防火牆僅允許SSL/TLS 443端口流量出站,此時可以搭建SSL/TLS隧道,隧道一端是Stunnel Client,另一端是Stunnel Server,通過訪問Client偵聽端口,進而訪問到隧道另一端設定的資源。

SSL/TLS隧道原理

圖8 SSL/TLS隧道原理

(2)使用方法

首先在Stunnel Server上準備SSL/TSL通信環境:

openssl req -new -days 365 -nodes -x509 -out /etc/stunnel/stunnel.pem -keyout /etc/stunnel/stunnel.pem
# 生成自簽證書
# -x509:簽名標準
# -nodes:不要加密生成的密鑰
# -keyout:將私鑰和證書一起存儲

然後配置Stunnel Server,新建/etc/stunnel/stunnel.conf,配置MySQL資源,在目標服務器配置相應服務:

# /etc/stunnel/stunnel.conf
cert = /etc/stunnel/stunnel.pem
setuid = 113                  # 設置運行服務賬號爲stunnel,113爲stunnle的uid
setgid = 120                  # 設置運行服務賬號爲stunnel,120爲stunnle的gid
pid = /var/run/stunnel4/stunnel4.pid

[mysql]                       # 定義訪問資源
accept = 0.0.0.0:443          # 偵聽443端口  
connect = 10.10.11.128:3306   # 連接目標服務器(10.10.11.128)的3306端口

stunnel4命令啓動服務,接下來配置Stunnel Client,同樣新建/etc/stunnel/stunnel.conf

client = yes

[mysql]                       # 定義與Server相同的訪問資源
accept = 3030                 # 本機偵聽端口
connect = 10.10.11.129:443    # 隧道另一端訪問的Server,要符合防火牆規則 

stunnel4命令啓動Stunnel Client,建立隧道,然後在本機用mysql -u root -h 127.0.0.1 -P 3030命令訪問本地偵聽端口,通過隧道訪問遠程目標服務器 (10.10.11.129) 的MySQL服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章