1. SIP协议基础回顾
做VoIP安全这些年,我见过太多因为SIP基础不牢导致的安全事故。说实话,很多人一上来就搞加密、搞防火墙,结果连SIP消息都读不懂。今天咱们就从最基础的东西开始,把SIP协议彻底捋一遍。
1.1 SIP协议概述
SIP(Session Initiation Protocol),说白了就是一个「打电话的协议」。但它不光能打电话,视频会议、即时消息、在线状态,这些都能管。
我刚开始接触SIP时有个困惑:它和H.323到底啥关系?后来在项目里踩过坑才明白——SIP是文本协议,像HTTP一样简单;H.323是二进制协议,复杂得多。现在VoIP领域,SIP基本一统天下了。
SIP的核心设计理念就三个:
- 定位用户:不管你在哪,都能找到你
- 建立会话:帮你和对方「握手」
- 管理会话:通话中改参数、转接、挂断,都归它管
重要提醒:SIP只负责「信令」——也就是控制信息的交换。真正的语音数据流走的是RTP协议。这个区分特别重要,我在安全审计时经常发现有人把信令加密了,但RTP流裸奔,等于白干。
1.2 SIP消息结构
SIP消息分两种:请求和响应。结构上跟HTTP几乎一模一样,你如果懂HTTP,上手SIP会非常快。
1.2.1 请求消息
请求消息的格式长这样:
方法 URI SIP版本
头部字段: 值
空行
消息体
常用的SIP方法有这些:
| 方法 | 含义 | 我在项目中见过的问题 |
|---|---|---|
| INVITE | 发起呼叫 | 有人伪造INVITE搞呼叫洪泛 |
| ACK | 确认响应 | ACK丢失导致呼叫卡死 |
| BYE | 结束会话 | 伪造BYE可以强拆通话 |
| CANCEL | 取消未完成的呼叫 | 很少人关注,但攻击者会用 |
| REGISTER | 注册用户位置 | 注册劫持是重灾区 |
| OPTIONS | 查询服务器能力 | 常被用来做扫描探测 |
1.2.2 响应消息
响应消息的格式:
SIP版本 状态码 原因短语
头部字段: 值
空行
消息体
状态码分6类,我习惯这么记:
- 1xx(临时):正在处理,别急。比如100 Trying、180 Ringing
- 2xx(成功):搞定了。200 OK最常见
- 3xx(重定向):我不在这,去别处找
- 4xx(客户端错误):你发的东西有问题。401 Unauthorized、404 Not Found
- 5xx(服务器错误):服务器挂了
- 6xx(全局错误):谁都救不了你
避坑指南:我曾经在审计一个系统时发现,攻击者利用「100 Trying」响应做反射放大攻击。因为很多服务器对INVITE会回复100 Trying,但响应包比请求包大好几倍。你想想看,如果伪造源IP发一堆INVITE,受害者就会被海量响应淹没。
1.3 SIP URI与地址格式
SIP URI是SIP世界的「电话号码+地址」合体。格式如下:
sip:user@host:port;参数?头部
举个例子:
sip:zhangsan@192.168.1.100:5060
sip:lisi@example.com
sip:+8613800138000@gateway.com;user=phone
这里有几个要点:
- user部分:可以是用户名,也可以是电话号码
- host部分:可以是IP或域名
- port部分:默认5060(UDP/TCP),5061(TLS)
- 参数部分:用分号分隔,比如user=phone表示这是电话号码格式
还有一种叫SIPS URI,走TLS加密:
sips:zhangsan@example.com
注意:我在做渗透测试时发现,很多系统对URI的解析有漏洞。比如有人会在URI里塞特殊字符、超长字符串,导致服务器崩溃。所以做安全加固时,URI校验是第一道防线。
1.4 SIP会话建立流程
典型的SIP呼叫流程,说白了就是「三次握手」的升级版。咱们看一个最简单的例子:
这个流程看着复杂,其实核心就三步:
- 呼叫建立:INVITE → 100 Trying → 180 Ringing → 200 OK → ACK
- 媒体传输:RTP流开始,双方通话
- 呼叫拆除:BYE → 200 OK
嗯,这里要注意一个细节:ACK是SIP里唯一不需要响应的请求。为什么?因为200 OK已经确认了呼叫建立,ACK只是「我知道你知道了」的确认。如果ACK丢了,服务器会重传200 OK。
实战经验:我曾经排查过一个诡异的问题——用户经常打不通电话,但偶尔又能通。抓包一看,原来是代理服务器在转发INVITE时修改了Via头字段,导致响应回不来。这种「信令路径不对称」的问题,在安全审计时也经常遇到,攻击者可以利用它来隐藏真实来源。
还有一个容易忽略的点:SIP消息里的Call-ID字段。它唯一标识一次会话。我在审计时发现,有些系统没有校验Call-ID的唯一性,攻击者就可以重放旧消息来干扰通话。
好了,SIP协议的基础就这些。别小看这些基础内容,后面讲安全审计时,你会发现90%的漏洞都出在这些「看似简单」的地方。