第1章:SIP消息结构——从请求到响应的完整解析

各位同学,咱们今天来聊聊SIP协议最基础、也最核心的东西——消息结构。说实话,我做了十几年SIP相关的安全测试,见过太多人栽在消息结构上。你想想看,连消息都构造不对,还谈什么攻击和防御?

这一章我会带着大家,把SIP请求消息、响应消息、头域,还有SDP协议基础,一个一个掰开揉碎了讲清楚。嗯,咱们开始吧。

1.1 SIP请求消息:六种核心方法

SIP协议里定义了六种基本请求方法,我习惯把它们分成两组:会话控制类注册管理类。说白了,一组是打电话用的,一组是登记用的。

方法 功能 我在项目中遇到的坑
INVITE 发起或修改会话 很多人忘记带SDP体,导致媒体协商失败
ACK 确认最终响应 只用于2xx响应,其他响应不需要ACK
BYE 终止会话 注意:只有会话参与者才能发BYE
CANCEL 取消未完成的请求 只能取消还没收到最终响应的请求
REGISTER 注册用户位置 过期时间设置不当会导致注册风暴
OPTIONS 查询服务器能力 攻击者常用它做存活探测

我给大家看一个典型的INVITE请求长什么样:

INVITE sip:bob@example.com SIP/2.0
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK74b43
Max-Forwards: 70
From: <sip:alice@example.com>;tag=1928301774
To: <sip:bob@example.com>
Call-ID: a84b4c76e66710@192.168.1.100
CSeq: 1 INVITE
Contact: <sip:alice@192.168.1.100>
Content-Type: application/sdp
Content-Length: 142

v=0
o=alice 2890844526 2890844526 IN IP4 192.168.1.100
s=-
c=IN IP4 192.168.1.100
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

看到没?第一行就是请求行,包含方法名、URI和协议版本。我刚开始学的时候,老是把URI写错,结果服务器根本不搭理我。

1.2 SIP响应消息:1xx到6xx的状态码

响应消息是服务器对请求的回复。我把它分成六类,每一类都有它的脾气:

1xx(临时响应):表示请求正在处理中。比如100 Trying,说白了就是「我收到了,正在处理,别急」。

2xx(成功响应):请求被成功处理。200 OK是最常见的,表示邀请成功、注册成功等。

3xx(重定向响应):告诉客户端换个地方试试。302 Moved Temporarily,我遇到过攻击者利用它做重定向劫持。

4xx(客户端错误):请求有问题。401 Unauthorized、404 Not Found,这些在渗透测试中经常见到。

5xx(服务器错误):服务器出问题了。500 Server Internal Error,有时候是配置问题,有时候是被攻击了。

6xx(全局错误):请求彻底失败。603 Decline,表示被叫方明确拒绝。

我的经验之谈:做安全测试时,重点关注4xx和5xx响应。我曾经通过分析401响应的认证头域,找到了一个VoIP系统的弱口令漏洞。

1.3 SIP消息头域:核心字段详解

头域是SIP消息的灵魂。我挑几个最重要的给大家讲:

  • From:标识发起者。注意那个tag参数,它是区分同一用户多次呼叫的关键。
  • To:标识接收者。嗯,这里要注意,To头域在请求和响应中可能不一样。
  • Call-ID:全局唯一标识一个会话。我见过有人用相同的Call-ID发多个INVITE,结果服务器直接崩溃了。
  • CSeq:命令序列号。它由数字和方法名组成,比如「1 INVITE」。每次新请求数字递增。
  • Contact:直接联系地址。这个在注册和呼叫转发中特别重要。
  • Via:记录消息经过的路径。每个代理服务器都会添加自己的Via头域。
  • Max-Forwards:最大跳数,防止消息无限循环。默认70,我建议安全测试时把它改成1,看看服务器怎么处理。

避坑指南:我曾经遇到一个案例,攻击者通过篡改Via头域中的branch参数,实现了呼叫劫持。所以,对头域的校验一定要严格。

1.4 SDP协议基础:媒体协商的核心

SDP(Session Description Protocol)虽然独立于SIP,但两者密不可分。说白了,SIP负责建立会话,SDP负责描述这个会话里要传什么媒体、怎么传。

SDP的核心字段我给大家列一下:

字段 含义 示例
v= 协议版本 v=0
o= 会话发起者信息 o=alice 2890844526 2890844526 IN IP4 192.168.1.100
s= 会话名称 s=-
c= 连接信息 c=IN IP4 192.168.1.100
t= 会话活动时间 t=0 0
m= 媒体描述 m=audio 49170 RTP/AVP 0
a= 属性行 a=rtpmap:0 PCMU/8000

你想想看,如果攻击者篡改了SDP中的IP地址或端口号,会发生什么?对,媒体流会被重定向到攻击者指定的位置。这就是SDP劫持攻击的基本原理。

实战建议:在做SIP安全测试时,一定要检查SDP中的c=行和m=行。我曾经发现一个系统,它没有验证SDP中的IP地址是否与SIP信令中的IP地址一致,结果被用来做媒体重定向攻击。

1.5 本章知识体系图

为了让大家更直观地理解SIP消息结构的整体框架,我画了一张图:

SIP消息结构知识体系 SIP消息 请求消息 响应消息 INVITE ACK / BYE CANCEL REGISTER OPTIONS 1xx 临时 2xx 成功 3xx 重定向 4xx 客户端错 5xx 服务器错 6xx 全局错 SDP协议(媒体协商) v= 版本 o= 发起者 c= 连接 m= 媒体 a= 属性 t= 时间

这张图把SIP消息结构的核心脉络都串起来了。从上到下,先分请求和响应,再细化到具体方法和状态码,最后落到SDP媒体协商。你想想看,攻击者可以在任何一个环节做手脚——伪造请求、篡改头域、劫持SDP,这些都是我们后面要重点讲的。

好了,这一章的内容就到这里。记住,理解消息结构是SIP安全的基础。下一章我们会深入分析SIP认证机制,看看那些看似安全的认证是怎么被攻破的。

专注资料整理