3、信息收集与侦察:SIP扫描技术
信息收集,说白了就是渗透测试的「踩点」阶段。你想想看,连目标网络里跑了什么服务都不知道,怎么动手?在IMS网络里,SIP协议就是我们的主战场。我个人习惯,第一步永远是先摸清SIP服务的家底。
这一章,我会带你走一遍我常用的侦察流程。从DNS SRV记录查询,到SIP扫描,再到用户枚举。每一步都有坑,我也会把当年踩过的坑讲给你听。
3.1 DNS SRV记录查询:找到SIP服务器
IMS网络里的SIP服务器,通常不会直接暴露IP。它们靠DNS SRV记录来定位。为什么要查这个?因为SIP客户端(比如你的手机)就是通过SRV记录找到注册服务器和代理服务器的。
我常用的工具有两个:dig 和 nslookup。说实话,我个人更偏爱 dig,输出格式清晰,调试起来方便。
3.1.1 用dig查询SRV记录
命令格式很简单:
dig _sip._udp.example.com SRV
dig _sip._tcp.example.com SRV
dig _sips._tcp.example.com SRV
举个例子,假设目标域是 ims.operator.com:
$ dig _sip._udp.ims.operator.com SRV
; <<>> DiG 9.16.1 <<>> _sip._udp.ims.operator.com SRV
;; ANSWER SECTION:
_sip._udp.ims.operator.com. 3600 IN SRV 10 100 5060 sip1.ims.operator.com.
_sip._udp.ims.operator.com. 3600 IN SRV 20 50 5060 sip2.ims.operator.com.
看到没?这里暴露了两个SIP服务器:sip1 和 sip2,端口都是5060。优先级10的服务器权重100,优先级20的权重50。嗯,这里要注意:优先级数字越小,优先级越高。
3.1.2 用nslookup查询
如果你在Windows环境,或者习惯交互式查询,nslookup 也够用:
nslookup
> set type=srv
> _sip._udp.ims.operator.com
输出结果和 dig 类似,但格式没那么漂亮。我个人还是推荐 dig,尤其是在做批量脚本的时候。
3.2 SIP扫描技术:sipscan与svmap
拿到SIP服务器的IP和端口后,下一步就是扫描。这里有两款神器:sipscan 和 svmap。它们都是专门为SIP协议设计的扫描器,比Nmap的SIP脚本更专业。
3.2.1 sipscan:轻量级SIP扫描器
sipscan 是SiVuS工具包里的一个组件。它支持多种SIP方法扫描,比如OPTIONS、REGISTER、INVITE。我最常用的是OPTIONS扫描,因为它不会在目标服务器上留下注册记录,相对隐蔽。
基本用法:
sipscan -i 192.168.1.100 -p 5060 -m OPTIONS
参数说明:
-i:目标IP地址-p:目标端口(默认5060)-m:SIP方法(OPTIONS、REGISTER、INVITE等)
输出示例:
[+] Sending OPTIONS to 192.168.1.100:5060
[+] Response: SIP/2.0 200 OK
[+] Server: Asterisk PBX 16.8.0
[+] Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY
[+] Supported: replaces, timer
看到 Server: Asterisk PBX 16.8.0 了吗?这就是指纹信息。版本号都暴露了,接下来查CVE就方便了。
--delay 1,每秒发一个包。
3.2.2 svmap:大规模SIP扫描
svmap 是SIPVicious工具包里的扫描器。它擅长扫描整个IP段,适合做资产发现。我个人习惯用它来快速定位目标网络里所有SIP服务。
基本用法:
svmap 192.168.1.0/24 -p 5060
输出示例:
[+] 192.168.1.100:5060 - SIP service (Asterisk PBX 16.8.0)
[+] 192.168.1.105:5060 - SIP service (FreeSWITCH 1.10.5)
[+] 192.168.1.110:5060 - SIP service (Cisco CallManager 12.5)
你看,一个C段扫下来,三个SIP服务全暴露了。而且版本信息一目了然。这就是信息收集的价值。
3.3 OPTIONS探测:摸清服务器底细
OPTIONS请求是SIP协议里最无害的方法。它不会改变服务器状态,只是询问服务器支持哪些功能。但对我们来说,它暴露的信息太多了。
一个标准的OPTIONS请求长这样:
OPTIONS sip:192.168.1.100 SIP/2.0
Via: SIP/2.0/UDP 10.0.0.1:5060;branch=z9hG4bK123456
From: <sip:test@10.0.0.1>;tag=12345
To: <sip:192.168.1.100>
Call-ID: 1234567890@10.0.0.1
CSeq: 1 OPTIONS
Contact: <sip:test@10.0.0.1>
Max-Forwards: 70
Content-Length: 0
服务器返回的200 OK响应里,通常会包含:
- Server头:服务器类型和版本
- Allow头:支持哪些SIP方法
- Supported头:支持哪些扩展
- Accept头:支持哪些内容类型
举个例子,我曾经在某个项目中,通过OPTIONS响应发现目标服务器支持 SUBSCRIBE 和 NOTIFY 方法。这意味着我可以尝试订阅事件,比如监听用户状态变化。嗯,这为后续攻击打开了新思路。
3.4 用户枚举:REGISTER/INVITE响应分析
用户枚举,说白了就是猜出目标网络里有哪些合法的SIP账号。为什么重要?因为有了用户名,下一步就是暴力破解密码。你想想看,如果连用户名都不知道,怎么登录?
常用的枚举方法有两种:REGISTER请求和INVITE请求。
3.4.1 基于REGISTER的枚举
REGISTER请求用于用户注册。当我们发送一个REGISTER请求时,服务器会返回不同的状态码,取决于用户是否存在:
| 响应码 | 含义 | 用户是否存在 |
|---|---|---|
| 200 OK | 注册成功(但需要认证) | 存在 |
| 401 Unauthorized | 需要认证(用户存在) | 存在 |
| 403 Forbidden | 禁止注册(用户存在) | 存在 |
| 404 Not Found | 用户不存在 | 不存在 |
举个例子,我发送REGISTER请求给 sip:1000@ims.operator.com:
REGISTER sip:ims.operator.com SIP/2.0
From: <sip:1000@ims.operator.com>;tag=12345
To: <sip:1000@ims.operator.com>
Call-ID: 1234567890@10.0.0.1
CSeq: 1 REGISTER
Contact: <sip:1000@10.0.0.1>
Max-Forwards: 70
Content-Length: 0
如果返回401 Unauthorized,说明用户 1000 存在。如果返回404 Not Found,说明不存在。就这么简单。
3.4.2 基于INVITE的枚举
INVITE请求用于发起呼叫。它的响应码也能暴露用户是否存在:
| 响应码 | 含义 | 用户是否存在 |
|---|---|---|
| 180 Ringing | 用户振铃(存在且在线) | 存在 |
| 200 OK | 用户接听(存在且在线) | 存在 |
| 486 Busy Here | 用户忙(存在) | 存在 |
| 404 Not Found | 用户不存在 | 不存在 |
| 603 Decline | 用户拒绝(存在) | 存在 |
INVITE枚举的优点是,即使服务器对REGISTER做了反枚举,INVITE的响应通常不会做特殊处理。但缺点也很明显:如果用户在线,INVITE请求会真的让用户手机响铃。嗯,这就不太隐蔽了。
3.5 知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张流程图:
这张图展示了完整的侦察链路。从DNS查询开始,到SIP扫描,再到OPTIONS探测,最后是用户枚举。每一步都环环相扣,缺一不可。
好了,这一章的内容就到这里。信息收集是渗透测试的基石,地基打不牢,后面全是白费功夫。下一章我们会深入SIP认证机制,看看怎么绕过那些看似安全的认证方案。