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呼叫流程,说白了就是「三次握手」的升级版。咱们看一个最简单的例子:

SIP典型呼叫流程 主叫方 (UAC) 代理服务器 被叫方 (UAS) ① INVITE ② 100 Trying ③ INVITE ④ 180 Ringing ⑤ 180 Ringing ⑥ 200 OK ⑦ 200 OK ⑧ ACK ⑨ ACK RTP 媒体流 ⑩ 双向语音/视频 ⑪ BYE ⑫ BYE ⑬ 200 OK

这个流程看着复杂,其实核心就三步:

  1. 呼叫建立:INVITE → 100 Trying → 180 Ringing → 200 OK → ACK
  2. 媒体传输:RTP流开始,双方通话
  3. 呼叫拆除:BYE → 200 OK

嗯,这里要注意一个细节:ACK是SIP里唯一不需要响应的请求。为什么?因为200 OK已经确认了呼叫建立,ACK只是「我知道你知道了」的确认。如果ACK丢了,服务器会重传200 OK。

实战经验:我曾经排查过一个诡异的问题——用户经常打不通电话,但偶尔又能通。抓包一看,原来是代理服务器在转发INVITE时修改了Via头字段,导致响应回不来。这种「信令路径不对称」的问题,在安全审计时也经常遇到,攻击者可以利用它来隐藏真实来源。

还有一个容易忽略的点:SIP消息里的Call-ID字段。它唯一标识一次会话。我在审计时发现,有些系统没有校验Call-ID的唯一性,攻击者就可以重放旧消息来干扰通话。

好了,SIP协议的基础就这些。别小看这些基础内容,后面讲安全审计时,你会发现90%的漏洞都出在这些「看似简单」的地方。


专注资料整理