公眾號:白帽子左一
領取配套練手靶場、安全全套課程及工具...
一、簡介
學習內網安全的時候,總會見到一些隧道的概念。搭建隧道對于內網滲透來說是一個必不可少的環節。簡單理解,隧道的概念即是做端口轉發,將流量通過某種方式,轉發到內部機器。
二、搭建隧道的場景分析
在內網滲透的過程中,當獲取到邊界主機之后,需要繼續深入滲透,這時就需要搭建代理或者建立隧道,去探測訪問處于內網中的機器。
常見的方法有:搭建socks5代理、端口轉發、建立隧道等
三、常見隧道工具及其使用方法
1、frp內網穿透工具
frp即高性能反向代理應用,其主要用于將部分內網服務"暴露"到公網上供用戶使用(例如http等)。官方給出的功能列表如下:
利用處于防火墻后的機器,對外網環境提供 http 或 https 服務。
對于 http, https 服務支持基于域名的虛擬主機,支持自定義域名綁定,使多個域名可以共用一個80端口。
利用處于防火墻后的機器,對外網環境提供 tcp 和 udp 服務,例如在家里通過 ssh 訪問處于公司局部環境的主機。
這里稍微談論一下反向代理和正向代理:
(1)正向代理
即當客戶端由于某種原因,不能訪問外部服務的時候(例如防火墻的限制),就需要一臺代理服務器來中轉一下(例如使用socks5代理服務器)。比較常見的方式就是使用VPN(俗稱翻墻)。
在內網滲透的過程中,當我們獲取到一臺邊界服務器之后,需要繼續向內進行滲透時,可以將該邊界服務器作為代理服務器,通過該服務器去訪問內網服務。(即正向代理)
(2)反向代理
反向代理一般用于負載均衡。即當我們想要訪問Web服務時,會發送一條請求給反向代理服務器,該代理服務器會將請求轉發給處于內網的Web服務器(根據負載程度,轉發到不同服務器),從而實現負載均衡。
反向代理對于客戶端來說(即發送請求的一端)是透明,我們不知道代理服務器將請求發送給哪臺主機。
(3)正向代理與反向代理的區別
正向代理對于服務器來說是透明的,因為它不知道訪問它的客戶是誰,所有的請求都是通過正向代理服務器轉發過去的。
而反向代理對于客戶端來說是透明的,即它不知道請求的目標主機的真正IP,因為它將所有的請求都只是發送到反向代理服務器上面。
適用場景:
(1)由于防火墻的限制,部分端口不能直接訪問,可以將端口轉發出去從而繞過防火墻(前提是獲取了該目標主機的shell)
(2)利用frp可以搭建socks5服務
采用實驗的方式進行理解:
實驗拓撲結構:
V-PS:
192.168.226.130
OWASP WEB:
外:192.168.226.133
內:192.168.100.100
Ubuntu Server:
192.168.100.101
目的:將內網機器Ubuntu Server流量通過OWASP Web服務器轉發出來
實驗一:將內網機器的22號端口映射到邊界服務器的6000端口
# frp相關配置如下
# frp服務端(邊界服務器) frps.ini
[common]
bind_addr = 0.0.0.0
bind_port = 7000
# frp客戶端(內網機器) frpc.ini
[common]
server_addr = 192.168.100.100
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
# 啟動服務
# 服務端 ./frps -c frps.ini
# 客戶端 ./frpc -c frpc.ini

接下來在V-PS直接連接邊界主機的6000端口即可連接到內網的22端口

