本文所提供的程序(方法)可能帶有攻擊性,僅供安全研究與教學之用。文章做者沒法鑑別判斷讀者使用信息及工具的真實用途,若讀者將文章中的工具或信息作其餘用途,由讀者承擔所有法律及連帶責任,segmentfault和本文做者不承擔任何法律及連帶責任。php
frp下載 :frphtml
Nginx下載 :Nginx前端
應甲方要求,對其某個業務系統進行受權滲透測試。linux
該系統部署在阿X雲,系統前端部署在代理主機,後端部署在應用主機。應用主機與代理主機使用內網鏈接,採用http協議,不對互聯網暴露。nginx
經過互聯網訪問目標系統時,域名解析指向代理主機,代理主機部署了Nginx對請求的子域名進行正向代理,以知足未來擴充業務的需求。git
網絡拓撲示意圖以下:github
果真,在隨後的滲透測試過程當中,遭遇到阿X雲WAF的攔截,請求包被RESET。在嘗試上傳任意文件後綴名爲jsp、php時,更是遭遇到IP臨時封禁的專屬服務。後與甲方溝通屢次,表示不能提供打包鏡像或者本地測試環境。web
轉而求其次,向甲方申請在雲主機上部署FRP,創建加密隧道,來繞過WAF對滲透測試的干擾。segmentfault
甲方對該方案表示承認,但要求必須保證隧道安全。因而我決定採用FRP內置的STCP協議對TCP隧道進行加密傳輸,還有一個好處是能夠確保報文內容不會被WAF檢測。windows
在部署以前對業務流程進行了更深刻的考慮:代理主機和應用主機之間也採用了http協議通訊,只將FRP部署在代理主機,從代理主機到應用主機的報文是未加密的。若是此時經過安全隧道從代理主機嚮應用主機進行滲透測試,則會觸發內部網絡的WAF動做,極端狀況下會致使代理主機的內網IP遭到封禁,使業務中斷。
最終解決方案是在代理主機和應用主機分別部署FRP,代理主機和應用主機在防火牆的同一個安全組內,開啓TCP10000/10000,指定IP爲88.88.88.88。
添加過FRP後的網絡拓撲示意圖以下:
測試主機經過FRPS創建和兩臺雲主機的安全隧道,再將安全隧道與本地端口進行綁定。這裏綁定了8010端口和8020端口,此時在瀏覽器訪問127.0.0.1:8010和127.0.0.1:8020,均順利返回了相應的靜態資源,證實隧道成功創建。
接下來要對測試主機的80端口複用,這時候就用到了最著名的代理軟件——Nginx。
(在這裏當時第一時間想到的工具不是Nginx,而是Windows自帶的netsh.exe。使用portproxy命令能夠實現端口轉發,直接將80端口轉發到對應的本地端口,可是因爲Hosts文件只關注網絡層的轉換,因此沒法完成對80端口的複用。端口複用須要工做在傳輸層的軟件才能完成,因而瓜熟蒂落的想到了Nginx。)
首先修改Hosts文件,將全部與測試有關的域名都指向127.0.0.1。這裏注意不能採用模糊匹配,必定要精確匹配到子域名。
而後在測試主機本地搭建Nginx做爲正向代理,監聽來自本機80端口的http請求。修改Nginx的配置文件,使得不一樣的域名請求轉發到對應的本地端口。
最後再由FRPC將監聽的本地端口報文以安全TCP協議(STCP)傳輸到相應的雲主機。
測試主機訪問的整個流程示意圖以下:
測試過程當中須要使用到Burp進行抓包,將Burp監聽端口設爲8090,瀏覽器代理指向127.0.0.1:8090便可實現。
使用Burp抓包後,測試域名已經指向本地。
使用多種工具進行測試後均無異常,成功繞過WAF,開始一展身手吧!
登陸具備公網IP的主機,這裏我購買了一臺阿X雲輕量應用服務器,下載FRP:
wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_386.tar.gz
下載完成後進行解壓縮:
tar -zxvf frp_0.20.0_linux_386.tar.gz
進入frp_0.20.0_linux_386,修改 frps.ini 文件,這裏給出一個最基礎的配置,須要更多功能請參閱官方文檔:
[common] bind_addr = 0.0.0.0 bind_port = 10000 token = 這裏是密碼,複雜度越高越好
其中
「bind_port」爲FRPS與FRPC通訊的端口,配置後須要在阿X雲防火牆添加對應規則。
「token」爲鏈接FRPS時所須要的口令,建議複雜度越高越好。
nohup ./frps -c ./frps.ini &
tail -f nohup.out
登陸相應主機,下載解壓FRP:
wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_386.tar.gz
tar -zxvf frp_0.20.0_linux_386.tar.gz
進入frp_0.20.0_linux_386,修改 frpc.ini 文件,這裏給出一個最基礎的配置,須要更多功能請參閱官方文檔:
[common] server_addr = 88.88.88.88 server_port = 10000 token = 密碼與FRPS相同 protocol = tcp login_fail_exit = false user = web01
[Web8010] type = stcp sk = 設定鏈接8010端口的口令 local_ip = 127.0.0.1 local_port = 8010
[Web8020] type = stcp sk = 設定鏈接8020端口的口令 local_ip = 127.0.0.1 local_port = 8020
其中
「server_addr」爲FRPS的IP地址。
「server_port」爲FRPC與FRPS通訊的端口。
「token」爲鏈接FRPS時所須要的口令。
「user」爲當前FRPC用戶身份,具備惟一性。
「[Web8010]」爲一個安全隧道的名稱,具備惟一性。
「sk」爲鏈接當前安全隧道所須要的口令,建議複雜度越高越好。
「local_ip」爲安全隧道監聽的雲主機IP,這裏填寫本機。
「local_port」爲安全隧道監聽的雲主機端口,這裏監聽了8010和8020端口。
nohup ./frpc -c ./frpc.ini &
tail -f nohup.out
進入frp_0.20.0_linux_386,修改 frpc.ini 文件,這裏給出一個最基礎的配置,須要更多功能請參閱官方文檔:
[common] server_addr = 88.88.88.88 server_port = 10000 token = 密碼與FRPS相同 protocol = tcp login_fail_exit = false user = web02
[Web8080] type = stcp sk = 設定鏈接8080端口的口令 local_ip = 127.0.0.1 local_port = 8080
其中
「user」爲當前FRPC用戶身份,具備惟一性。
「[Web8080]」爲一個安全隧道的名稱,具備惟一性。
「sk」爲鏈接當前安全隧道所須要的口令,建議複雜度越高越好。
「local_ip」爲安全隧道監聽的雲主機IP,這裏填寫本機。
「local_port」爲安全隧道監聽的雲主機端口,這裏監聽了8010和8020端口。
nohup ./frpc -c ./frpc.ini &
tail -f nohup.out
測試終端使用Windows系統,須要下載Windows版FRP:
進入frp_0.20.0_windows_amd64,修改 frpc.ini 文件,這裏給出一個最基礎的配置,須要更多功能請參閱官方文檔:
[common] server_addr = 88.88.88.88 server_port = 10000 token = 密碼與FRPS相同 protocol = tcp user = TEST1
[Web8010_visitor] role = visitor type = stcp server_name = web01.Web8010 sk = 與鏈接代理主機8010端口的口令相同 bind_addr = 127.0.0.1 bind_port = 8010
[Web8020_visitor] role = visitor type = stcp server_name = web01.Web8020 sk = 與鏈接代理主機8020端口的口令相同 bind_addr = 127.0.0.1 bind_port = 8020
[Web8080_visitor] role = visitor type = stcp server_name = web02.Web8080 sk = 與鏈接應用主機8080端口的口令相同 bind_addr = 127.0.0.1 bind_port = 8080
其中
「server_addr」爲FRPS的IP地址。
「server_port」爲FRPC與FRPS通訊的端口。
「token」爲鏈接FRPS時所須要的口令。
「user」爲當前FRPC用戶身份,具備惟一性。
「[Web8010_visitor]」爲一個安全隧道訪客的名稱,具備惟一性。
「server_name」爲訪問的安全隧道,具體格式爲:FRPC用戶.安全隧道名稱。
「sk」爲鏈接當前安全隧道所須要的口令。
「bind_addr」爲安全隧道轉發的目的IP地址,這裏填寫本機。
「bind_port」爲安全隧道轉發的端口號。
運行CMD.exe,切換到當前目錄,輸入:
frpc -c frpc.ini
至此,使用瀏覽器訪問http://127.0.0.1:8010和http://127.0.0.1:8020已經能夠成功請求到代理主機上的靜態資源。
打開Hosts文件,路徑爲「C:\Windows\System32\drivers\etc\hosts」,添加內容:
127.0.0.1 a.test.com 127.0.0.1 b.test.com 127.0.0.1 c.test.com
保存後關閉。
測試終端使用Windows系統,須要下載Windows版Nginx
下載完成後,進入nginx-1.18.0\conf\,打開nginx.conf文件進行配置。
這裏給出一個最基礎的配置,須要更多功能請參閱官方文檔:
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #8010 server { listen 80; server_name a.test.com; location / { proxy_pass http://127.0.0.1:8010; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } #8020 server { listen 80; server\_name b.test.com; location / { proxy\_pass http://127.0.0.1:8020; } error\_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } #8080 server { listen 80; server\_name c.test.com; location / { proxy\_pass http://127.0.0.1:8080; } error\_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
切換到nginx-1.18.0目錄,雙擊Nginx.exe,打開任務管理器,若是出現Nginx.exe則啓動成功。