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脚本对消息进行任意修改,然后再转发出去。我画了一张图,帮你理解它的工作流程:

UAC (攻击者) SipProxy (篡改点) UAS (IMS核心) REGISTER (原始) REGISTER (篡改后) 200 OK 200 OK 图:SipProxy中间人攻击流程 攻击者在UAC和IMS核心之间插入代理,实时篡改SIP消息

它的配置也很简单。我常用的启动命令是这样的:

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: 
实战场景: 我在一次红队演练中,用SipProxy篡改了REGISTER消息的Contact头域。原本Contact里是用户终端的IP,我改成了一个恶意SIP服务器。结果所有后续的呼叫请求都被重定向到了我的服务器上。你想想看,这意味着什么?——完全的控制权。

4.4 三件套的协同作战

这三个工具,单独用各有千秋,但组合起来才是王炸。我一般的工作流是这样的:

  1. 先用Wireshark抓包分析:搞清楚目标IMS网络的SIP消息格式、认证方式、呼叫流程。
  2. 再用SIPp生成测试流量:模拟正常用户行为,验证分析结果,同时给后续的篡改测试打基础。
  3. 最后用SipProxy进行篡改攻击:在真实流量中插入恶意修改,测试IMS核心的防御能力。

举个例子。有一次,我发现某个IMS核心网在处理REGISTER消息时,没有严格校验Authorization头域中的nonce值。于是我用SIPp生成了大量REGISTER请求,通过SipProxy把nonce改成固定值“123456”。结果呢?核心网照单全收,直接返回了200 OK。这意味着什么?——攻击者可以重放认证请求,实现非法注册。

重要提醒: 这些工具在红队手里是利器,但千万别在未经授权的网络上乱搞。我见过有人因为用SIPp压测把运营商的S-CSCU打挂了,最后被请去喝茶。记住,技术无罪,但使用技术的人要有底线。

好了,这一章的内容就这些。Wireshark让你看得清,SIPp让你造得出,SipProxy让你改得动。这三样东西吃透了,IMS信令层面的攻击手法,你基本就掌握了一大半。


专注资料整理

专注资料整理