實驗二:使用frp實現socks5代理
# frp相關配置如下
# frp服務端(邊界服務器) frps.ini
[common]
bind_addr = 0.0.0.0
bind_port = 7000
# frp客戶端(內網機器) frpc.ini
[common]
server_addr = 192.168.100.100
server_port = 7000
[socks5]
type = tcp
remote_port = 6001
plugin = socks5
# 啟動完成以后,在V-P-S配置一下/etc/proxychains.conf
[ProxyList]
socks5 192.168.226.133 6001
接下來通過socks5代理的方式去訪問內網機器的22號端口:
2、SSH
SSH即Secure Shell,它對傳輸的數據進行了加密處理。利用SSH,也可以實現端口轉發
SSH一般用于本地端口轉發和遠程端口轉發
(1)本地端口轉發
顧名思義,就是將本機的某個端口轉發出去。
考慮以下這種情況:
V-P-S要連接內網機器,就必須得通過中間那臺服務器。如果我們知道中間那臺服務器的賬號和密碼,就可將中間服務器當作跳板,去訪問內網機器,具體做法如下:
# 在V-P-S上執行如下命令:
ssh -g -L 9999:192.168.100.101:22 -fN [email protected]
# 參數介紹:
-L 表示做本地端口映射,9999表示本地端口,192.168.100.101:22表示目標映射的地址與端口
-f 表示SSH客戶端在后臺運行
-N 參數表示該連接不做任何操作,僅用于端口轉發
-g 表示允許外來主機連接該V-P-S的9999端口(例如用netstat查看時監聽的是0.0.0.0:9999)
# 上述命令理解為通過192.168.100.100,將本地9999端口映射到內網主機192.168.100.101的22端口
# 驗證映射成功
ssh [email protected] -p 9999
(2)遠程端口轉發
遠程端口轉發即將一臺遠程主機的端口轉發到另外一臺主機的某個端口
與本地端口轉發不同,它需要在中間服務器上執行(也就是上面的跳板),一般用于內網流量可以出去,但是外網流量由于防火墻限制不能進的情況。
考慮以下這種情況:
在中間服務器執行ssh的遠程端口轉發,打開V-P-S的某個端口,與內網機器(中間服務器能訪問的機器)的某個端口做一個映射。(與本地端口轉發類似,這里只不過是打開遠程主機的某個端口)
常規操作:
# 將遠程主機的9999端口映射到內網機器的80端口
# -R參數表示進行遠程端口轉發
ssh -R 9999:192.168.100.101:80 -fN [email protected]
做個實驗:模擬中間服務器不允許V-P-S訪問其80端口,通過在中間服務器做一個遠程端口轉發,繞過防火墻
# iptables模擬防火墻,不允許V-P-S訪問中間服務器的80端口(設置INPUT鏈規則)
iptables -A INPUT -p tcp -s 192.168.226.130 --dport 80 -j DROP
# 在V-P-S訪問192.168.226.133的80端口發現訪問不了
curl 192.168.226.113
# 在中間服務器上做一個遠程端口轉發(注意:這里的映射主機就是中間服務器)
ssh -R 9999:192.168.226.133:80 -fN [email protected]
# 在V-P-S訪問本機的9999端口,發現可以訪問
curl 127.0.0.1:9999
3、EarthWorm
EarthWorm也是一個內網穿透的神器,可以利用端口轉發做socks5代理實現內網的穿透
主要有三個參數:
# rcsocks客戶端,監聽端口以及轉發端口
# rsscoks服務端,指定連接的主機以及端口
# ssocksd,做正向代理
以上述實驗拓撲為例,EarthWorm可以做正向代理和反向代理
(1)正向代理示例
# 在中間服務器做一個正向代理,V-P-S通過該代理去訪問內網機器
# 利用EarthWorm在中間服務器上做一個代理服務
./ew_for_linux32 -s ssocksd -l 8888
# 此時該主機會監聽8888端口,相當于一臺socks5代理服務器
# V-P-S配置一下socks5代理即可訪問內網機器
# 修改/etc/proxychains.conf
socks5 192.168.226.133 8888
# 訪問內網機器的80端口
proxychains curl 192.168.100.101
(這里正向代理的含義是中間服務主動打開了一個端口等待我們的V-P-S連接,也就是主動去連接)
(2)反向代理示例
# 讓中間服務器主動與我們的V-P-S建立一個連接,以便傳輸數據(用于外部流量不能進,而內部流量可以出的情況)
# 在V-P-S上配置監聽端口(8888端口用于連接傳輸數據,10002端口表示將本機的10002端口轉發到8888端口)
./ew_for_Linux64 -s rcsocks -l 10002 -e 8888
# 配置一下V-P-S上的socks5代理
socks5 127.0.0.1 10002
# 在中間服務器配置主動連接
./ew_for_Linux32 -s rssocks -d 192.168.226.130 -e 8888

# 接下來嘗試訪問內網機器
proxychains curl 192.168.100.101
4、netsh
netsh即network shell,是windows系統提供的一款強大的網絡配置命令行工具。它擁有比較強大的端口轉發功能,能夠進行本地端口轉發和遠程端口轉發。netsh也可以用于配置防火墻
(1)netsh實現端口轉發
# 使用方式介紹
netsh interface portproxy add v4tov4 listenaddress=監聽主機 listenport=本機需要映射(轉發)的端口 connectaddress=遠程主機(也可以是本機) connectport=遠程(本地)映射端口

