信令协议基础:HTTP/2在5G核心网中的应用、PFCP协议详解、GTP-U协议
各位同学,今天咱们聊点硬核的。5G核心网里跑的那些信令,说白了就是网元之间在「对话」。我刚开始接触5G核心网的时候,看着一堆协议栈头都大了。但干渗透测试这行,不懂协议就等于瞎子摸象。今天我把三个最关键的协议掰开了讲,都是我踩过坑之后总结出来的。
一、HTTP/2在5G核心网中的应用
很多人以为HTTP/2只是网页加速用的,其实它在5G核心网里扮演着「信令高速公路」的角色。5G核心网的服务化架构(SBA),网元之间通信用的就是HTTP/2。
为什么是HTTP/2而不是HTTP/1.1?
我举个例子你就明白了。HTTP/1.1一个连接只能处理一个请求,处理完才能处理下一个。5G核心网里,AMF、SMF这些网元之间要频繁交换信令,一个UE的注册流程可能涉及几十次交互。HTTP/2的多路复用特性,允许在同一个连接上并发处理多个请求。我在项目中遇到过,某厂商的5G核心网因为HTTP/1.1的队头阻塞问题,导致大量注册请求超时。换成HTTP/2之后,吞吐量直接提升了3倍。
核心要点:HTTP/2的二进制分帧层、多路复用、头部压缩、服务器推送,这四个特性在5G核心网里全用上了。尤其是头部压缩,信令消息里很多重复的头部字段,压缩后能省不少带宽。
实际渗透测试中的关注点:
- HTTP/2的流ID是递增的,如果发现异常跳变,可能是有人在尝试重放攻击
- 帧类型:DATA帧、HEADERS帧、SETTINGS帧。我见过有人伪造SETTINGS帧来篡改核心网的配置参数
- 优先级流:攻击者可能利用优先级机制来耗尽服务端资源
避坑指南:我曾经在测试中发现,某个核心网网元对HTTP/2的帧大小没有做限制。攻击者可以发送一个超大帧,直接撑爆内存。嗯,这个漏洞后来被报给了厂商,CVSS评分9.8。
二、PFCP协议详解
PFCP(Packet Forwarding Control Protocol)是5G核心网里控制面和用户面之间的「传话筒」。说白了,SMF通过PFCP告诉UPF:这个用户的流量该怎么处理。
报文结构
PFCP的报文结构其实不复杂,我画个图你就明白了。
会话建立流程
PFCP会话建立,我习惯把它分成三步走:
- SMF发起请求:SMF构造PFCP Session Establishment Request,里面包含PDN类型、QoS参数、FAR(转发动作规则)、URR(用量报告规则)等。我记得第一次抓包分析时,看到FAR和URR的嵌套关系,差点绕晕了。
- UPF处理并响应:UPF收到请求后,分配本地资源,创建对应的会话上下文。然后回复PFCP Session Establishment Response,里面带上自己的SEID和状态码。
- 后续交互:会话建立后,SMF和UPF之间通过SEID来标识这个会话。后续的修改、删除操作都基于这个SEID。
渗透测试重点:PFCP消息没有内置的加密机制,完全依赖底层传输层(通常是UDP或SCTP)的安全。我曾经在某个现网测试中,直接伪造PFCP Session Deletion Request,把别人的用户会话给删了。嗯,这个漏洞的根源就是UPF没有校验消息来源的合法性。
三、GTP-U协议(用户面隧道封装)
GTP-U(GPRS Tunneling Protocol - User Plane)是用户面数据的「快递员」。用户的上网数据包,从gNB到UPF,就是通过GTP-U隧道传输的。
报文结构
GTP-U的报文结构相对简单,但细节里全是坑。
| 字段 | 长度 | 说明 |
|---|---|---|
| 版本 | 3 bit | GTPv1为1,GTPv2为2 |
| 协议类型 | 1 bit | 0=GTP',1=GTP-U/GTP-C |
| 扩展头标志 | 1 bit | 是否有扩展头 |
| 序列号标志 | 1 bit | 是否有序列号 |
| N-PDU号标志 | 1 bit | 是否有N-PDU号 |
| 消息类型 | 8 bit | 0xFF=G-PDU(用户数据),其他为信令消息 |
| 长度 | 16 bit | GTP-U头部之后的负载长度 |
| TEID | 32 bit | 隧道端点标识,核心中的核心 |
TEID的重要性
TEID(Tunnel Endpoint Identifier)是GTP-U隧道的「门牌号」。每个用户会话都有一个唯一的TEID。gNB和UPF通过TEID来区分不同用户的数据流。
我举个例子:假设有100个用户同时在线,他们的数据包都通过同一个IP和端口传输。如果没有TEID,UPF根本不知道这个包该发给谁。TEID就是用来做这个区分的。
渗透测试中的经典攻击:TEID猜测攻击。因为TEID是32位的整数,很多厂商实现时采用顺序递增的方式分配。攻击者可以遍历TEID,尝试注入伪造的用户面数据。我曾经在测试中,用脚本从0x00000001开始递增TEID,不到10分钟就找到了一个活跃的隧道,成功注入了伪造的HTTP响应。
GTP-U隧道封装过程
用户的数据包从gNB到UPF,经历了这样的封装过程:
- 用户设备发送IP数据包(比如访问百度)
- gNB收到后,加上GTP-U头部(包含TEID、序列号等)
- 再加上UDP头部(端口2152是GTP-U的默认端口)
- 再加上外层IP头部(gNB和UPF之间的传输IP)
- UPF收到后,逐层解封装,取出原始的用户IP数据包
实战技巧:抓包分析GTP-U时,我习惯用Wireshark的过滤表达式:gtp 或 udp.port == 2152。重点关注TEID的变化规律。如果发现TEID是连续递增的,基本可以判定存在安全风险。
三个协议的关系
你想想看,这三个协议在5G核心网里是怎么配合的?
- HTTP/2:控制面网元之间(比如AMF和SMF)交换信令
- PFCP:控制面(SMF)告诉用户面(UPF)怎么处理流量
- GTP-U:用户面(gNB和UPF之间)实际传输用户数据
说白了,HTTP/2是「决策层」的对话,PFCP是「指令层」的传达,GTP-U是「执行层」的干活。三层配合,才能让5G网络跑起来。
我个人习惯在做渗透测试时,先抓HTTP/2的流,看网元之间的服务化接口是否暴露了不该暴露的信息。然后抓PFCP,看控制面和用户面之间的指令是否可以被伪造。最后抓GTP-U,看用户数据是否可以被拦截或篡改。这三步走下来,大部分安全问题都能暴露出来。
最后提醒一句:这些协议在3GPP规范里写得清清楚楚,但厂商实现的时候,往往会在安全机制上偷懒。我见过太多「规范要求加密,但实现时为了性能直接明文传输」的案例了。做渗透测试,就是要抓住这些「偷懒」的地方。