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)。下面我用一张图来展示这个流程:
这张图展示了一个完整的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