第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消息结构的核心脉络都串起来了。从上到下,先分请求和响应,再细化到具体方法和状态码,最后落到SDP媒体协商。你想想看,攻击者可以在任何一个环节做手脚——伪造请求、篡改头域、劫持SDP,这些都是我们后面要重点讲的。
好了,这一章的内容就到这里。记住,理解消息结构是SIP安全的基础。下一章我们会深入分析SIP认证机制,看看那些看似安全的认证是怎么被攻破的。