第4章:SIP消息结构解析

说实话,搞SIP安全这么多年,我见过太多人栽在消息结构上。你连SIP消息长什么样都搞不清楚,怎么去重放?怎么去注入?

这一章,咱们就把SIP消息扒开来看。从请求行到消息头,再到SDP体,一个细节都不放过。

4.1 请求行与状态行

SIP消息分两种:请求和响应。请求有请求行,响应有状态行。结构其实很简单,但坑不少。

4.1.1 请求行格式

请求行长这样:

INVITE sip:user@example.com SIP/2.0

三个部分:方法、URI、协议版本。方法就是你要干啥,比如INVITE(邀请)、REGISTER(注册)、BYE(挂断)。URI是目标地址。协议版本目前基本都是SIP/2.0。

重点:请求行里的URI,不一定和To头域一致。我遇到过攻击者故意篡改URI,把请求转发到恶意服务器。你检查消息时,这两个地方都得看。

4.1.2 状态行格式

响应消息的第一行叫状态行:

SIP/2.0 200 OK

也是三部分:协议版本、状态码、原因短语。状态码是三位数字,100-699。常见的:

状态码 含义 说明
100 Trying 正在处理,别急
180 Ringing 对方手机在响了
200 OK 成功了
401 Unauthorized 没认证,滚蛋
404 Not Found 用户不存在
487 Request Terminated 请求被取消

我个人习惯,看到401和487就特别警惕。401可能意味着有人在暴力破解密码,487可能是重放攻击的前奏。

4.2 消息头字段详解

SIP消息头字段有几十个,但真正和攻击相关的,就那么几个。咱们一个一个说。

4.2.1 From头域

From表示发起者。格式:

From: "Alice" <sip:alice@example.com>;tag=abc123

注意那个tag参数。它是对话的唯一标识。攻击者如果篡改From的tag,就能伪造身份。我在一次渗透测试中,就通过修改From的URI,成功冒充了管理员。

警告:From头域可以被任意修改。不要信任From里的地址。认证靠的是Authorization头域,不是From。

4.2.2 To头域

To表示接收者。格式和From一样:

To: "Bob" <sip:bob@example.com>;tag=xyz789

请求消息里,To的tag是可选的。响应消息里,To的tag必须带上。嗯,这里有个坑:攻击者可以篡改To头域,把呼叫重定向到别处。

4.2.3 Call-ID头域

Call-ID是整个会话的唯一标识。一个通话从开始到结束,Call-ID不变。格式:

Call-ID: a84b4c76e66710@192.168.1.100

为什么重要?因为重放攻击的核心就是复制整个消息,包括Call-ID。如果你发现两个消息的Call-ID一模一样,那基本就是重放攻击了。

我曾经在抓包分析时,看到连续三个INVITE请求的Call-ID完全相同。嗯,不用想,有人在搞事情。

4.2.4 CSeq头域

CSeq是命令序列号。格式:

CSeq: 1 INVITE

它由数字和方法名组成。每次发送新请求,数字递增。服务器用CSeq来检测消息的顺序和重复。

攻击者如果重放一个旧的CSeq,服务器就能识别出来。但有些实现不检查CSeq,这就给了攻击者可乘之机。

技巧:检查CSeq是否单调递增,是检测重放攻击的简单有效方法。我写检测脚本时,第一件事就是看CSeq。

4.3 SDP体结构

SDP(Session Description Protocol)描述的是媒体信息。它不负责传输媒体,只负责告诉对方:我用什么编码、什么端口、什么IP。

SDP体是纯文本,一行一个字段。典型结构:

v=0
o=- 123456 789012 IN IP4 192.168.1.10
s=-
c=IN IP4 192.168.1.10
t=0 0
m=audio 10000 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000

关键字段:

  • v=:版本号,目前是0
  • o=:会话发起者,包含用户名、会话ID、版本、网络类型、地址
  • c=:连接信息,IP地址
  • m=:媒体描述,包括媒体类型、端口、传输协议、编码格式
  • a=:属性行,描述编码参数

攻击者最常篡改的是c=m=。把IP改成自己的,就能劫持媒体流。把端口改了,就能让媒体发到别处。

实战案例:有一次,我发现一个VoIP系统没有校验SDP里的IP地址。攻击者把c=IN IP4 192.168.1.10改成了c=IN IP4 10.0.0.5,结果所有语音都发到了攻击者的服务器上。这就是典型的SDP注入攻击。

4.4 知识体系总览

下面这张图,把SIP消息结构的核心逻辑串起来了。你对照着看,思路会更清晰。

SIP消息结构知识体系 SIP消息 请求消息 响应消息 请求行 状态行 消息头字段 空行 SDP体 方法 URI 版本 版本 状态码 原因短语 From/To Call-ID CSeq c=连接信息 m=媒体描述 a=属性行 攻击点:重放整个消息 / 篡改头域 / 注入SDP

这张图把SIP消息的骨架画清楚了。你记住:请求行/状态行在最上面,中间是消息头,空行隔开,下面是SDP体。攻击者动任何一个地方,都可能搞出事情。

好了,这一章就到这儿。消息结构是基础中的基础,你把它吃透了,后面讲重放攻击和注入攻击,你才能听得明白。


公众号:蓝海资料掘金营,微信deep3321