筆記內容參考安全牛課堂苑房弘老師的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工作及隧道實現原理如下圖所示,本地主機(域名轉發服務器)到本地域名服務器之間爲遞歸查詢,本地域名服務器到權威域名服務器之間爲迭代查詢,圖中黃色箭頭代表指派關係,即本級域名服務器由上一級域名服務器指派。
圖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,如下圖所示。
圖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代理隧道,隧道一端是內網代理,另一端是外網代理,外網代理將經由隧道的數據包進一步轉發給目標服務器。
圖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偵聽端口,進而訪問到隧道另一端設定的資源。
圖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服務。