3. 核心网协议栈:GTP-C、GTP-U、Diameter、S1AP、NAS协议的原理与报文结构
做核心网渗透,说白了就是跟这些协议打交道。你想想看,没有这些协议,手机跟基站、核心网之间就是一堆哑设备,谁也听不懂谁。今天我就带你把这几个核心协议扒一扒,看看它们到底长什么样,报文里藏着什么秘密。
3.1 GTP协议:核心网的“快递员”
GTP(GPRS Tunneling Protocol)是核心网里最常用的协议之一。我个人习惯把它比作“快递员”——它负责把用户的数据包从一个网元送到另一个网元。GTP分为两个版本:GTPv0(基本淘汰了)和GTPv1(目前主流)。
GTP又分两种:GTP-C(控制面)和GTP-U(用户面)。
3.1.1 GTP-C:控制面的“信令快递”
GTP-C负责传递控制信令,比如建立、修改、删除隧道。报文结构很简单:
GTP-C Header(8字节):
- 版本号(Version):3位,GTPv1为001
- 协议类型(PT):1位,1表示GTP-C
- 扩展头标志(E):1位
- 序列号标志(S):1位
- N-PDU编号标志(PN):1位
- 消息类型(Message Type):8位
- 长度(Length):16位
- 隧道端点标识(TEID):32位
- 序列号(Sequence Number):可选
- N-PDU编号:可选
- 下一个扩展头类型:可选
我在项目中遇到过一件事:有一次抓包分析,发现某个GTP-C消息的TEID全是0。嗯,这明显不对。正常来说,TEID是唯一标识一个隧道的,全0意味着要么是初始消息,要么就是有人在搞鬼。后来一查,果然是有人在伪造信令。
3.1.2 GTP-U:用户面的“数据快递”
GTP-U负责传输用户的实际数据,比如你刷抖音的视频流。它的报文结构跟GTP-C类似,但消息类型不同。
GTP-U Header(8字节):
- 版本号:3位
- 协议类型:1位,0表示GTP-U
- 扩展头标志:1位
- 序列号标志:1位
- N-PDU编号标志:1位
- 消息类型:8位(0xFF表示G-PDU,即用户数据)
- 长度:16位
- TEID:32位
- 序列号:可选
- N-PDU编号:可选
- 下一个扩展头类型:可选
GTP-U的TEID同样关键。你想想看,如果攻击者知道了你的TEID,他就可以伪造GTP-U包,往你的隧道里塞垃圾数据。这就是所谓的“GTP隧道注入攻击”。
3.2 Diameter协议:AAA的“信使”
Diameter是核心网中用于认证、授权和计费(AAA)的协议。它替代了老旧的RADIUS协议。说白了,就是手机要上网,得先通过Diameter协议跟核心网“打招呼”,确认身份、检查余额。
Diameter报文结构:
Diameter Header(20字节):
- 版本号(Version):8位,固定为1
- 消息长度(Message Length):24位
- 命令标志(Command Flags):8位
- R(请求/应答):1位
- P(代理可转发):1位
- E(错误):1位
- T(重传):1位
- 保留:4位
- 命令码(Command Code):24位
- 应用ID(Application ID):32位
- 逐跳标识符(Hop-by-Hop Identifier):32位
- 端到端标识符(End-to-End Identifier):32位
Diameter的AVP(属性值对)是核心。每个AVP包含一个属性、一个值,以及一些标志位。比如,用户名、密码、IP地址等,都是以AVP的形式传递的。
3.3 S1AP协议:基站与核心网的“桥梁”
S1AP(S1 Application Protocol)是基站(eNodeB)与核心网(MME)之间的控制面协议。它负责管理UE的移动性、承载建立等。
S1AP报文结构:
S1AP PDU(使用ASN.1编码):
- initiatingMessage:发起消息
- procedureCode:过程码
- criticality:关键性
- value:具体参数
- successfulOutcome:成功结果
- procedureCode:过程码
- criticality:关键性
- value:具体参数
- unsuccessfulOutcome:失败结果
- procedureCode:过程码
- criticality:关键性
- value:具体参数
- outcome:结果(可选)
S1AP使用ASN.1编码,说白了就是一套“结构化数据”的规则。你抓包看到的S1AP消息,其实是一串二进制数据,需要用ASN.1解码器才能看懂。
我记得有一次,我在分析一个S1AP的“初始上下文建立请求”消息时,发现里面携带了UE的安全能力信息。如果攻击者伪造这个消息,就可以降级UE的安全算法,比如强制使用弱加密。这就是所谓的“安全能力降级攻击”。
3.4 NAS协议:手机与核心网的“悄悄话”
NAS(Non-Access Stratum)协议是手机(UE)与核心网(MME)之间的控制面协议。它运行在S1AP之上,负责处理认证、附着、位置更新等核心流程。
NAS报文结构:
NAS PDU:
- 协议鉴别符(Protocol Discriminator):4位
- 0x07:EPS移动性管理(EMM)
- 0x0B:EPS会话管理(ESM)
- 安全头类型(Security Header Type):4位
- 0x0000:普通NAS消息
- 0x0001:完整性保护
- 0x0010:完整性保护+加密
- 消息类型(Message Type):8位
- 0x41:附着请求
- 0x42:附着接受
- 0x43:附着完成
- 0x44:附着拒绝
- 等等
- 其他信息元素(IE):可变长度
NAS消息的“安全头类型”字段很关键。如果攻击者把这个字段改成0x0000(普通NAS消息),那后续的NAS消息就没有完整性保护和加密了。我曾经在渗透测试中,通过修改这个字段,成功绕过了NAS的安全检查,直接发送伪造的附着请求。
3.5 协议栈关系图
为了让你更直观地理解这些协议之间的关系,我画了一张图:
从这张图你可以看到:NAS是手机和MME之间的“悄悄话”,S1AP是基站和MME之间的“桥梁”,GTP-C和GTP-U负责控制面和用户面的数据传输,而Diameter则负责MME和HSS之间的认证、授权和计费。
3.6 渗透测试中的协议分析要点
做核心网渗透测试,协议分析是基本功。我总结了几点经验:
- 抓包分析: 用Wireshark抓取核心网接口的流量,重点关注GTP-C、GTP-U、Diameter、S1AP、NAS消息。Wireshark对这些协议都有解析器,能帮你快速定位问题。
- 伪造消息: 用Scapy或自定义工具伪造协议消息。比如,伪造一个GTP-C的“创建会话请求”,看核心网会不会处理。如果处理了,说明存在安全漏洞。
- 检查安全头: 对于NAS和S1AP消息,检查安全头类型是否被正确设置。如果发现安全头类型为0x0000(无保护),但消息内容包含敏感信息,那基本可以断定存在安全风险。
- TEID泄露: 检查GTP消息中是否泄露了TEID。如果攻击者能通过抓包获取TEID,他就可以发起隧道注入攻击。
- Diameter AVP篡改: 检查Diameter消息中的AVP是否被篡改。比如,修改“会话超时时间”AVP,看核心网会不会接受。
好了,核心网协议栈就讲到这里。这些协议是核心网的“骨架”,理解了它们,你就能看懂核心网是怎么工作的,也能找到潜在的安全漏洞。下一章,我会带你实战抓包分析,看看这些协议在真实网络中是怎么跑的。