在当今的网络攻防场景中,攻防双方的对抗愈加激烈,攻防手段也不断升级。Frp(Fast Reverse Proxy)作为一款开源、高性能的内网穿透工具,广泛应用于运维管理和红蓝对抗中。本文将详细探讨 Frp 的工作原理、常见流量特征、隐匿手段以及对抗排查方法,帮助读者更好地理解和应用 Frp,同时提升网络安全防护能力。
一、Frp 的基本原理
Frp 是一款反向代理工具,可以帮助内网机器将服务暴露给外网用户。它通过在内网机器上运行客户端(frpc),在外网服务器上运行服务端(frps),实现内网服务的穿透。其支持多种协议(TCP、KCP、WebSocket等)和代理类型(如HTTP、HTTPS、STCP、SUDP等),并提供负载均衡和端口复用功能。
工作流程:
-
初始化连接:frpc 向 frps 发起连接并进行身份验证。 -
隧道建立:验证通过后,frps 为 frpc 分配端口并建立隧道。 -
数据传输:内网服务通过隧道将数据传输到外网用户。
这种模式极大地方便了内网服务的外网访问,尤其在远程办公、运维管理等场景中有着广泛的应用。
二、Frp 的常见配置
Frp 的配置文件主要包括 frps.ini 和 frpc.ini,分别用于配置服务端和客户端。以下是典型的配置示例:
frps.ini:
[common]
bind_port = 7000
vhost_http_port = 8080
vhost_https_port = 8443
frpc.ini:
[common]
server_addr = x.x.x.x
server_port = 7000
[http]
type = http
local_port = 80
custom_domains = www.example.com
上述配置中,frps 监听 7000 端口,frpc 将本地 80 端口的 HTTP 服务代理到 frps,并通过 www.example.com 域名访问。
三、流量隐匿手段
-
流量加密 流量加密是通过使用传输层安全协议(TLS)对传输的数据进行加密,从而隐藏流量的明文内容。TLS加密能够有效地保护数据传输的隐私性和完整性,防止被窃听和篡改。
具体实现:
在Frp的配置文件中启用TLS加密。例如,在frpc.ini文件中添加 tls_enable = true 参数。TLS加密不仅加密数据,还对传输的每个数据包进行完整性校验,确保数据未被篡改。启用TLS加密后,即使攻击者截获了流量,也无法直接读取其中的内容,需要破解加密才能解读,这极大增加了攻击难度。
-
流量混淆 流量混淆通过改变流量特征,使其看起来不像是特定的协议流量,从而绕过基于特征匹配的检测系统。流量混淆技术可以通过修改数据包的特征字节、使用非标准端口以及混淆协议等方式来实现。
具体方法:
修改TLS特征字节:在TLS握手过程中,Frp可以通过修改客户端Hello报文中的特征字段,使其与标准的TLS流量有所不同,从而避免被检测。使用非标准端口:通常的代理流量会使用特定的端口(如443端口用于HTTPS)。通过使用随机端口,攻击者可以进一步混淆流量特征。流量混淆可以有效地规避一些简单的流量检测工具,但高级的检测系统可能仍然能够通过更复杂的分析方法识别混淆后的流量。
-
流量特征改造
默认字节修改:Frp在建立TLS连接时,会有一个固定的头部特征包,可以通过修改代码中的FRPTLSHeadByte来改变这一特征。具体操作如下:
go复制代码var (
//FRPTLSHeadByte = 0x17
FRPTLSHeadByte = 0x16
)
func WrapTLSClientConn(c net.Conn, tlsConfig *tls.Config, disableCustomTLSHeadByte bool) (out net.Conn) {
if !disableCustomTLSHeadByte {
//c.Write([]byte{byte(FRPTLSHeadByte)})
c.Write([]byte{byte(FRPTLSHeadByte), byte(0x71), byte(0x72)})
}
out = tls.Client(c, tlsConfig)
return
}
func CheckAndEnableTLSServerConnWithTimeout(
c net.Conn, tlsConfig *tls.Config, tlsOnly bool, timeout time.Duration,
) (out net.Conn, isTLS bool, custom bool, err error) {
//sc, r := gnet.NewSharedConnSize(c, 2)
sc, r := gnet.NewSharedConnSize(c, 4)
//buf := make([]byte, 1)
buf := make([]byte, 3)
var n int
c.SetReadDeadline(time.Now().Add(timeout))
n, err = r.Read(buf)
c.SetReadDeadline(time.Time{})
if err != nil {
return
}
//if n == 1 && int(buf[0]) == FRPTLSHeadByte
if n == 3 && int(buf[0]) == FRPTLSHeadByte {
out = tls.Server(c, tlsConfig)
isTLS = true
custom = true
} else if n == 1 && int(buf[0]) == 0x16 {
out = tls.Server(sc, tlsConfig)
isTLS = true
} else {
if tlsOnly {
err = fmt.Errorf("non-TLS connection received on a TlsOnly server")
return
}
out = sc
}
return
}
这样改造后,头部特征包从一个字节变为三个字节,提高了隐匿性。
-
代理特征修改
为避免暴露服务器IP和本机IP,可在server/proxy/proxy.go
文件中将源地址和目的地址写死为114.114.114.114。
配置文件自删除
在客户端启动时加载配置文件会导致VPS服务器地址泄露。可以通过以下方法解决:
-
在客户端执行后直接删除 frpc.ini
。 -
修改文件 /frp/cmd/frpc/sub/root.go
,添加变量,并在RegisterCommonFlags
函数中修改:
go
复制代码
cmd.PersistentFlags().BoolVarP(&delEnable, "delEnable", "", true, "remove frpc.ini")
启动后删除配置文件:
go复制代码if delEnable {
os.Remove("frpc.ini")
}
这样在启动后,配置文件会自动删除,提高隐匿性。
四、对抗排查方法
面对 Frp 的隐匿手段,企业需要采取有效的对抗排查方法,提升网络安全防护能力。以下是一些常见的对抗排查方法:
-
流量分析:通过流量分析工具(如 Wireshark)捕获和分析网络流量,识别异常流量特征。 -
日志审计:定期审计服务器和网络设备的日志,检测异常登录和访问行为。 -
规则检测:部署入侵检测系统(IDS)和入侵防御系统(IPS),配置规则检测 Frp 流量特征。 -
流量溯源:一旦发现异常流量,通过流量溯源技术,追踪流量来源,定位内网中的潜在威胁。
以下是一个基于 Snort 的简单检测规则示例:
alert tcp any any -> any 7000 (msg:"Frp Traffic Detected"; flow:established; content:"GET / HTTP/1.1"; sid:1000001;)
该规则用于检测访问 7000 端口的 HTTP 流量,并生成告警信息。
五、实例分析
为了更好地理解 Frp 的隐匿手段和对抗排查方法,我们通过一个实际案例进行分析。
案例描述:某公司网络管理员在日常监控中发现,网络流量中存在异常的加密流量,怀疑是内网机器被攻击者利用进行流量代理。管理员通过以下步骤进行排查和处理:
-
流量捕获:使用 Wireshark 捕获异常流量,分析其特征。 -
日志审计:检查服务器和防火墙日志,发现一台内网机器频繁访问外网某 IP。 -
规则检测:在 IDS 中配置 Frp 流量检测规则,发现多次告警。 -
流量溯源:通过流量溯源技术,定位到内网某台机器上运行着 frpc 客户端。 -
处理措施:禁用该机器的网络访问权限,进行安全加固,并排查其他潜在威胁。
通过该案例,我们可以看到,及时的流量分析和日志审计,对于发现和处理网络威胁至关重要。
总结
Frp 作为一种高效的内网穿透工具,广泛应用于运维和红蓝对抗中。然而,其隐匿特性也带来了新的安全挑战。通过深入了解 Frp 的工作原理、流量特征和隐匿手段,并结合有效的对抗排查方法,企业可以提升网络安全防护能力,抵御潜在的网络威胁。
原文始发于微信公众号():Frp内网穿透工具详解:从工作原理到隐匿对抗
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论