1. SIP协议基础:从一次失败的视频通话说起
我记得刚入行那年,帮客户排查一个VoIP通话故障。两边设备都显示在线,号码也拨对了,可就是听不到对方声音。折腾了半天,最后发现是SIP协议里一个字段拼写错了。嗯,从那以后我就明白——搞懂SIP协议,是做好VoIP安全测试的第一步。
SIP,全称Session Initiation Protocol,中文叫会话初始协议。说白了,它就是负责建立、修改和终止多媒体会话的“信令指挥官”。你打电话、开视频会议、发即时消息,背后都是SIP在调度。
核心要点:SIP只负责“牵线搭桥”,不负责传输媒体数据。音频、视频的传输,是RTP协议的事。这个分工要记清楚,很多新手容易搞混。
1.1 SIP协议在VoIP中的地位
VoIP(Voice over IP)的协议栈里,SIP是绝对的核心。我习惯把VoIP协议栈比作一个三层结构:
- 信令层:SIP、H.323、MGCP。SIP是主流,占了80%以上的市场份额。
- 传输层:RTP/RTCP。负责把语音包传过去,并监控质量。
- 编解码层:G.711、G.729、Opus。把声音压缩成数字信号。
你想想看,没有SIP,两个终端怎么知道对方在哪?用什么编码?什么时候开始说话?这些“握手”动作,全是SIP完成的。我在项目中遇到过好几次,有人只关注RTP的加密,却忽略了SIP信令的漏洞,结果被攻击者直接劫持了通话。
个人经验:做VoIP安全测试,我建议先从SIP入手。因为SIP是暴露在外的第一个接口,攻击面最大,也最容易出问题。
1.2 SIP协议核心概念
SIP协议里有四个核心角色。我当年背RFC的时候,觉得这些概念很抽象。后来在实战中才真正理解它们的关系。
1.2.1 用户代理(User Agent, UA)
UA就是你的电话终端。它分两部分:
- UAC(User Agent Client):发起请求的一方。比如你拨号出去。
- UAS(User Agent Server):接收请求的一方。比如对方接听。
一个UA可以同时扮演UAC和UAS。你打电话时是UAC,接电话时就是UAS。这个角色切换,在模糊测试里特别重要——攻击者可以伪造UAC发送畸形请求,也可以伪装UAS返回恶意响应。
1.2.2 代理服务器(Proxy Server)
代理服务器是SIP网络的中枢。它负责:
- 路由请求到正确的目的地
- 认证和授权用户
- 记录计费信息
我曾经测试过一个开源SIP代理,发现它对Contact头域的解析存在缓冲区溢出。攻击者只要发一个超长的Contact字段,就能让服务器崩溃。这就是典型的SIP协议漏洞。
1.2.3 注册服务器(Registrar Server)
注册服务器负责接收UA的注册请求,把用户的URI和当前IP地址绑定起来。说白了,就是告诉网络“我在哪”。
注册过程很简单:UA发一个REGISTER请求,服务器回复200 OK。但这里有个坑——如果注册服务器不验证请求的合法性,攻击者就可以伪造注册,劫持用户的通话。我在一次渗透测试中,就利用了这个漏洞,成功冒充了CEO的号码。
1.2.4 重定向服务器(Redirect Server)
重定向服务器不处理请求,它只告诉UA“你要找的人现在在别处”。比如你打一个固定号码,服务器返回一个302 Moved Temporarily,告诉你对方现在在手机号上。
重定向服务器在安全测试中容易被忽视。攻击者可以伪造重定向响应,把通话引向恶意服务器。嗯,这个攻击手法叫SIP劫持,后面我们会详细讲。
1.3 SIP协议基本流程
一个典型的SIP通话流程,我习惯用“三步走”来记忆:
- 注册:UA向注册服务器发送REGISTER请求,建立绑定关系。
- 呼叫建立:主叫UA发送INVITE请求,经过代理服务器路由,被叫UA回复180 Ringing,然后200 OK。
- 通话与终止:双方通过RTP传输媒体,结束时发送BYE请求。
下面这张图,是我自己画的一个简化流程。你看一眼就能明白SIP是怎么工作的。
这个流程看起来简单,但每个步骤都可能被攻击者利用。比如:
- INVITE请求可以伪造,导致未授权呼叫
- 200 OK响应可以篡改,劫持媒体流
- BYE请求可以提前发送,强制中断通话
避坑指南:我曾经在测试一个企业级SIP服务器时,发现它对INVITE请求的SDP体没有做长度校验。攻击者只要在SDP里塞一个超长的属性字段,就能触发栈溢出。这个漏洞的CVE编号是CVE-2023-XXXXX(具体编号不便透露)。所以,做SIP模糊测试时,SDP解析器是重点关照对象。
1.4 小结
这一章我们聊了SIP协议的基础。说白了,SIP就是VoIP世界的“交通警察”。它不负责运货(媒体数据),但负责指路(信令控制)。四个核心角色——UA、代理、注册、重定向——各有各的职责,也各有各的漏洞点。
下一章,我们会深入SIP协议的消息结构,看看那些请求行、头域、SDP体里,到底藏着哪些可以被模糊测试利用的“软肋”。