應用frp+Nginx繞過WAF對部署在公有云上的網站進行安全測試

免責聲明

        本文所提供的程序(方法)可能帶有攻擊性,僅供安全研究與教學之用。文章做者沒法鑑別判斷讀者使用信息及工具的真實用途,若讀者將文章中的工具或信息作其餘用途,由讀者承擔所有法律及連帶責任,segmentfault和本文做者不承擔任何法律及連帶責任。php

相關資料

frp下載 :frphtml

Nginx下載 :Nginx前端

背景介紹

        應甲方要求,對其某個業務系統進行受權滲透測試。linux

        該系統部署在阿X雲,系統前端部署在代理主機,後端部署在應用主機。應用主機與代理主機使用內網鏈接,採用http協議,不對互聯網暴露。nginx

        經過互聯網訪問目標系統時,域名解析指向代理主機,代理主機部署了Nginx對請求的子域名進行正向代理,以知足未來擴充業務的需求。git

        網絡拓撲示意圖以下:github

未命名文件.png       
果真,在隨後的滲透測試過程當中,遭遇到阿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後的網絡拓撲示意圖以下:

frp.png

測試主機經過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)傳輸到相應的雲主機。

        測試主機訪問的整個流程示意圖以下:

test.png

        測試過程當中須要使用到Burp進行抓包,將Burp監聽端口設爲8090,瀏覽器代理指向127.0.0.1:8090便可實現。

無標題.png

        使用Burp抓包後,測試域名已經指向本地。

       使用多種工具進行測試後均無異常,成功繞過WAF,開始一展身手吧!

配置步驟

安裝並配置FRPS

        登陸具備公網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

配置FRPS

        進入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時所須要的口令,建議複雜度越高越好。

啓動FRPS

nohup ./frps -c ./frps.ini &

查看運行狀態

tail -f nohup.out  

安裝並配置雲主機端FRPC

        登陸相應主機,下載解壓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

配置代理主機FRPC

        進入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端口。

啓動FRPC

nohup ./frpc -c ./frpc.ini &

查看運行狀態

tail -f nohup.out

配置應用主機FRPC

        進入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端口。

啓動FRPC

nohup ./frpc -c ./frpc.ini &

查看運行狀態

tail -f nohup.out

  

安裝並配置測試終端FRPC

        測試終端使用Windows系統,須要下載Windows版FRP:

Frp_0.20.0_windows_amd64.zip

配置測試終端FRPC

        進入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」爲安全隧道轉發的端口號。

啓動FRPC

        運行CMD.exe,切換到當前目錄,輸入:

frpc -c frpc.ini

        至此,使用瀏覽器訪問http://127.0.0.1:8010和http://127.0.0.1:8020已經能夠成功請求到代理主機上的靜態資源。

修改測試終端Hosts文件

        打開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

        保存後關閉。

安裝並配置測試終端Nginx

        測試終端使用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

        切換到nginx-1.18.0目錄,雙擊Nginx.exe,打開任務管理器,若是出現Nginx.exe則啓動成功。

此時訪問http://a.test.com、http://b.test.com、http://c.test.com,均指向了本地的對應端口。

相關文章
相關標籤/搜索