4、SIP协议分析工具:Wireshark SIP过滤规则、SIPp流量生成器、SIP消息篡改工具(SipProxy)
做IMS安全测试,说白了就是跟SIP协议打交道。你想想看,整个IMS核心网的信令交互,几乎全跑在SIP上。没有趁手的工具,就像赤手空拳去拆炸弹——不是不行,但大概率会翻车。
这一章,我带你过一遍我平时最常用的三件套:Wireshark(抓包分析)、SIPp(流量生成)、SipProxy(消息篡改)。这三样东西,基本覆盖了从“看”到“造”再到“改”的完整链路。
4.1 Wireshark:SIP过滤规则,别在几千个包里瞎翻
Wireshark大家都会用,但很多人只会点一下“sip”过滤。说实话,这太粗糙了。我在红队实战中,经常要面对几十万甚至上百万的SIP消息。你想想看,光一个REGISTER请求就能刷屏,不精细过滤根本没法干活。
我个人习惯,先把常用的SIP过滤规则记熟。下面这张表,是我自己整理的,你直接拿去用:
| 过滤目标 | Wireshark过滤表达式 | 说明 |
|---|---|---|
| 所有SIP消息 | sip |
最基础,但包太多 |
| 特定方法 | sip.Method == "REGISTER" |
只显示REGISTER |
| 特定响应码 | sip.Status-Code == 401 |
找认证失败的包 |
| 主叫号码 | sip.From.user == "1001" |
追踪特定用户 |
| 被叫号码 | sip.To.user == "1002" |
看谁在呼你 |
| Call-ID | sip.Call-ID == "xxxxx" |
追踪一次完整通话 |
| 带SDP的包 | sip.msg_body contains "m=audio" |
找媒体协商消息 |
| 异常包 | sip.Status-Code >= 400 |
快速定位错误 |
sip && !icmp 来过滤掉ICMP干扰包。有一次在现网抓包,发现大量ICMP unreachable消息混在SIP流里,差点把我带偏。加上这个过滤,世界清净了。
嗯,这里要注意一点:Wireshark的SIP解析器有时候会抽风,特别是遇到畸形包的时候。如果你发现过滤结果不对劲,先检查一下“Analyze -> Enabled Protocols”里SIP解析器是不是正常开启的。
4.2 SIPp:流量生成器,压力测试的瑞士军刀
SIPp这工具,我用了快十年了。说白了,它就是用来模拟SIP终端和服务器行为的。你想模拟1000个用户同时注册?想模拟呼叫风暴?SIPp都能干。
它的核心玩法是写XML场景文件。我给你看一个最简单的UAC(用户代理客户端)注册场景:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">
<scenario name="Basic REGISTER">
<send retrans="500">
<![CDATA[
REGISTER sip:[remote_ip] SIP/2.0
Via: SIP/2.0/[transport] [local_ip]:[local_port]
From: <sip:[service]@[remote_ip]>;tag=[call_number]
To: <sip:[service]@[remote_ip]>
Call-ID: [call_id]
CSeq: 1 REGISTER
Contact: <sip:[service]@[local_ip]:[local_port]>
Max-Forwards: 70
Content-Length: 0
]]>
</send>
<recv response="200">
</recv>
</scenario>
你看,这个场景文件定义了:先发一个REGISTER,然后等200 OK。就这么简单。但实际项目中,场景要复杂得多。我曾经帮一个运营商做IMS核心网的压力测试,写了整整2000行的XML场景,模拟了注册、呼叫、转接、会议等十几个流程。
-sf:指定场景文件(XML)-r:每秒发多少请求(速率控制)-rp:速率周期(毫秒)-m:总共发多少个呼叫-l:最大并发连接数-i:本地IP地址-p:本地端口
-l 参数,结果SIPp默认的并发限制是1。你想想看,我明明设了每秒100个呼叫,但实际只有一个在跑,白白浪费了半天时间。所以,-l 一定要根据你的测试目标来设。
4.3 SipProxy:消息篡改,红队攻击的“手术刀”
Wireshark只能看,SIPp只能造。但红队攻击中,我们经常需要改消息。比如,把REGISTER里的From头域改成别人的号码,或者把SDP里的IP地址指向一个恶意服务器。这时候,SipProxy就派上用场了。
SipProxy本质上是一个中间人代理。它接收SIP消息,你可以用Lua脚本对消息进行任意修改,然后再转发出去。我画了一张图,帮你理解它的工作流程:
它的配置也很简单。我常用的启动命令是这样的:
sipproxy -l 0.0.0.0:5060 -r 192.168.1.100:5060 -s modify.lua
这个命令的意思是:监听本地5060端口,把所有收到的SIP消息转发到192.168.1.100:5060,并且在转发之前执行modify.lua脚本进行篡改。
那Lua脚本怎么写呢?我给你看一个经典的例子——篡改From头域,实现呼叫ID欺骗:
-- modify.lua
function sip_message(msg)
-- 打印原始消息
print("原始消息: " .. msg)
-- 替换From头域中的用户名为"hacker"
msg = msg:gsub("From:
4.4 三件套的协同作战
这三个工具,单独用各有千秋,但组合起来才是王炸。我一般的工作流是这样的:
- 先用Wireshark抓包分析:搞清楚目标IMS网络的SIP消息格式、认证方式、呼叫流程。
- 再用SIPp生成测试流量:模拟正常用户行为,验证分析结果,同时给后续的篡改测试打基础。
- 最后用SipProxy进行篡改攻击:在真实流量中插入恶意修改,测试IMS核心的防御能力。
举个例子。有一次,我发现某个IMS核心网在处理REGISTER消息时,没有严格校验Authorization头域中的nonce值。于是我用SIPp生成了大量REGISTER请求,通过SipProxy把nonce改成固定值“123456”。结果呢?核心网照单全收,直接返回了200 OK。这意味着什么?——攻击者可以重放认证请求,实现非法注册。
好了,这一章的内容就这些。Wireshark让你看得清,SIPp让你造得出,SipProxy让你改得动。这三样东西吃透了,IMS信令层面的攻击手法,你基本就掌握了一大半。