前言
之前寫了一篇搭建http隧道的文章,用來總結在不出網的情況下如何內網滲透。所以這里就再總結一下在出網的情況下用來內網穿透的好用工具。
frp
frp 簡介
frp 使用go語言開發,是一款高性能的反向代理應用,可以輕松地進行內網穿透,對外網提供服務。frp支持 TCP、UDP、KCP、HTTP、HTTPS等協議類型。
frp 下載
https://github.com/fatedier/frp/releases?after=v0.31.0 下載amd文件,測試使用0.28.2版本
frp 配置文件
下載好后,先看一下frp的相關文件
服務段frps.ini
[common]
# 通用設置
bind_addr = 0.0.0.0
bind_port = 7000
# frp 監聽地址
bind_udp_port = 7001
# 配置udp端口
kcp_bind_port = 7000
# 用于kcp協議的udp端口,如果未設置,則在frps中禁用kcp
proxy_bind_addr = 127.0.0.1
# 代理服務器綁定地址
vhost_http_port = 80
vhost_https_port = 443
# 配置http與https端口
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
# 配置dashboard以查看儀表盤與登陸信息
enable_prometheus = true
# 普羅米修斯運維服務
log_file = ./frps.log
# 日志路徑
log_level = info
log_max_days = 3
# 日志信息和日志記錄最大時間
disable_log_color = false
# 禁用日志顏色,默認值為false
detailed_errors_to_client = true
# 是否將錯誤信息發送到frpc。默認情況下true。
authentication_method = token
# 授權驗證方式
authenticate_heartbeats = false
# 是否在發送到frp的心跳中包含身份驗證令牌,默認false
authenticate_new_work_conns = false
# 是否在發送到frp的新工作連接中包含身份驗證令牌。默認false
token = 12345678
# 秘鑰
oidc_client_id =
# 用于在OIDC身份驗證中獲取令牌的客戶端ID
oidc_client_secret =
# 用于在OIDC身份驗證中獲取令牌的客戶端密碼
oidc_audience =
# 指定OIDC身份驗證中令牌的訪問群體
oidc_token_endpoint_url =
# 如果AuthenticationMethod =="oidc",它將用于獲取OIDC令牌
allow_ports = 2000-3000,3001,3003,4000-50000
# 允許的端口
max_pool_count = 5
# 僅允許frpc綁定您列出的端口
max_ports_per_client = 0
# pool_count的最大值
tls_only = false
# tlsonly指定是否僅接受TLS加密連接,默認false
subdomain_host = frps.com
# 當測試子域時,路由使用的主機
tcp_mux = true
# 使用tcp流多路復用,默認為true
[plugin.user-manager]
addr = 127.0.0.1:9000
path = /handler
ops = Login
# 插件管理
[plugin.port-manager]
addr = 127.0.0.1:9001
path = /handler
ops = NewProxy
# 插件管理
客戶端frpc.ini
[common]
# 通用設置
server_addr = 0.0.0.0
server_port = 7000
# 服務端配置
http_proxy = http://user:passwd@192.168.1.128:8080
# 通過http代理或socks5代理連接frps
log_file = ./frps.log
# 日志路徑
log_level = info
log_max_days = 3
# 日志信息和日志記錄最大時間
disable_log_color = false
# 禁用日志顏色,默認值為false
token = 12345678
# 用于身份驗證
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
# 通過api設置frpc控制臺
pool_count = 5
# 連接將提前建立,默認值為零
tcp_mux = true
# 使用tcp流多路復用,默認為"true"
user = your_name
# 更改代理名稱
login_fail_exit = true
# 第一次登錄失敗時是否退出程序,默認true
protocol = TCP
# 用于連接服務器的通信協議,支持tcp,kcp,websocket。默認tcp協議。
tls_enable = true
# 如果tls_enable為true,則frpc將通過tls連接frps
dns_server = 8.8.8.8
# 指定一個dns服務器,因此frpc將使用此服務器代替默認服務器
meta_var1 = 123
meta_var2 = 234
# 客戶端的其他元信息
[ssh]
# 支持 tcp | udp | http | https | stcp | xtcp,默認為tcp
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 限制此代理的帶寬
use_encryption = false
# 對frps和frpc之間的消息進行加密,默認為false
use_compression = false
# 是否壓縮,默認fasle
remote_port = 6001
# 設置遠程監聽端口
group = test_group
# 設置組
group_key = 123456
# 設置組密碼
health_check_type = TCP
# frpc連接本地服務的端口以檢測其健康狀態
health_check_timeout_s = 3
# 設置檢查連接超時時間
health_check_max_failed = 3
# 設置連續3次失敗,則代理將從frps中刪除
health_check_interval_s = 10
# 設置每10秒進行一次健康檢查
meta_var1 = 123
meta_var2 = 234
# 每個代理的其他元信息
以下就是一些實例:
[ssh_random]
[range:tcp_port]
[DNS]
[range:udp_port]
[web01]
[web02]
frp使用
搭建socks5隧道
frps.ini
[common]
bind_addr = 0.0.0.0
# 綁定的ip,為本機
bind_port = 7000
# 綁定的端口
dashboard_addr = 0.0.0.0
# 管理地址
dashboard_port = 4000
# 管理端口
dashboard_user = root
# 管理的用戶名
dashboard_pwd = 1qaz2wsx
# 管理用戶的密碼
token = 1qaz2wsx
# 客戶端服務端連接的密碼
heartbeat_timeout = 90
# 心跳超時時間
max_pool_count = 5
# 最大同時連接數
服務端運行命令
./frps -c frps.ini
frpc.ini
[common]
server_addr = 106.53.97.7
server_port = 7000
# 服務器綁定的端口
token = 1qaz2wsx
# 連接的密碼
tls_enable = true
# 啟用tls
pool_count = 5
protocol = tcp
# 協議類型
health_check_type = tcp
health_check_interval_s = 100
# 設置健康檢查時間
[test]
remote_port = 2333
# 代理的端口
plugin = socks5
# 使用的協議
use_encryption = true
# 是否加密
use_compression = true
# 是否壓縮
先對流量加密,再用TLS加密,保障傳輸安全。
客戶端運行
./frpc -c frpc.ini
對應上面test設置的socks5代理。
使用SocksCap64設置firefox瀏覽內網網頁。
這里的socks5代理沒有設置用戶名、密碼。
如果設置,需要增加兩個配置項。
plugin_user = cseroad
plugin_passwd = cseroad123
再推薦幾個配置項
tls_enable = true # 從0.25.0版本開始 frp 支持通過 TLS 協議加密傳輸
use_encryption = true # 通信內容加密傳輸
use_compression = true # 是否壓縮
wireshark抓取未配置這幾項之前的通信流量。
可以顯而易見看到來源地址,目的地址,通信的端口,以及正在訪問的網頁。
添加上面幾項后,再次抓取數據包,可以看到通信內容已經加密。
防護手法:可以在流量設備上禁止gryphon協議,因為frp每次連接都會有gryphon協議的包去認證frp服務器。
搭建tcp隧道
frps.ini
[common]
bind_addr = 0.0.0.0
# 綁定的ip,為本機
bind_port = 7000
# 綁定的端口
dashboard_addr = 0.0.0.0
# 管理地址
dashboard_port = 4000
# 管理端口
dashboard_user = root
# 管理的用戶名
dashboard_pwd = 1qaz2wsx
# 管理用戶的密碼
token = 1qaz2wsx
# 客戶端服務端連接的密碼
heartbeat_timeout = 90
# 心跳超時時間
max_pool_count = 5
# 最大同時連接數
frpc.ini
[common]
server_addr = 109.xxx.xxx.9
server_port = 7000
token = 1qaz2wsx
tls_enable = true
[test]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 33389
use_encryption = true
use_compression = true
訪問公網的33389即可訪問客戶端的3389端口,完美實現端口轉發。
補充:
linux后臺運行
nohup ./frps -c frps.ini >/dev/null 2>&1 &
停止方式
ps -aux|grep frp| grep -v grep # 找到進程
kill -9 進程號 # 殺死進程
frp 的缺點是需要落地配置文件。
當然,uknowsec 大佬改造出了配置文件不落地的方案。https://github.com/uknowsec/frpModify
nps
nps簡介
nps也是go語言編寫,是一款強大的內網穿透工具。同樣支持tcp、udp流量轉發、內網http代理、內網socks5代理、p2p等,并帶有強大的web管理端。比frp更強大。
nps下載
https://github.com/ehang-io/nps/releases/tag/v0.25.1 下載amd文件
nps配置
下載后查看一下文件目錄。
server端
在nps目錄下有一個nps可執行文件、conf配置目錄和web網頁目錄,我們使用的時候只需要修改conf/nps.conf即可。
以下表格來源 官方文檔
名稱 | 含義 |
---|---|
web_port | web管理端口 |
web_password | web界面管理密碼 |
web_username | web界面管理賬號 |
web_base_url | web管理主路徑,用于將web管理置于代理子路徑后面 |
bridge_port | 服務端客戶端通信端口 |
https_proxy_port | 域名代理https代理監聽端口 |
http_proxy_port | 域名代理http代理監聽端口 |
auth_key | web api密鑰 |
bridge_type | 客戶端與服務端連接方式kcp或tcp |
public_vkey | 客戶端以配置文件模式啟動時的密鑰,設置為空表示關閉客戶端配置文件連接模式 |
ip_limit | 是否限制ip訪問,true或false或忽略 |
flow_store_interval | 服務端流量數據持久化間隔,單位分鐘,忽略表示不持久化 |
log_level | 日志輸出級別 |
auth_crypt_key | 獲取服務端authKey時的aes加密密鑰,16位 |
p2p_ip | 服務端Ip,使用p2p模式必填 |
p2p_port | p2p模式開啟的udp端口 |
pprof_ip | debug pprof 服務端ip |
pprof_port | debug pprof 端口 |
disconnect_timeout | 客戶端連接超時,單位 5s,默認值 60 |
client端
首先客戶端有多個使用方式。
- 可以直接無配置文件使用
./npc -server=ip:port -vkey=web界面中顯示的密鑰
- 也可以注冊到系統服務進行使用
如linux下
sudo ./npc install 其他參數(例如-server=xx -vkey=xx或者-config=xxx) 注冊
sudo npc start 啟動
sudo npc stop 停止
sudo npc uninstall 卸載
- 也可以配置文件進行是使用,這就類似frp了。
./npc -config=npc配置文件路徑
查看npc.conf配置文件
名稱 | 含義 |
---|---|
server_addr | 服務端ip/域名:port |
conn_type | 與服務端通信模式(tcp或kcp) |
vkey | 服務端配置文件中的密鑰(非web) |
username | socks5或http(s)密碼保護用戶名(可忽略) |
password | socks5或http(s)密碼保護密碼(可忽略) |
compress | 是否壓縮傳輸(true或false或忽略) |
crypt | 是否加密傳輸(true或false或忽略) |
rate_limit | 速度限制,可忽略 |
flow_limit | 流量限制,可忽略 |
再往下示具體模式進行配置。
具體參考官方文檔
nps使用
server端啟用nps
編輯nps.conf配置文件
appname = nps
#Boot mode(dev|pro)
runmode = dev
##bridge
#底層通信協議,默認tcp,可選用kcp協議
bridge_type=tcp
#底層通信端口,默認8024,如已被占用請指定其他端口
bridge_port=8024
bridge_ip=0.0.0.0
#當客戶端以配置文件模式啟動時會用到的驗證密鑰,可自行設置
public_vkey=cseroad
#web 控制臺
web_host=10.xx.xx.7
web_username=cseroad
web_password=cseroad.com
web_port=18080
web_ip=0.0.0.0
啟動nps
./nps start
訪問18080端口,輸入控制臺用戶密碼,即可登錄
搭建socks5隧道
新增一條客戶端。
設置"不以配置文件運行",且壓縮加密。
客戶端運行web控制臺給出的命令。
可以在無配置文件的情況下,上線成功。運行成功后status狀態變為"online"
這時候就可以增加socks5代理。
這時候就可以使用SocksCap64 設置端口,以及basic權限認證的用戶名密碼。訪問內網。
當然也可以選擇加載npc.conf配置文件來運行npc,注意也要設置相對應的basic權限認證。
搭建tcp隧道
同樣創建tcp隧道。
用mac的microsoft remote desktop 遠程連接公網的33389即可。完美實現端口轉發。
metasploit
metasploit作為紅隊神器,本身也有內網穿透的功能。
在獲取session之后,可進行端口轉發以及創建socks5隧道。
轉發端口
portfwd用來轉發單個端口
portfwd add -l 33389 –p 3389 -r 10.211.55.19
# 添加轉發
portfwd delete -l 33389 –p 3389 -r 10.211.55.19
# 刪除轉發
portfwd list
# 列出當前轉發的列表
portfwd flush
# 移除所有轉發端口
創建socks5隧道
在有session基礎上,先添加路由
run get_local_subnets
# 獲取路由
run autoroute -s 10.211.55.0/24
# 添加路由
run autoroute -p
# 顯示路由
再創建socks5隧道
use auxiliary/server/socks5
set srvhost 127.0.0.1
set srvport 1080
run
沒有設置用戶名和密碼。
metasploit同時具有socks4和socks5兩個模塊。socks4只支持TCP協議,socks5支持TCP和UDP。
再使用proxychains命令進行代理訪問
cobalt strike
cobalt strike也一樣具有內網穿透的能力。同樣首先需要一個beacon
端口轉發
beacon自帶了一個端口轉發的命令rportfwd
rportfwd 本機端口 目標ip 目標端口
創建socks4隧道
選擇SOCKS Server
可用來創建socks4隧道。
對應的代理也需要設置為socks4協議
可成功訪問。
在創建成功后,可以使用"Proxy Pivots"代理metasploit走內網。
復制該命令到metasploit配置里。該設置為全局設置,一次設置,metasploit各個模塊全部可用。
比如使用smb_login模塊
setg Proxies socks4:172.16.252.11:1080 設置本地的msf走cs的socks4代理
setg ReverseAllowProxy true 建立雙向通道
use auxiliary/scanner/smb/smb_version 探測smb版本
其余內網穿透工具,如ew、ngork因為實際應用、免殺性就不多記錄了。
總結
- 實戰時注意將通信流量進行加密、壓縮
- 注意將socks5代理設置為認證狀態
- 在使用tcp協議上進行加密、壓縮還不行的情況下,不妨試一下kcp協議
參考資料
https://blog.arey.fun/archives/8/
https://whoamianony.top/2020/07/07/shen-tou-ce-shi/nei-wang-chuan-tou-gong-ju-frp-de-shi-yong/#toc-heading-5