3. SIP消息捕获:使用Wireshark过滤SIP流量、导出SIP消息、分析SIP会话流程

做VoIP安全研究,Wireshark就是你的眼睛。说实话,没有它,你就像在黑夜里摸黑走路。我刚开始接触SIP协议时,面对满屏的抓包数据,头都是大的。但后来我发现,只要掌握了几个关键技巧,SIP流量分析其实没那么玄乎。

3.1 为什么必须学会抓SIP包?

你想想看,SIP消息本质上就是文本协议。它跑在UDP或TCP上,默认端口是5060。攻击者要重放或注入消息,第一步就是得知道正常消息长什么样。我在项目中遇到过好几次,客户说系统被攻击了,但日志里啥也没留下。我一抓包,好家伙,攻击者发的INVITE消息里,Call-ID字段明显是伪造的。

所以,学会用Wireshark过滤和导出SIP消息,是后续所有攻击技术的基础。说白了,你得先学会看地图,才能去打仗。

3.2 Wireshark过滤SIP流量的三板斧

Wireshark的过滤器分两种:捕获过滤器和显示过滤器。我个人习惯用显示过滤器,因为更灵活。下面是我常用的几个过滤表达式:

过滤目的 过滤表达式 说明
只看SIP协议 sip 最简单的,显示所有SIP包
指定IP的SIP流量 sip and ip.addr == 192.168.1.100 只看某个IP的SIP消息
过滤特定方法 sip.Method == "INVITE" 只看INVITE请求
过滤响应码 sip.Status-Code == 200 只看200 OK响应
按Call-ID过滤 sip.Call-ID contains "abc123" 追踪特定会话

嗯,这里要注意:SIP消息可能被分片。如果你发现某个请求只有一半,记得加上sip and !icmp,排除掉ICMP干扰。

3.3 导出SIP消息的两种方式

抓到包之后,你得把消息导出来。我一般用两种方法:

方法一:直接导出为文本

在Wireshark里选中一个SIP包,右键 -> Follow -> UDP Stream。然后你会看到完整的SIP消息体。复制出来保存成.txt文件就行。这个方法适合快速查看单个会话。

方法二:批量导出所有SIP消息

如果你需要分析大量数据,可以用tshark命令行工具。我写过一个小脚本:

# 导出所有SIP消息到文本文件
tshark -r capture.pcap -Y "sip" -T fields \
  -e frame.number \
  -e ip.src \
  -e ip.dst \
  -e sip.Method \
  -e sip.Status-Code \
  -e sip.Call-ID \
  -e sip.From \
  -e sip.To \
  -e sip.CSeq \
  > sip_messages.csv

这样导出的CSV文件,可以用Excel打开,方便做统计分析。我曾经用这个方法,从10万多个包里快速定位到了攻击者的IP。

3.4 分析SIP会话流程:从注册到通话

一个典型的SIP会话,就像两个人打电话。你得先拨号(INVITE),对方接听(200 OK),然后你确认(ACK),最后挂断(BYE)。下面我用一张图来展示这个流程:

用户A (UAC) 代理服务器 用户B (UAS) INVITE INVITE 100 Trying 180 Ringing 180 Ringing 200 OK 200 OK ACK ACK RTP 媒体流(语音/视频) BYE BYE 200 OK 200 OK 图例: 请求 成功响应 临时响应 媒体流

这张图展示了一个完整的SIP会话流程。你注意看,INVITE请求发出去后,服务器会先回100 Trying,然后对方振铃时回180 Ringing。接听后回200 OK,最后客户端发ACK确认。通话结束后,任何一方都可以发BYE挂断。

3.5 实战:从抓包中提取关键字段

假设你现在抓到了一个SIP INVITE包,里面长这样:

INVITE sip:bob@192.168.1.200 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK74b43
Max-Forwards: 70
From: "Alice" <sip:alice@192.168.1.100>;tag=1928301774
To: "Bob" <sip:bob@192.168.1.200>
Call-ID: a84b4c76e66710@192.168.1.100
CSeq: 1 INVITE
Contact: <sip:alice@192.168.1.100>
Content-Type: application/sdp
Content-Length: 142

v=0
o=alice 2890844526 2890844526 IN IP4 192.168.1.100
s=-
c=IN IP4 192.168.1.100
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000

我建议你重点关注这几个字段:

  • Call-ID:会话的唯一标识。重放攻击时,这个字段必须改,否则服务器会认为是同一个会话。
  • CSeq:序列号,每次请求递增。注入攻击时,如果CSeq不对,服务器会直接丢弃。
  • From/To:主叫和被叫。攻击者经常伪造这两个字段来冒充他人。
  • Contact:后续请求的地址。如果这个字段被篡改,媒体流可能被劫持。

我的小技巧:在Wireshark里,你可以右键点击某个字段,选择"Apply as Column",这样就能在列表里直接看到所有包的Call-ID、CSeq等信息。我每次做分析都会先把这些关键字段加到列里,一目了然。

3.6 避坑指南:常见问题与解决方法

我曾经踩过的坑:有一次我抓了半天包,发现SIP消息总是断断续续的。后来才发现,是因为SIP消息超过了UDP的MTU(1500字节),被分片了。Wireshark默认不会自动重组UDP分片,你得手动设置:Edit -> Preferences -> Protocols -> UDP,勾选"Reassemble UDP datagrams"。嗯,这个坑我至少踩过两次。

另外,如果你发现SIP包里有乱码,别慌。可能是SIP消息体被压缩了,或者用了TLS加密。对于加密的SIP,你得先拿到私钥才能解密。不过那是另一门课的内容了。

3.7 小结

这一章我们讲了怎么用Wireshark抓SIP包、怎么过滤、怎么导出、怎么分析会话流程。说白了,就是让你学会看SIP消息的"长相"。下一章我们会基于这些知识,开始动手做消息重放攻击。到时候你会发现,原来攻击者就是这么干的。

记住:先学会走,再学跑。抓包分析是基本功,练好了,后面的攻击技术就是水到渠成的事。


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