尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SIPVicious实战:VoIP安全测试工具详解与SIP协议评估

SIPVicious实战:VoIP安全测试工具详解与SIP协议评估 1. 从零理解SIPVicious与VoIP安全测试1.1 这个工具到底能做什么SIPVicious是一套用Python编写的SIP协议安全评估工具集最早由Sandro Gauci在2007年前后发布至今仍是VoIP安全测试领域最常被引用的开源工具之一。它的核心能力围绕SIP协议展开扫描网段内活跃的SIP服务、枚举分机账号、对认证机制做字典测试、抓取并解析SIP通话信令、以及生成测试用的SIP消息流量。整套工具由几个独立脚本组成每个脚本负责一个具体环节组合起来就能覆盖VoIP安全评估的主要流程。我第一次接触这套工具是在一个企业语音网关的评估项目里。当时客户用的是基于SIP的IP-PBX系统内网有几百个分机。传统端口扫描只能告诉我哪些IP开了5060端口但完全不知道这些服务背后是什么设备、支持哪些方法、有没有弱口令。SIPVicious正好填补了这个空白——它能直接和SIP服务对话把设备的响应解析成可读信息。需要明确一点这套工具的设计定位是安全评估和教学研究不是破坏性工具。它不会自动利用漏洞也不会绕过认证直接窃听通话。它的价值在于帮你快速摸清一个SIP环境的暴露面发现配置层面的问题比如分机号可枚举、认证策略过于宽松、明文传输信令等。1.2 适合哪些人上手如果你正在学习渗透测试尤其是想往VoIP方向深入SIPVicious是一个很好的切入点。它不像Metasploit那样庞大代码量不大你可以直接读源码理解每个请求是怎么构造的。对于运维人员来说了解这套工具也有实际意义——你能从攻击者视角看到自己的SIP环境暴露了什么从而有针对性地加固。但我不建议完全没有网络基础的人直接上手。你至少需要理解IP、端口、UDP/TCP的基本概念知道什么是请求-响应模型。如果之前用过Nmap做端口扫描那理解SIPVicious的工作方式会顺畅很多。另外SIP协议本身有一些独特的概念比如事务、对话、注册、邀请这些在测试过程中会反复出现建议提前花半小时看一下RFC 3261的前几章不用全懂但至少知道INVITE、REGISTER、OPTIONS这几个方法大概是干什么的。1.3 测试环境的搭建思路Kali Linux是运行这套工具最省事的选择因为SIPVicious已经预装在Kali的软件源里。如果你用的是其他发行版pip install sipvicious也能装上但Kali的好处是依赖关系都处理好了省去不少折腾。测试环境我建议分两层一层是纯实验环境用虚拟机搭一个SIP服务器Asterisk或FreeSWITCH都行自己创建几个分机随便设一些简单密码用来熟悉工具的各种参数和输出格式另一层是授权测试环境也就是客户或自己单位的生产网络这时候每一步操作都要谨慎因为扫描流量可能触发IDS告警枚举行为可能被日志记录。注意在任何非自己完全掌控的环境中使用SIPVicious之前必须获得书面授权。未经授权的SIP扫描在很多地区可能涉及法律问题这不是技术问题是底线问题。实验环境的具体搭建方式用VirtualBox或VMware开两台虚拟机一台装Kali作为测试机一台装Asterisk作为靶机。网络模式选Host-Only或内部网络确保流量不出宿主机。Asterisk的安装用apt install asterisk就行装完后编辑/etc/asterisk/sip.conf加几个分机账号比如1001到1010密码设成123456这种弱口令方便后续测试枚举和认证。这个环境搭一次大概二十分钟但后面反复练习都靠它很值得。2. 核心工具拆解与参数详解2.1 svmapSIP服务发现的第一步svmap的作用是扫描指定网段内响应SIP请求的主机。它的原理很简单向目标IP的5060端口SIP默认端口发送一个OPTIONS请求如果对方是SIP服务且配置为响应OPTIONS就会返回200 OK或类似的状态码。svmap收到响应后把IP、端口、User-Agent等信息打印出来。基本用法svmap 192.168.1.0/24这条命令会扫描整个C类网段。实测下来扫描254个地址大概需要几十秒取决于网络延迟和超时设置。如果目标不响应svmap会等默认超时时间通常是几秒所以扫描大网段时建议调整参数。几个关键参数-p指定端口范围比如-p 5060-5070因为有些设备会把SIP服务开在非标准端口上。-t设置超时时间单位是秒。内网环境可以设短一点比如-t 1加快扫描速度。-v显示详细信息包括发送的请求和收到的响应原文调试时很有用。--randomize随机化扫描顺序避免被简单的速率检测发现。我通常先用svmap -p 5060 -t 1 -v 192.168.1.0/24快速扫一遍看看有哪些设备响应。如果发现某个IP的User-Agent显示是Asterisk或FreeSWITCH那基本可以确定是IP-PBX后续重点就放在这个IP上。实操心得有些SIP设备默认不响应OPTIONS请求或者只响应特定来源的请求。如果svmap扫不到任何结果不代表网段里没有SIP服务。可以试试用-m INVITE改用INVITE方法扫描或者用Nmap的sip-methods脚本交叉验证。2.2 svwar分机枚举的核心逻辑svwar是整套工具里我用得最多的一个。它的目标是猜出SIP服务器上存在的分机号。原理是向服务器发送REGISTER请求如果分机号存在但密码错误服务器会返回401 Unauthorized或407 Proxy Authentication Required如果分机号不存在服务器通常返回404 Not Found。通过区分这两种响应就能判断哪些分机号是有效的。基本用法svwar -e1000-2000 192.168.1.100这条命令会枚举1000到2000之间的分机号。-e参数指定枚举范围支持多种格式-e1000-2000是连续范围-e1000,1001,1002是离散列表也可以从文件读取。关键参数-m REGISTER指定使用的方法默认就是REGISTER但有些服务器对INVITE的响应差异更明显可以切换试试。-d指定域也就是SIP请求中的From域。有些服务器根据域来判断分机归属不指定的话可能所有请求都返回404。-t超时时间内网可以设短。--force强制继续即使收到异常响应也不中断。实测中我发现一个细节不同服务器对不存在分机的响应差异很大。Asterisk通常返回404但有些设备返回403或480。svwar的判断逻辑是基于响应码的如果服务器返回的码不在它的预期范围内可能会漏报。这时候需要用-v看原始响应手动分析。注意枚举分机号会产生大量REGISTER请求在 production 环境里很容易触发安全设备的告警。建议在授权测试时控制速率svwar本身没有内置限速参数但可以通过缩小枚举范围或分批执行来降低影响。2.3 svcrack认证测试的边界与策略svcrack用来对已知存在的分机号做密码测试。它向服务器发送带认证信息的REGISTER请求根据响应判断密码是否正确。如果返回200 OK说明密码对了如果返回401或407说明密码错了。基本用法svcrack -u1001 -d字典文件.txt 192.168.1.100-u指定用户名分机号-d指定字典文件。svcrack会逐行读取字典构造认证请求。关键参数-r指定认证用户名有些服务器要求认证用户名和分机号不同。-e指定密码枚举范围比如-e1000-9999适合测试纯数字密码。--maximum-length限制密码最大长度避免生成过大的字典。这里必须说清楚一个边界svcrack做的是在线密码测试每尝试一个密码就会向服务器发一个请求。如果字典很大比如几万条不仅耗时很长还会在服务器日志里留下大量失败记录。在实际评估中我通常只用一个小规模的针对性字典比如常见弱口令前100个加上客户提供的密码策略推测出的候选。如果100个都试不出来就停止转而从其他角度找问题而不是暴力穷举。实操心得很多IP-PBX的默认分机密码就是分机号本身或者1234、0000这类。测试时先把这些放在字典最前面。另外有些服务器对同一账号的失败尝试有锁定策略连续失败几次就临时封禁这时候svcrack会收到403或480需要暂停一段时间再继续。2.4 svreport与svcrash辅助工具的用途svreport用来把svmap、svwar、svcrack的输出整理成报告支持XML、PDF等格式。实际使用中我很少用它生成最终报告因为格式比较固定不如自己整理。但它的会话管理功能有用——可以把多次扫描的结果合并到一个会话文件里方便后续分析。svcrash是一个比较特殊的工具它针对的是特定版本的SIP服务器漏洞通过发送畸形请求导致服务崩溃。这个工具我在授权测试中从未使用过因为它属于破坏性操作可能造成服务中断。了解它的存在有助于理解SIP协议实现的脆弱性但不建议在实际环境中运行。3. 完整测试流程与实操记录3.1 实验环境搭建与验证先说一下我的实验环境配置Kali Linux 2024.1作为测试机IP是192.168.56.10Asterisk 18跑在另一台虚拟机上IP是192.168.56.20。两台机器都在Host-Only网络里互不干扰外部。Asterisk的配置很简单编辑/etc/asterisk/sip.conf在文件末尾加上[1001] typefriend secret123456 hostdynamic contextinternal [1002] typefriend secretpassword hostdynamic contextinternal [1003] typefriend secret1003 hostdynamic contextinternal这里故意设了三种密码纯数字弱口令、常见单词、分机号本身。保存后重启Asterisk服务systemctl restart asterisk。然后用asterisk -rx sip show peers确认分机已加载。在Kali这边先确认SIPVicious已安装svmap --help能正常输出就说明没问题。如果提示命令找不到用apt install sipvicious装一下。3.2 服务发现与信息收集第一步用svmap扫描实验网段svmap -p 5060 -t 1 -v 192.168.56.0/24输出大概是这样| SIP Device | User Agent | Fingerprint | |--------------------|---------------------|-----------------| | 192.168.56.20:5060 | Asterisk PBX 18.10.0| disabled |这里能看到Asterisk的版本信息这个信息本身就很有价值——如果版本较老可能存在已知问题。User-Agent字段是服务器主动暴露的很多管理员不会去改测试时可以直接拿来判断设备类型。如果扫不到试试加-m INVITEsvmap -p 5060 -t 1 -m INVITE 192.168.56.0/24INVITE请求通常会得到100 Trying或401响应比OPTIONS更容易触发回应。3.3 分机枚举实战确认目标后用svwar枚举分机svwar -e1000-1010 -v 192.168.56.20输出会逐行显示每个分机号的状态1000: 404 Not Found 1001: 401 Unauthorized 1002: 401 Unauthorized 1003: 401 Unauthorized 1004: 404 Not Found ...401说明分机存在但需要认证404说明不存在。这样就能确定1001、1002、1003是有效分机。如果服务器返回的码不是401/404比如全部返回403可能需要指定域svwar -e1000-1010 -d 192.168.56.20 192.168.56.20-d参数告诉svwar在From头里填什么域有些服务器根据这个来判断请求是否合法。实操心得枚举范围不要一上来就设太大。先用小范围比如1000-1010确认工具能正常工作再逐步扩大。另外如果服务器响应很慢把-t设成2或3避免误判。3.4 认证测试与结果分析已知1001、1002、1003存在接下来测试密码。先准备一个小字典cat passwords.txt EOF 123456 password 1001 1002 1003 admin 0000 1234 EOF然后对1001测试svcrack -u1001 -d passwords.txt 192.168.56.20输出会显示每个密码的尝试结果。如果看到1001: 200 OK说明密码对了。实测下来1001的密码123456在第一行就被命中1002的password在第二行命中1003的1003在第三行命中。这里有个细节svcrack默认会对每个密码发送一次REGISTER请求如果服务器有速率限制可能会返回503或480。遇到这种情况可以加--delay参数如果版本支持或者在脚本层面控制节奏。3.5 流量抓取与信令分析除了主动扫描SIPVicious还提供了svcapture工具用来抓取SIP流量。不过在实际测试中我更多用tcpdump或Wireshark来抓包因为SIPVicious的抓包功能比较基础。在Kali上抓取SIP流量tcpdump -i eth0 -w sip.pcap port 5060然后用Wireshark打开sip.pcap可以看到完整的SIP信令交互。重点看几个地方REGISTER请求里的Authorization头看认证方式是MD5还是其他INVITE请求里的SDP内容看媒体传输用的什么编码、是否加密响应码的分布看有没有异常。如果抓到了INVITE和200 OK的交互还能从SDP里提取出RTP流的端口和编码信息。虽然SIPVicious本身不处理RTP但结合Wireshark的RTP分析功能可以进一步评估媒体传输的安全性。4. 常见问题与排查技巧实录4.1 扫描无响应怎么办这是最常见的问题。svmap发出去请求但收不到任何响应。可能的原因和排查步骤第一确认目标端口是否真的开放。用Nmap扫一下nmap -sU -p 5060 192.168.56.20。如果Nmap显示open|filtered说明UDP端口可能开放但被过滤或者服务不响应空包。第二确认SIP服务是否配置为响应OPTIONS。有些管理员为了减少暴露面禁用了OPTIONS响应。这时候改用INVITE方法扫描。第三检查防火墙规则。有些防火墙会丢弃来自非信任源的SIP请求。如果是这种情况需要从更接近目标的网络位置发起扫描。第四确认SIPVicious的版本和Python环境。老版本可能不兼容Python 3用pip show sipvicious看一下版本必要时升级。4.2 枚举结果不准确的分析svwar有时会把存在的分机报成不存在或者反过来。常见原因服务器对不存在分机的响应码不是404。比如有些设备返回403 Forbiddensvwar默认不把这个当作“不存在”的信号可能会误判。解决办法是用-v看原始响应手动确认响应码的含义。服务器有防枚举机制。连续发送大量REGISTER请求后服务器可能开始返回统一响应比如全部返回401这时候枚举就失效了。需要降低速率或者换一个时间窗口再试。域配置错误。如果From头里的域和服务器期望的不一致所有请求都可能返回404。用-d参数指定正确的域。4.3 认证测试被锁定的应对很多SIP服务器有账号锁定策略连续失败N次后临时封禁该账号。svcrack如果遇到这种情况会收到403或480响应。应对方法控制测试频率。svcrack本身没有内置延迟参数但可以通过分批执行来降低速率。比如先测10个密码停几分钟再测下一批。使用更精准的字典。与其用几万条的通用字典不如根据目标的信息定制。比如知道分机号是1001密码可能是1001、1001年份、公司名1001等。精准字典的命中率往往比大字典高而且产生的失败记录少。如果账号已被锁定等待锁定时间过去通常是几分钟到几十分钟或者联系管理员解锁。在授权测试中提前和客户确认锁定策略避免影响正常业务。4.4 常见问题速查表问题现象可能原因排查方法解决思路svmap无输出目标不响应OPTIONS用Nmap确认端口状态改用INVITE方法扫描svwar全部返回404域配置错误用-v看原始请求加-d参数指定域svcrack全部返回401密码字典不含正确密码检查字典内容换用针对性字典扫描速度极慢超时时间过长检查-t参数内网设-t 1收到503响应服务器限速观察响应分布降低扫描速率枚举结果不稳定防枚举机制重复扫描对比分批扫描间隔执行4.5 几个容易踩的坑第一个坑在Kali里直接用svmap 192.168.1.0/24而不指定端口。默认端口是5060但如果目标用的是其他端口就扫不到。养成习惯先确认端口。第二个坑svwar的枚举范围写错。-e1000-2000和-e 1000-2000效果一样但-e1000,2000是枚举1000和2000两个号不是范围。这个语法容易混淆用之前先--help确认。第三个坑忽略SIP响应的细节。比如401和407的区别401是用户认证407是代理认证。有些服务器用407svcrack需要相应调整参数。看响应码的时候要仔细。第四个坑在虚拟机里跑扫描网络模式选错。NAT模式下虚拟机和外部网络之间有地址转换SIP请求里的Contact头可能填的是内网地址导致响应回不来。用Host-Only或桥接模式更稳妥。4.6 从测试到加固的闭环做完测试不是终点把发现的问题转化为加固措施才有价值。根据我的经验SIP环境最常见的几个问题和对策分机号可枚举。对策是配置服务器对不存在分机的请求返回统一的响应码和延迟增加枚举难度。有些IP-PBX支持“始终返回401”的选项即使分机不存在也返回401这样枚举就失效了。弱口令。对策是强制密码复杂度禁用分机号作为密码定期更换。对于管理员账号启用双因素认证。明文传输。SIP默认走UDP 5060信令是明文的。对策是启用TLS加密SIP信令SIPS媒体流用SRTP加密。这需要在服务器和客户端都配置证书工作量不小但对于安全要求高的环境是必要的。信息泄露。User-Agent暴露了服务器版本。对策是修改User-Agent为通用值或者关闭不必要的响应头。实操心得加固之后一定要复测。我见过不少案例管理员改了配置但没验证结果枚举工具换一种方法还是能扫出来。复测时用同样的工具和参数确认之前的问题确实修复了。5. 工具进阶与扩展思路5.1 自定义字典的生成策略svcrack的效果很大程度上取决于字典质量。通用字典比如rockyou.txt有上千万条但在SIP场景下命中率并不高因为SIP分机密码往往有特定模式。根据我的经验有效的字典应该包含分机号本身、分机号加简单后缀如1001a、1001!、常见数字组合1234、0000、8888、公司相关词汇公司名缩写数字、年份组合2023、2024。把这些模式用脚本生成通常几百到几千条就够了。用Python生成一个针对性字典的示例import itertools extensions [1001, 1002, 1003] suffixes [, a, !, 123, 2024] common [123456, password, admin, 0000, 1111] with open(custom_dict.txt, w) as f: for ext in extensions: for suf in suffixes: f.write(ext suf \n) for c in common: f.write(c \n)这个字典只有几十条但在实验环境里命中率很高。5.2 结合其他工具形成完整链路SIPVicious只是VoIP安全测试的一个环节。完整的评估还需要Nmap做端口和服务发现确认SIP服务的版本和开放端口。Wireshark做流量分析解析SIP和RTP的交互细节。SIPp做压力测试和协议模糊测试验证服务器的健壮性。Metasploit里也有一些SIP相关的辅助模块可以用来做更深入的测试。把这些工具串起来形成“发现-枚举-测试-分析-验证”的完整链路比单独用某一个工具更有价值。5.3 自动化脚本的编写思路如果经常做SIP评估可以把重复性的步骤写成脚本。比如一个简单的bash脚本自动完成svmap扫描、svwar枚举、svcrack测试、结果汇总#!/bin/bash TARGET$1 RANGE$2 echo [*] Scanning $TARGET... svmap -p 5060 -t 1 $TARGET echo [*] Enumerating extensions $RANGE... svwar -e$RANGE $TARGET enum_result.txt echo [*] Extracting valid extensions... grep 401 enum_result.txt | cut -d: -f1 valid_ext.txt echo [*] Testing passwords... while read ext; do svcrack -u$ext -d passwords.txt $TARGET done valid_ext.txt这个脚本很粗糙但展示了自动化的基本思路。实际使用时需要加错误处理、日志记录、速率控制等。5.4 学习路径与资源建议想深入VoIP安全光会用SIPVicious不够。建议的学习路径先理解SIP协议本身RFC 3261是必读的至少把基本方法和响应码搞清楚。然后学习RTP和SRTP理解媒体传输的安全问题。接着研究常见的VoIP攻击手法比如注册劫持、通话窃听、 toll fraud等。最后动手搭建各种实验环境Asterisk、FreeSWITCH、Kamailio都试试不同实现的响应行为有差异。资源方面SIPVicious的GitHub仓库里有源码和文档读一遍能理解工具的设计思路。VoIP安全相关的书籍不多但一些安全会议的议题材料很有价值。另外自己搭环境做实验是最有效的学习方式比看资料强。我个人在实际操作中的体会是SIPVicious这类工具的价值不在于“攻破”什么而在于帮你建立对SIP协议和安全边界的直观认识。你用它扫一遍自己的实验环境看到那些401、404响应再对照RFC理解服务器为什么这么回应这个过程本身就是最好的学习。工具会过时协议会更新但这种从协议层面理解安全问题的能力是长期有用的。
返回列表