第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消息的骨架画清楚了。你记住:请求行/状态行在最上面,中间是消息头,空行隔开,下面是SDP体。攻击者动任何一个地方,都可能搞出事情。
好了,这一章就到这儿。消息结构是基础中的基础,你把它吃透了,后面讲重放攻击和注入攻击,你才能听得明白。
公众号:蓝海资料掘金营,微信deep3321