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意味着要么是初始消息,要么就是有人在搞鬼。后来一查,果然是有人在伪造信令。

避坑指南: 我曾经在渗透测试中,通过修改GTP-C消息的TEID,成功把流量劫持到了另一个网元。所以,检查TEID的合法性,是核心网安全的第一道防线。

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的形式传递的。

重点: Diameter协议没有加密机制,全靠底层传输(如TLS/DTLS)来保证安全。我在渗透测试中,经常通过抓包分析Diameter消息,直接看到用户的IMSI、MSISDN等敏感信息。所以,如果核心网没有启用TLS,那简直就是裸奔。

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的安全检查,直接发送伪造的附着请求。

小技巧: 分析NAS消息时,我建议你重点关注“消息类型”和“安全头类型”。这两个字段能告诉你:这条消息是干什么的,以及它有没有被保护。如果发现安全头类型是0x0000,但消息内容却包含敏感信息(如IMSI),那基本可以断定有问题。

3.5 协议栈关系图

为了让你更直观地理解这些协议之间的关系,我画了一张图:

核心网协议栈关系图 UE(手机) eNodeB(基站) MME(核心网) SGW/PGW HSS NAS S1AP GTP-C GTP-U Diameter 图例: NAS(手机↔MME) S1AP(基站↔MME) GTP-C(MME↔SGW/PGW) GTP-U(基站↔SGW/PGW) Diameter(MME↔HSS)

从这张图你可以看到: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,看核心网会不会接受。
注意: 渗透测试必须在授权范围内进行。私自抓包、伪造消息是违法行为。我建议你在实验室环境或授权的测试网络中练习。

好了,核心网协议栈就讲到这里。这些协议是核心网的“骨架”,理解了它们,你就能看懂核心网是怎么工作的,也能找到潜在的安全漏洞。下一章,我会带你实战抓包分析,看看这些协议在真实网络中是怎么跑的。

专注资料整理