Pentesting VoIP
最后更新于
最后更新于
要开始学习VoIP的工作原理,请查看:
红队可以执行的首要步骤之一是使用OSINT工具、Google搜索或网页抓取搜索可用电话号码以联系公司。
一旦获得电话号码,您可以使用在线服务来识别运营商:
了解运营商是否提供VoIP服务,您可以确定公司是否在使用VoIP...此外,公司可能没有雇用VoIP服务,而是使用PSTN卡将其VoIP PBX连接到传统电话网络。
诸如自动响应或音乐通常表明正在使用VoIP。
任何其他有助于识别正在使用的VoIP软件的OSINT枚举对红队都是有帮助的。
nmap
能够扫描UDP服务,但由于扫描的UDP服务数量较多,速度很慢,并且可能对这种类型的服务不太准确。
svmap
来自SIPVicious (sudo apt install sipvicious
):将定位指定网络中的SIP服务。
svmap
易于阻止,因为它使用User-Agent friendly-scanner
,但您可以修改/usr/share/sipvicious/sipvicious
中的代码并进行更改。
sipscan.py
来自sippts: Sipscan 是一个非常快速的用于扫描 UDP、TCP 或 TLS 上的 SIP 服务的扫描器。它使用多线程,可以扫描大范围的网络。它允许轻松指定端口范围,扫描 TCP 和 UDP,使用另一种方法(默认情况下将使用 OPTIONS)并指定不同的用户代理(等等)。
metasploit:
PBX也可能会暴露其他网络服务,例如:
69/UDP (TFTP):固件更新
80 (HTTP) / 443 (HTTPS):通过Web管理设备
389 (LDAP):用于存储用户信息的替代方法
3306 (MySQL):MySQL数据库
5038 (Manager):允许从其他平台使用Asterisk
5222 (XMPP):使用Jabber发送消息
5432 (PostgreSQL):PostgreSQL数据库
以及其他...
可以使用sippts中的sipenumerate.py
来查找PBX中可用的方法。
在 PBX(私有分支交换)系统中,分机是指分配给组织或企业内部电话线、设备或用户的独特内部标识符。分机使得可以在组织内部有效地路由电话,而无需为每个用户或设备分配单独的外部电话号码。
svwar
来自 SIPVicious(sudo apt install sipvicious
):svwar
是一个免费的 SIP PBX 分机扫描工具。在概念上,它类似于传统的拨号扫描器,通过猜测一系列分机或给定的分机列表来工作。
sipextend.py
来自sippts: Sipextend 可以识别 SIP 服务器上的分机。Sipextend 可以检查大型网络和端口范围。
metasploit: 您还可以使用metasploit枚举扩展名/用户名:
enumiax
(apt install enumiax
): enumIAX 是一种用于 Inter Asterisk Exchange 协议的用户名暴力破解枚举器。enumIAX 可以以两种不同的模式运行;顺序用户名猜测或字典攻击。
在发现了 PBX 和一些 分机号/用户名 后,红队可以尝试使用常见密码字典对一个分机号进行 REGISTER
方法认证,以进行身份验证的暴力破解。
请注意,用户名 可能与分机号相同,但这种做法可能会因 PBX 系统、其配置和组织偏好而有所不同...
如果用户名与分机号不同,您将需要 找出用户名以进行暴力破解。
svcrack
来自 SIPVicious (sudo apt install sipvicious
):SVCrack 允许您对 PBX 上特定用户名/分机号的密码进行破解。
sipcrack.py
来自 sippts: SIP Digest Crack 是一个用于破解 SIP 协议中摘要认证的工具。
Metasploit:
如果你在开放的无线网络中发现 VoIP 设备,你可以抓取所有信息。此外,如果你在一个更封闭的网络中(通过以太网连接或受保护的 Wifi 连接),你可以执行中间人攻击,比如ARP欺骗在PBX和网关之间以便抓取信息。
在网络信息中,你可以找到用于管理设备的web凭据,用户分机,用户名,IP地址,甚至哈希密码和RTP数据包,你可以重现这些数据包以听取对话,等等。
要获取这些信息,你可以使用诸如Wireshark、tcpdump 等工具...但一个专门用于抓取 VoIP 对话的工具是ucsniff。
请注意,如果SIP通信中使用了TLS,你将无法清楚地看到 SIP 通信。 如果使用了SRTP和ZRTP,RTP数据包将不会以明文形式显示。
查看此示例以更好地理解SIP REGISTER通信以了解凭据是如何发送的。
sipdump
和 sipcrack
, 是 sipcrack 的一部分(apt-get install sipcrack
):这些工具可以从 pcap 中提取 SIP 协议中的摘要认证,并对其进行暴力破解。
siptshar.py
, sipdump.py
, sipcrack.py
来自 sippts:
SipTshark 从 PCAP 文件中提取 SIP 协议的数据。
SipDump 从 PCAP 文件中提取 SIP Digest 认证。
SIP Digest Crack 是一个用于破解 SIP 协议中摘要认证的工具。
不仅可以在网络流量中找到SIP凭据,还可以找到用于访问语音信箱的DTMF代码。 可以将这些代码发送在INFO SIP消息中,以音频或者RTP数据包的形式。如果这些代码在RTP数据包中,您可以截取对话的这部分内容,并使用工具multimo来提取它们:
在 Asterisk 中,可以允许来自特定 IP 地址或任何 IP 地址的连接:
如果指定了IP地址,主机不需要定期发送REGISTER请求(在REGISTER数据包中发送的生存时间通常为30分钟,这意味着在其他情况下,电话将需要每30分钟进行一次REGISTER)。但是,它需要打开端口,允许VoIP服务器连接以接听电话。
要定义用户,可以定义为:
type=user
:用户只能作为用户接收呼叫。
type=friend
:可以作为对等体发起呼叫并作为用户接收呼叫(与分机一起使用)。
type=peer
:可以作为对等体发送和接收呼叫(SIP-trunks)。
还可以通过不安全的变量建立信任:
insecure=port
:允许通过IP验证对等连接。
insecure=invite
:不需要对INVITE消息进行身份验证。
insecure=port,invite
:两者都需要。
当使用**type=friend
时,主机变量的值将不会被使用**,因此,如果管理员使用该值错误配置SIP-trunk,任何人都可以连接到它。
例如,此配置将存在漏洞:
host=10.10.10.10
insecure=port,invite
type=friend
在Asterisk中,上下文是拨号计划中的命名容器或部分,将相关的分机、动作和规则分组在一起。拨号计划是Asterisk系统的核心组件,因为它定义了如何处理和路由传入和传出的呼叫。上下文用于组织拨号计划,管理访问控制,并在系统的不同部分之间提供分隔。
每个上下文在配置文件中定义,通常在**extensions.conf
**文件中。上下文由方括号表示,上下文名称在其中。例如:
在上下文中,您定义分机(拨号号码的模式),并将它们与一系列操作或应用程序关联起来。这些操作决定了呼叫的处理方式。例如:
这个示例演示了一个名为"my_context"的简单上下文,其中包含一个分机"100"。当有人拨打100时,通话将被接听,播放欢迎消息,然后通话将被终止。
这是另一个上下文,允许拨打任何其他号码:
如果管理员将默认上下文定义为:
任何人都可以使用服务器拨打任何其他号码(服务器管理员将为通话付费)。
此外,默认情况下,sip.conf
文件包含 allowguest=true
,因此任何未经身份验证的攻击者都可以拨打任何其他号码。
sipinvite.py
来自 sippts: Sipinvite 检查 PBX 服务器是否允许我们在没有身份验证的情况下进行呼叫。如果 SIP 服务器配置不正确,它将允许我们拨打外部号码。它还可以允许我们将通话转接到第二个外部号码。
例如,如果您的 Asterisk 服务器具有错误的上下文配置,您可以接受未经授权的 INVITE 请求。在这种情况下,攻击者可以在不知道任何用户/密码的情况下进行呼叫。
IVRS 代表交互式语音应答系统,是一种电话技术,允许用户通过语音或按键输入与计算机化系统进行交互。IVRS 用于构建自动呼叫处理系统,提供一系列功能,如提供信息、路由呼叫和捕获用户输入。
VoIP 系统中的 IVRS 通常包括:
语音提示:预先录制的音频消息,引导用户浏览 IVR 菜单选项和说明。
DTMF(双音多频)信号:通过在电话上按键生成的按键输入,用于浏览 IVR 菜单并提供输入。
呼叫路由:根据用户输入将呼叫定向到适当的目的地,如特定部门、代理或分机。
用户输入捕获:从呼叫者收集信息,如帐号号码、案例 ID 或任何其他相关数据。
与外部系统集成:将 IVR 系统连接到数据库或其他软件系统,以访问或更新信息、执行操作或触发事件。
在 Asterisk VoIP 系统中,您可以使用拨号计划(extensions.conf
文件)和各种应用程序(如 Background()
、Playback()
、Read()
等)创建 IVR。这些应用程序帮助您播放语音提示、捕获用户输入并控制呼叫流程。
前面是一个示例,用户被要求按1拨打一个部门,按2拨打另一个部门,或者输入完整分机号码(如果知道的话)。 漏洞在于未检查指定的分机号长度,因此用户可以输入完整号码并将被呼叫,而不受5秒超时限制的影响。
使用类似以下的分机号码:
在**${EXTEN}
是将要被呼叫的分机号时,当输入ext 101**时会发生以下情况:
然而,如果 ${EXTEN}
允许输入不仅限于数字(就像在旧版Asterisk中一样),攻击者可以输入 101&SIP123123123
来拨打电话号码123123123。这将是结果:
SIP Digest Leak是一种影响大量SIP电话(包括硬件和软件IP电话以及电话适配器(VoIP到模拟电话))的漏洞。该漏洞允许泄露从密码计算出的Digest认证响应。然后可以进行离线密码攻击,并根据挑战响应恢复大多数密码。
一个IP电话(受害者)正在端口5060上监听,接受电话
攻击者向IP电话发送INVITE
受害者电话开始响铃,有人接听并挂断(因为在另一端没有人接听电话)
当电话挂断时,受害者电话向攻击者发送一个BYE
攻击者发出一个407响应,要求进行身份验证并发出一个身份验证挑战
受害者电话在第二个BYE中提供了对身份验证挑战的响应
攻击者然后可以在本地机器上(或分布式网络等)对挑战响应进行暴力破解攻击,猜测密码
sipdigestleak.py 来自sippts: SipDigestLeak利用了这个漏洞。
点击通话允许一个网页用户(例如可能对某个产品感兴趣)输入他的电话号码以便接到电话。然后会拨打一个商业电话,当他接听电话时,用户将被呼叫并与代理人连接。
一个常见的Asterisk配置文件是:
先前的配置允许任何IP地址连接(如果知道密码)。
要发起呼叫,如先前指定的,不需要读取权限,只需要写入中的发起权限。
有了这些权限,任何知道密码的IP地址都可以连接并提取太多信息,比如:
更多信息或操作可能会被请求。
在Asterisk中,可以使用命令**ChanSpy
指定要监听的分机号码**(或全部分机号码)来窃听正在进行的对话。这个命令需要分配给一个分机号码。
例如,exten => 333,1,ChanSpy('all',qb)
表示如果您拨打分机号码333,它将监听所有分机号码,在新对话开始时(b
)以安静模式(q
)开始收听,因为我们不想在其中进行交互。您可以通过按下***
**或标记分机号码来从一个正在进行的对话切换到另一个。
还可以使用**ExtenSpy
**来仅监视一个分机号码。
除了收听对话外,还可以使用诸如以下分机号码之类的分机号码将它们记录在文件中:
通话将保存在 /tmp
中。
您甚至可以让Asterisk执行一个脚本,在通话关闭时泄漏通话。
RTCPBleed是一个影响基于Asterisk的VoIP服务器的重大安全问题(于2017年发布)。该漏洞允许RTP(实时传输协议)流量,即VoIP通话,被任何互联网上的人拦截和重定向。这是因为当RTP流量通过NAT(网络地址转换)防火墙时,会绕过身份验证。
RTP代理试图解决影响RTC系统的NAT限制,通过在两个或多个方之间代理RTP流。当存在NAT时,RTP代理软件通常无法依赖通过信令(例如SIP)检索的RTP IP和端口信息。因此,许多RTP代理已经实现了一种机制,其中这样的IP和端口元组会被自动学习。通常通过检查传入的RTP流量并将任何传入的RTP流量的源IP和端口标记为应该响应的IP和端口来完成。这种机制,可能被称为“学习模式”,不使用任何形式的身份验证。因此,攻击者可以向RTP代理发送RTP流量,并接收到本应发送给正在进行的RTP流的呼叫方或被叫方的代理RTP流量。我们将此漏洞称为RTP Bleed,因为它允许攻击者接收本应发送给合法用户的RTP媒体流。
RTP代理和RTP堆栈的另一个有趣行为是,有时,即使不容易受到RTP Bleed的影响,它们也会接受、转发和/或处理来自任何源的RTP数据包。因此,攻击者可以发送RTP数据包,这可能使他们能够注入他们的媒体而不是合法的媒体。我们将此攻击称为RTP注入,因为它允许将非法的RTP数据包注入现有的RTP流。这种漏洞可能存在于RTP代理和端点中。
Asterisk和FreePBX传统上使用**NAT=yes
设置**,这会使RTP流量绕过身份验证,可能导致通话中没有音频或单向音频。
有关更多信息,请查看https://www.rtpbleed.com/
rtpbleed.py
来自sippts**:**它检测RTP Bleed漏洞并发送RTP流。
rtcpbleed.py
来自 sippts: 该工具用于检测 RTP 泄漏漏洞,发送 RTP 流。
rtpbleedflood.py
来自 sippts**:**利用 RTP Bleed 漏洞发送 RTP 流
rtpbleedinject.py
来自 sippts: 利用 RTP Bleed 漏洞发送 RTP 流(来自音频文件)
在Asterisk中,如果你设法能够添加分机规则并重新加载它们(例如通过入侵一个存在漏洞的Web管理服务器),就有可能使用**System
**命令获得RCE。
有一个名为**Shell
**的命令,可以在必要时用来执行系统命令,而不是使用System
。
如果服务器在**System
命令中(如在Elastix中)禁止使用某些字符,请检查Web服务器是否允许以某种方式在系统内创建文件**(如在Elastix或trixbox中),然后使用它来创建一个后门脚本,然后使用**System
来执行该脚本**。
sip.conf
-> 包含SIP用户的密码。
如果Asterisk服务器以root身份运行,则可能会危及root权限。
mysql root用户可能没有密码。
这可以用来创建一个新的mysql用户作为后门。
FreePBX
amportal.conf
-> 包含Web面板管理员(FreePBX)的密码。
FreePBX.conf
-> 包含用于访问数据库的用户FreePBXuser的密码。
这可以用来创建一个新的mysql用户作为后门。
Elastix
Elastix.conf
-> 包含明文密码,如mysql root密码,IMAPd密码,web管理员密码。
多个文件夹将属于被入侵的Asterisk用户(如果不是以root身份运行)。该用户可以读取先前的文件并控制配置,因此他可以使Asterisk在执行时加载其他带有后门的二进制文件。
可以使用诸如**rtpinsertsound
(sudo apt install rtpinsertsound
)和rtpmixsound
(sudo apt install rtpmixsound
)等工具在对话中插入.wav
**。
或者您可以使用来自http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/的脚本来扫描对话(rtpscan.pl
),向对话发送.wav
(rtpsend.pl
)并在对话中插入噪音(rtpflood.pl
)。
有几种方法可以尝试在VoIP服务器上实现DoS。
来自sippts的**sipflood.py
:_SipFlood_向目标发送无限数量的消息
python3 sipflood.py -i 10.10.0.10 -r 5080 -m invite -v
IAXFlooder:对Asterisk使用的IAX协议进行DoS
inviteflood:用于在UDP/IP上执行SIP/SDP INVITE消息洪泛的工具。
rtpflood:发送多个格式正确的RTP数据包。需要知道正在使用的RTP端口(先进行嗅探)。
SIPp:允许分析和生成SIP流量。因此也可以用于DoS。
SIPsak:SIP瑞士军刀。也可用于执行SIP攻击。
Fuzzers:protos-sip,voiper。
来自sippts的**sipsend.py
:SIPSend允许我们发送自定义的SIP消息**并分析响应。
来自sippts的**wssend.py
**:WsSend允许我们通过WebSockets发送自定义的SIP消息并分析响应。
安装诸如Asterisk之类的软件的最简单方法是下载已经安装了它的操作系统分发版,例如:FreePBX,Elastix,Trixbox... 这些的问题在于一旦它们运行起来,系统管理员可能不会再更新它们,并且漏洞会随着时间被发现。