常見內網穿透工具使用總結
文章作者: V0WKeep3r
原文鏈接:
http://v0w.top/2020/08/11/IntranetProxy/
0x00 前言
本文以滲透的視角,總結幾種個人常用的內網穿透,內網代理工具,介紹其簡單原理和使用方法。
0x01 nps-npc
1.1 簡介
nps 是一款輕量級、高性能、功能強大的內網穿透代理服務器。目前支持 tcp、udp 流量轉發,可支持任何 tcp、udp 上層協議(訪問內網網站、本地支付接口調試、ssh 訪問、遠程桌面,內網 dns 解析等等……),此外還支持內網 http 代理、內網 socks5 代理、p2p 等,並帶有功能強大的 web 管理端。
-
一臺有公網 IP 的服務器(VPS)運行服務端(NPS)
-
一個或多個運行在內網的服務器或者 PC 運行客戶端(NPC)
-
Go 語言編寫
-
支持跨平臺
-
支持多種協議的代理
-
web 管理端
1.3 使用方法
https://github.com/ehang-io/nps/releases
NPS
安裝配置
找到自己服務器相應版本的 server:
cd ~
wget https://github.com/cnlh/nps/releases/download/v0.23.2/linux_amd64_server.tar.gz
tar xzvf linux_amd64_server.tar.gz
cd ~/nps
在 nps 目錄下面會有一個 nps 可執行文件、conf 配置目錄和 web 網頁目錄,我們只需要修改conf/nps.conf
即可:
vim conf/nps.conf
需要改一下#web
下面的幾個參數,
web_host= 服務器IP或者域名
web_username= admin(登錄用戶名)
web_password= 你的密碼
web_port=8080(web管理端口)
修改#bridge
可以更改 NPC 的連接端口。比如我們拿到一臺權限受限的服務器,有防火牆,可能只有部分端口(80,443)可以出網,就需要修改成出網端口。
##bridge
bridge_type=tcp
bridge_port=443 # 修改連接端口
bridge_ip=0.0.0.0
啓動
#Mac/Linux
./nps test|start|stop|restart|status 測試配置文件|啓動|停止|重啓|狀態
#Windows
nps.exe test|start|stop|restart|status 測試配置文件|啓動|停止|重啓|狀態
NPC
./npc -server=你的IP:8024 -vkey=唯一驗證密碼 -type=tcp
新建好客戶端後,也可以在+
中看到,詳細的客戶端連接命令:
web 管理端
在客戶端界面可以通過新增
的方式添加客戶端連接,每一個連接的 vkey 都是唯一區分的。
每一個客戶端,在建立連接後,都可以建立多個不同協議的隧道,這一個個隧道就是不同的代理了。
通過不同的協議和端口就可以連接代理的內網機器。
0x02 frp
2.1 簡介
frp 是一個專注於內網穿透的高性能的反向代理應用,支持 TCP、UDP、HTTP、HTTPS 等多種協議。可以將內網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。
2.2 特點
-
客戶端服務端通信支持 TCP、KCP 以及 Websocket 等多種協議。
-
端口複用,多個服務通過同一個服務端端口暴露。
-
跨平臺,但是支持的比 nps 少一點
-
多種插件,提供很多功能
2.3 使用方法
下載:https://github.com/fatedier/frp/releases
以下內容摘自:https://segmentfault.com/a/1190000021876836
1. 通過 rdp 訪問家裏的機器
修改 frps.ini 文件,爲了安全起見,這裏最好配置一下身份驗證,服務端和客戶端的 common 配置中的 token
參數一致則身份驗證通過:
# frps.ini
[common]
bind_port = 7000
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
啓動 frps:
./frps -c ./frps.ini
修改 frpc.ini 文件,假設 frps 所在服務器的公網 IP 爲 x.x.x.x:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6000
啓動 frpc:
./frpc -c ./frpc.ini
通過 rdp 訪問遠程的機器,地址爲:
x.x.x.x:6000
開機自啓
針對 Windows 系統,爲了便於使用,可以配置一下開機的時候靜默啓動。
在 frpc.exe 的同級目錄創建一個 start_frpc.vbs:
'start_frpc.vbs
'請根據實際情況修改路徑
CreateObject("WScript.Shell").Run """D:\Program Files\frp_windows_amd64\frpc.exe""" & "-c" & """D:\Program Files\frp_windows_amd64\frpc.ini""",0
複製 start_frpc.vbs 文件,打開以下目錄,注意將
<USER_NAME>
改爲你的用戶名:
C:\Users\<USER_NAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
鼠標右擊,粘貼爲快捷方式即可。
- 通過 SSH 訪問公司內網機器
frps 的部署步驟同上。
啓動 frpc,配置如下:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
通過 SSH 訪問內網機器,假設用戶名爲 test:
ssh -oPort=6000 test@x.x.x.x
- 通過自定義域名訪問部署於內網的 Web 服務
有時想要讓其他人通過域名訪問或者測試我們在本地搭建的 Web 服務,但是由於本地機器沒有公網 IP,無法將域名解析到本地的機器,通過 frp 就可以實現這一功能,以下示例爲 http 服務,https 服務配置方法相同, vhost_http_port 替換爲 vhost_https_port, type 設置爲 https 即可。
修改 frps.ini 文件,設置 http 訪問端口爲 8080:
# frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
啓動 frps:
./frps -c ./frps.ini
修改 frpc.ini 文件,假設 frps 所在的服務器的 IP 爲 x.x.x.x,local_port 爲本地機器上 Web 服務對應的端口, 綁定自定義域名 www.yourdomain.com
:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
啓動 frpc:
./frpc -c ./frpc.ini
將 www.yourdomain.com
的域名 A 記錄解析到 IP x.x.x.x
,如果服務器已經有對應的域名,也可以將 CNAME 記錄解析到服務器原先的域名。
通過瀏覽器訪問 http://www.yourdomain.com:8080
即可訪問到處於內網機器上的 Web 服務。
- 對外提供簡單的文件訪問服務
通過 static_file
插件可以對外提供一個簡單的基於 HTTP 的文件訪問服務。
frps 的部署步驟同上。
啓動 frpc,啓用 static_file
插件,配置如下:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
# 用於身份驗證,請自行修改,要保證服務端與客戶端一致
token = abcdefgh
[test_static_file]
type = tcp
remote_port = 6000
plugin = static_file
# 要對外暴露的文件目錄
plugin_local_path = /tmp/file
# 訪問 url 中會被去除的前綴,保留的內容即爲要訪問的文件路徑
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc
通過瀏覽器訪問 http://x.x.x.x:6000/static/
來查看位於 /tmp/file
目錄下的文件,會要求輸入已設置好的用戶名和密碼。
2.4 常用功能
- 統計面板(Dashboard)
通過瀏覽器查看 frp 的狀態以及代理統計信息展示。
注:Dashboard 尚未針對大量的 proxy 數據展示做優化,如果出現 Dashboard 訪問較慢的情況,請不要啓用此功能。
需要在 frps.ini 中指定 dashboard 服務使用的端口,即可開啓此功能:
[common]
dashboard_port = 7500
# dashboard 用戶名密碼,默認都爲 admin
dashboard_user = admin
dashboard_pwd = admin
打開瀏覽器通過 http://[server_addr]:7500
訪問 dashboard 界面,用戶名密碼默認爲 admin
。
- 加密與壓縮
這兩個功能默認是不開啓的,需要在 frpc.ini 中通過配置來爲指定的代理啓用加密與壓縮的功能,壓縮算法使用 snappy:
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true
如果公司內網防火牆對外網訪問進行了流量識別與屏蔽,例如禁止了 SSH 協議等,通過設置 use_encryption = true
,將 frpc 與 frps 之間的通信內容加密傳輸,將會有效防止流量被攔截。
如果傳輸的報文長度較長,通過設置 use_compression = true
對傳輸內容進行壓縮,可以有效減小 frpc 與 frps 之間的網絡流量,加快流量轉發速度,但是會額外消耗一些 CPU 資源。
TLS
從 v0.25.0 版本開始 frpc 和 frps 之間支持通過 TLS 協議加密傳輸。通過在 frpc.ini
的 common
中配置 tls_enable = true
來啓用此功能,安全性更高。
爲了端口複用,frp 建立 TLS 連接的第一個字節爲 0x17。
注意:啓用此功能後除 xtcp 外,不需要再設置 use_encryption。
- 代理限速
目前支持在客戶端的代理配置中設置代理級別的限速,限制單個 proxy 可以佔用的帶寬。
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
bandwidth_limit = 1MB
在代理配置中增加 bandwidth_limit
字段啓用此功能,目前僅支持 MB
和 KB
單位。
- 範圍端口映射
在 frpc 的配置文件中可以指定映射多個端口,目前只支持 tcp 和 udp 的類型。
這一功能通過 range:
段落標記來實現,客戶端會解析這個標記中的配置,將其拆分成多個 proxy,每一個 proxy 以數字爲後綴命名。
例如要映射本地 6000-6005, 6007 這 6 個端口,主要配置如下:
# frpc.ini
[range:test_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 6000-6006,6007
remote_port = 6000-6006,6007
實際連接成功後會創建 8 個 proxy,命名爲 test_tcp_0, test_tcp_1 ... test_tcp_7
。
0x03 ew
3.1 簡介
EW 是一套便攜式的網絡穿透工具,具有 SOCKS v5 服務架設和端口轉發兩大核心功能,可在複雜網絡環境下完成網絡穿透。但是,現在工具已經不更新了。。。
3.2 特點
-
輕量級,C 語言編寫
-
可以設置多級代理
-
跨平臺
-
但是隻支持 Socks5 代理
3.3 使用方法
以下使用方法均摘自:http://rootkiter.com/EarthWorm/
以下所有樣例,如無特殊說明代理端口均爲 1080,服務均爲 SOCKSv5 代理服務.
該工具共有 6 種命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。
1. 正向 SOCKS v5 服務器
$ ./ew -s ssocksd -l 1080
2. 反彈 SOCKS v5 服務器
這個操作具體分兩步:
a) 先在一臺具有公網 ip 的主機 A 上運行以下命令:
$ ./ew -s rcsocks -l 1080 -e 8888
b) 在目標主機 B 上啓動 SOCKS v5 服務 並反彈到公網主機的 8888 端口
$ ./ew -s rssocks -d 1.1.1.1 -e 8888
成功。
3. 多級級聯
工具中自帶的三條端口轉發指令, 它們的參數格式分別爲:
$ ./ew -s lcx_listen -l 1080 -e 8888
$ ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999
$ ./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999
通過這些端口轉發指令可以將處於網絡深層的基於 TCP 的服務轉發至根前, 比如 SOCKS v5。首先提供兩個 “二級級聯” 本地 SOCKS 測試樣例:
a) lcx_tran
的用法
$ ./ew -s ssocksd -l 9999
$ ./ew -s lcx_tran -l 1080 -f 127.0.0.1 -g 9999
b) lcx_listen
、lcx_slave
的用法
$ ./ew -s lcx_listen -l 1080 -e 8888
$ ./ew -s ssocksd -l 9999
$ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999
再提供一個 “三級級聯” 的本地 SOCKS 測試用例以供參考
$ ./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
數據流向: SOCKS v5 -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks
0x04 ngrok
4.1 簡介
ngrok 是一個反向代理,通過在公共端點和本地運行的 Web 服務器之間建立一個安全的通道,實現內網主機的服務可以暴露給外網。ngrok 可捕獲和分析所有通道上的流量,便於後期分析和重放,所以 ngrok 可以很方便地協助服務端程序測試。
4.2 特點
-
官方維護,一般較爲穩定
-
跨平臺,閉源
-
有流量記錄和重發功能
4.3 使用方法
-
進入 ngrok 官網(https://ngrok.com/),註冊 ngrok 賬號並下載 ngrok;
-
根據官網給定的授權碼,運行如下授權命令;
-
./ngrok authtoken 1hAotxhmORtzCYvUc3BsxDBPh1H_******************
-
./ngrok http 80
即可將機器的 80 端口 http 服務暴露到公網,並且會提供一個公網域名。
可以通過官網的 UI 界面查看數據包和流量等等(但是要付費 ==、)
還可以通過一些命令將內網的文件和其他 TCP 服務 暴露到公網中。
有授權的設置文件共享
ngrok http -auth="user:password" file:///Users/alan/share
無授權的設置文件共享
ngrok http "file:///C:\Users\alan\Public Folder"
將主機的 3389 的 TCP 端口暴露到公網
ngrok tcp 3389
更多使用方法參考:https://ngrok.com/docs
0xFF 參考鏈接
內網滲透之內網穿透
-https://xz.aliyun.com/t/7701
開源內網穿透工具 frp 簡單使用教程
-https://segmentfault.com/a/1190000021876836
http://rootkiter.com/EarthWorm/
文章作者::V0WKeep3r
文章鏈接::http://v0w.top/2020/08/11/IntranetProxy/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/lPxpy-_oKd3FoZZJz2_RKg