由于是做端口轉發,因此考慮的場景是從外(邊界)向里(內網),利用此工具進行端口轉發,從而訪問內網。
例如:假設邊界主機是一臺windows,并且我們已經獲取了相應的權限。接下來要做的事情是向內網繼續進行滲透。
實驗拓撲:
# V-PS主機:192.168.226.113
# 邊界windows主機:192.168.226.133/192.168.100.100(雙網卡)
# 內網服務器:192.168.100.101
由于V-PS無法直接訪問內網的服務,因此在邊界windows主機上做一個端口轉發,將流量轉發到內網主機的某個端口上。(以訪問內網80端口為例)
# 以下操作實在windows邊界主機上進行的
# 監聽所有主機訪問本機8080端口,將流量轉發到內網的80端口
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8080 connectaddress=192.168.100.101 connectport=80
# 接下來,當我們訪問該主機的8080端口時,相當于訪問了內網的Web服務器
# 查看我們建立的轉發規則
netsh interface portproxy show v4tov4
# 刪除我們建立轉發規則
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=8080
考慮到另外一種場景:由于防火墻的限制,該windows主機只開放了幾個端口,而你又想訪問其他端口(例如3389)
此時可以做一個本地端口轉發,將3389端口的流量映射到其他開放的端口上
# 實現命令(假設12345端口對外開放)
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=12345 connectaddress=127.0.0.1 connectport=3389
# 當外部主機訪問該主機的12345時,相當于訪問本機的3389端口
(2)netsh配置防火墻
netsh配置防火墻有兩個參數firewall和advfirewall(firewall是簡單模式、advfirewall是高級模式)
例如:
# 開放3389端口
netsh advfirewall firewall add rule name="openRDP" dir=in protocol=tcp localport=3389 action=allow
(name表示給該規則命名,dir表示流量方向)

去查看防火墻規則,也可以看見此規則添加成功。

# 刪除上述規則
netsh advfirewall firewall delete rule name="openRDP" protocol=tcp localport=3389
5、Neo-reGeorg
Neo-reGeory是一款建立HTTP隧道的工具,適用于目標服務器只開放了80端口,通過80端口去探測內網服務器。(利用文件上傳漏洞即可)
最常見的使用應該還是搭建一個socks代理
(嘗試了一下reGeory,搭代理后去訪問內網的80端口,結果是408。但是使用Neo-reGeorg可以直接訪問,也許是環境的問題)
# 簡單搭建socks代理實現
# 創建隧道文件
Python neoreg.py generate -k password
# 通過一定的方式將相應腳本文件傳到目標服務器
# 本次實驗采用的是dvwa,上傳php腳本文件tunnel.php
執行:
python neoreg.py -k password -u http://192.168.226.133/dvwa/hackable/uploads/tunnel.php -p 1080
(將本地1080端口的流量轉發到目標服務器)
# 配置socks5代理/etc/proxychains.conf或者瀏覽器配置socks5
socks5 127.0.0.1 1080
# 訪問內網的80服務
proxychains curl 192.168.100.101
6、Lcx
lcx也是一款強大的內網端口轉發工具,現已經有了跨平臺的工具,在Linux和Windows下都可以使用
由于是做端口轉發,因此考慮一下幾種場景:
實現一:22端口不出網做本地端口轉發連接ssh
# 由于防火墻限制,現在中間服務器的22號端口禁止對外開放
# 配置iptables(由于環境原因,將V-PS作為靶機,中間主機作為攻擊機),在V-PS上配置防火墻
iptables -A OUTPUT -p tcp -d 192.168.226.133 --sport 22 -j DROP
# 將從22號端口出去的流向192.168.226.133主機的流量丟棄掉
# 直接去訪問V-PS的22號端口連接不了
ssh [email protected]
# 利用lcx實現本地端口轉發,將22號流量轉發到其他允許出網的端口上面(V-PS上執行)
# 表示將10003端口的流量都轉發給22號端口
./portmap -m 1 -p1 10003 -h2 127.0.0.1 -p2 22
# 再次連接即可成功
ssh [email protected] -p 10003
實驗二:一層主機做端口轉發訪問二層內網主機
# 場景分析:需要使用V-PS去訪問內網的80端口
# 在中間服務器(一層主機)上做端口轉發
./a.out -m 1 -p1 10004 -h2 192.168.100.101 -p2 80
# 表示將本機的10004端口的流量轉發給內網主機80端口
# V-PS訪問一層主機的10004端口即可實現訪問內網主機的80端口
curl 192.168.226.133:10004
四、總結
本地端口轉發用于某個端口由于防火墻的限制,不能出網,例如常見的22,3389端口。如果此時,我們通過一些手段拿到了目標服務器的shell(例如通過Web服務上傳了一個Webshell),我們可以利用本地端口轉發的技術,將某個對外開放的端口(例如10000)將其流量轉發給22號端口。這樣,通過訪問目標主機的10000端口,即可實現連接22號端口進行遠程訪問。
遠程端口轉發感覺多用于通過某個跳板去訪問內部主機。例如如下拓撲結構:

在SSH服務器上做一個遠程端口轉發,將A的某個端口映射到B的某個端口上,這樣V-PS可以直接訪問A的某個端口實現對B的訪問。
原文地址:http://33h.co/90vr1