Paweł Pokrywka

Freeconet: Przechwytywanie połączeń VoIP

Data publikacji: 11.01.2011

Aktualizacja

Zarząd Freeconet wydał dnia 12.01.2011 oficjalne oświadczenie w sprawie podatności opisanej w tym artykule.

Reakcja właścicieli platformy była natychmiastowa, bo już w dniu publikacji artykułu funkcja Dodaj operatora zewnętrznego została zablokowana.

Aktualizacja 2

Dnia 18.01.2011 otrzymałem informację, że podatność znana była już wcześniej, tj. w lipcu 2008 roku. Zagrożenie zostało odkryte przez Józefa i opisane w tym wątku na forum Freeconet.

Wstęp

Freeconet to platforma VoIP udostępniająca swoim użytkownikom szereg usług związanych z telefonią internetową.
Pod koniec września 2010 roku odkryłem podatność, której wykorzystanie umożliwia napastnikowi przechwytywanie rozmów użytkowników Freeconet dzwoniących pod wybrane przez atakującego numery telefoniczne. Atakujący posiada pełną kontrolę nad rozmowami: może je przerywać, nagrywać, włączać się do rozmowy i wpływać na ich przebieg w dowolny inny sposób. W celu demonstracji części możliwych ataków powstało narzędzie VOIPROX.

Niezwłocznie po wykryciu podatności przekazałem szczegółowe informacje jej dotyczące właścicielowi platformy. Niestety, mimo zapewnień ze strony Freeconet podatność nie została usunięta. Z tego powodu zdecydowałem się opublikować pełne informacje o podatności. Wierzę, że magia Full Disclosure zadziała, podatność zostanie usunięta i już niedługo użytkownicy Freeconet staną się bezpieczni.

Uważam jednak, że po usunięciu podatności należy domagać się od właściciela platformy dokładnego zbadania, czy w przeszłości tego typu nadużycia miały miejsce. Jeśli tak, to powinny zostać o nich powiadomione zainteresowane osoby oraz – w razie konieczności – także organy ścigania.
Aby taka kontrola była wiarygodna powinna zostać przeprowadzona przez zewnętrzny, zaufany podmiot, np. przez Urząd Komunikacji Elektronicznej.

Zależy mi na tym także dlatego, że osobiście korzystam z tej, skądinąd innowacyjnej i chyba najbardziej zaawansowanej technologicznie platformy VoIP w Polsce.

Podatność

Platforma oferuje funkcję przypisywania do konta VoIP dodatkowych numerów telefonicznych nie należących do Freeconet, tylko do innych, zewnętrznych operatorów. Założeniem jest zwiększenie komfortu użytkowników przy jednoczesnym zmniejszeniu opłat za połączenia.

Załóżmy, że osoby A i B są zarejestrowanymi użytkownikami platformy Freeconet. Osoba A posiada również numer telefonu u operatora tradycyjnego i może skojarzyć go ze swoim kontem. Jeśli osoba B wybierze ten numer to platforma zestawi połączenie wewnątrz sieci i odbędzie się ono bezpłatnie. Gdyby numer nie został zarejestrowany, to zestawienie połączenia odbyłoby się z wykorzystaniem telefonii tradycyjnej i pociągnęłoby za sobą opłaty dla osoby B.

Należy zwrócić uwagę, że u osoby A dzwonić będzie terminal VoIP, a nie telefon podpięty do linii tradycyjnej. Ten problem rozwiązuje się przez wykorzystanie hybrydowej bramki lub telefonu VoIP. Do tego typu urządzenia można podłączyć sieć IP oraz tradycyjną linię telefoniczną jednocześnie. Dzięki temu jeden telefon obsługuje oba typy połączeń.

Funkcja definiowania zewnętrznych operatorów tradycyjnych jest dostępna po zalogowaniu się panelu Freeconet, w zakładce Konfiguracja » Operatorzy » Zewnętrzni. Kliknięcie przycisku Dodaj operatora zewnętrznego powoduje przejście do formularza, w którym podaje się numer wraz z numerem kierunkowym (w osobnych polach). Kliknięcie przycisku Dodaj powoduje skojarzenie numeru z kontem, pod warunkiem, że format numeru jest poprawny i numer nie jest już przypisany do czyjegoś konta.

Być może istnieją jakieś dodatkowe procedury walidacyjne wykonywanych przy kojarzeniu numeru z kontem, ale w tym momencie staje się oczywiste, że brakuje bardzo istotnego sprawdzenia. Jest nim weryfikacja uprawnień użytkownika do podawanego numeru. Atakujący może wprowadzić dowolny, nie należący do niego numer. Od tej chwili wszystkie połączenia z tym numerem przestają być łączone, natomiast są przekazywane bezpośrednio do atakującego!

Skala zagrożenia

Freeconet posiada, według różnych źródeł od kilkunastu do kilkuset tysięcy abonentów.

Jestem zdania, że podatność jest obecna od samego początku istnienia platformy Freeconet, czyli od września 2006 roku. Zatem przez ponad 4 lata użytkownicy byli narażeni na ataki, których przykłady przedstawiono poniżej.

Scenariusze ataków

DoS

Najprostszy rodzaj ataku. Atakujący nie odbiera połączeń, odkłada słuchawkę, bądź zgłasza sygnał zajętości. W ten sposób skutecznie blokuje możliwość dodzwonienia się na wybrany numer.

Podsłuchiwanie połączenia

W momencie rozpoczęcia dzwonienia atakujący nawiązuje równoległe połączenie z numerem, pod który dzwoni inicjujący połączenie. Atakujący używa do tego celu telefonii tradycyjnej, za pośrednictwem lub z pominięciem Freeconet. Po odebraniu połączenia przez drugą stronę atakujący łączy strumienie dźwiękowe obu rozmów, jednocześnie je nagrywając.

Atak stanie się trudniejszy do wykrycia jeśli napastnik zablokuje prezentację swojego numeru lub – co jest trudniejsze – podszyje się pod numer osoby dzwoniącej. W ten sposób osoba, do której połączenie jest nawiązywane nie będzie mogła stwierdzić zmiany numeru osoby dzwoniącej.

Atakujący może wykorzystać nagrane rozmowy do zbudowania z ich fragmentów korzystnych dla siebie wypowiedzi, które mogą zostać wykorzystane w następnym scenariuszu.

Modyfikacja rozmowy

Jest to rozszerzenie powyższego ataku o możliwość wpływania na przebieg rozmowy. Możliwości są ograniczone jedynie przez umiejętności i wyobraźnię atakującego. Od prostych, przeprowadzanych w mało poważnych celach modyfikacji głosu (np. jego podwyższenie lub obniżenie, dodanie echa), przez wstrzykiwanie dodatkowego dźwięku w czasie rzeczywistym, aż do ataków ciężkiego kalibru na połączenia z systemami IVR systemów bankowych. Może to być np. odcięcie użytkownika zaraz po uwierzytelnieniu sesji telefonicznej i kontynuowanie rozmowy przez atakującego, który w ten sposób może skutecznie podszyć się pod użytkownika.

Jak się zabezpieczyć?

Dopóki podatność nie zostanie usunięta, każdy użytkownik może we własnym zakresie zabezpieczyć swoje konta przed jej wykorzystaniem. W tym celu należy zmodyfikować reguły kierowania połączeń tak, aby połączenia wewnątrz sieci Freeconet były pomijane. Wiąże się to jednak ze wzrostem opłat za połączenia w przypadku dzwonienia na numery zarejestrowane w platformie.

Aby pomijać połączenia wewnątrz Freeconet przejdź do Konfiguracja » Dzwonienie » kierowanie. Zaznacz wpis Logika domyślna uproszczona i kliknij Klonuj. Następnie kliknij na nowo utworzony wpis Logika domyślna uproszczona_2, zaznacz linijkę sprawdź we Freeconet za pomocą checkboxa po lewej stronie, kliknij Usuń, potwierdź OK i kliknij Zapisz. Wróc do Konfiguracja » Dzwonienie, zaznacz Użyj własnej listy reguł kierowania połączeń, wybierz Logika domyślna uproszczona_2 z rozwijanej listy i kliknij Zapisz.

Narzędzie VOIPROX

W celu demonstracji podatności stworzyłem narzędzie VOIPROX (od VoIP proxy, lub jak kto woli VoIP rocks!). Tak, litera "O" jest wielka.

Narzędzie loguje się do dwóch kont SIP, wejściowego i wyjściowego. Działa podobnie jak proxy. Rozmowy przychodzące na numer lub numery przypisane do konta wejściowego (nazywane dalej także numerami przechwytywanymi) są odbierane i przekazywane do prawdziwego odbiorcy za pomocą konto wyjściowego. Odebranie rozmowy przychodzącej następuje dopiero w momencie odebrania słuchawki przez osobę do której połączenie jest kierowane. Dzięki temu nie występuje przerwa, która mogłaby wzbudzić podejrzenia osoby dzwoniącej.
Każda przechwycona rozmowa zostaje automatycznie zapisana do osobnego pliku wav. Podczas trwania rozmów przekazywanych przez VOIPROX użytkownik może w czasie rzeczywistym wpływać na ich przebieg za pomocą prostej konsoli.

VOIPROX został napisany w Pythonie. Wybór tego języka został podyktowany faktem, że biblioteka do obsługi VoIP, na którą się zdecydowałem jest dostępna tylko dla C oraz właśnie Pythona. Na marginesie: Napisanie VOIPROXa było świetną motywacją do nauczenia się tego stosunkowo dobrze przemyślanego języka. Jednak od kilku lat programuję w języku Ruby i muszę przyznać, że to krótkie doświadczenie z Pythonem uświadomiło mi, że wybór Rubiego był trafną decyzją...

VOIPROX został napisany i przetestowany pod Linuksem. Nie widzę jednak powodów, dla których nie powinien działać w innych, wspieranych przez Pythona i PJSIP systemach operacyjnych.

Do wygodnego testowania narzędzia potrzebny jest niezależny terminal VoIP, bramka lub softphone (np. softphone webowy dostarczany przez Freeconet). Uwaga: w przypadku softphone'a musi on być uruchomiony na innym komputerze niż VOIPROX. VOIPROX wymaga dostępu do karty dźwiękowej (nawet, gdy z niej nie korzysta) i nie może jej dzielić z innych programem.

Zależności

Zainstaluj wszystkie zależności niezbędne do kompilacji PJSIP. Wszelkie niezbędne wskazówki znajdziesz tutaj. W szczególności zwróć uwagę na biblioteki ALSA. Jeśli nie zostaną wykryte to VOIPROX nie obsłuży lokalnego dźwięku.

Pobierz bibliotekę PJSIP (testowałem wersję 1.8.10):

  $ wget http://www.pjsip.org/release/1.8.10/pjproject-1.8.10.tar.bz2

Rozpakuj archiwum, skompiluj bibliotekę ale jej nie instaluj:

  $ tar jxf pjproject-1.8.10.tar.bz2
  $ cd pjproject-1.8.10
  $ ./configure
  $ make dep
  $ make

Zainstaluj Pythona oraz paczki niezbędne do kompilacji rozszerzeń dla tego języka. Tutaj znajdziesz wszystkie potrzebne informacje.

Skompiluj i zainstaluj rozszerzenie PJSIP dla Pythona:

  $ cd pjsip-apps/src/python
  $ sudo make

Jeśli poniższa komenda zwróci "OK" to znaczy, że biblioteka jest zainstalowana prawidłowo:

  $ python -c 'import pjsua' && echo 'OK'

Konta VoIP

Będziesz potrzebować trzech kont SIP:

  1. Konto wejściowe. Na to konto będą przychodzić rozmowy na jeden lub kilka przechwytywanych numerów.
  2. Konto wyjściowe. Z tego konta VOIPROX będzie wykonywał połączenia do prawdziwych odbiorców.
  3. Konto testowe. Zakładam, że nie masz konta Freeconet. Jeśli posiadasz już takie konto nie musisz zakładać konta testowego -- po prostu wykorzystaj już istniejące.

Choć konto wyjściowe teoretycznie może być skonfigurowane u dowolnego operatora VoIP, to w tej chwili VOIPROX obsługuje jedynie konta Freeconet. Wszystkie konta możesz założyć za pomocą formularza rejestracji nowego użytkownika Freeconet.

Dla każdego konta wybierz numer telefonu, podaj swoje dane oraz e-mail i login. Adres e-mail może być taki sam dla każdego konta. Aby ułatwić rozróżnianie kont najlepiej zakodować jego rodzaj w loginie (np. dodawać końcówki -in, -out, -test).

Konfiguracja kont

Przy użyciu haseł z wiadomości, które przyjdą na podanego maila zaloguj się na i skonfiguruj:

Konto wyjściowe

Ponieważ z tego konta będą wykonywane połączenia poza Freeconet, niezbędne jest jego doładowanie w menu Płatności » Zasil konto.

Teraz należy zdezaktywować połączenia wewnętrz Freeconet. Zostało to opisane krok po kroku w sekcji Jak się zabezpieczyć.

Opcjonalnie możesz wyłączyć prezentację numeru: Konfiguracja » Użytkownicy » Twój użytkownik » Prezentacja » Ukryj.

Konto wejściowe

Wejdź do Konfiguracja » Operatorzy » Zewnętrzni i kliknij Dodaj operatora zewnętrznego. W formularzu, który się pojawi wpisz numer, który chcesz przechwycić i kliknij Dodaj. W przypadku telefonu komórkowego należy podać pierwsze trzy cyfry numery bez zera w pierwszym polu (jako numer kierunkowy), zaś pozostałe cyfry w polu drugim. Uwaga: Aby dało się go wprowadzić, numer nie może być z sieci Freeconet.

Nie podawaj popularnych numerów, np. do infolinii znanych firm, ponieważ istnieje wysokie prawdopodobieństwo, że przejmiesz połączenie przypadkowej osoby. W takiej sytuacji ryzykujesz odpowiedzialnością prawną. Najlepiej podaj numer swojego telefonu komórkowego lub stacjonarnego u tradycyjnego operatora.

Konto testowe

Jeśli posiadasz już telefon VoIP we Freeconet, testy przeprowadzaj za jego pośrednictwem i przejdź od razu do sekcji Uruchomienie programu. W przeciwnym wypadku czytaj dalej.

To konto nie wymaga zmian w konfiguracji. Natomiast po zalogowaniu się otrzymujesz dostęp do webowego klienta VoIP pod nazwą Dzwoń ze strony za pomocą którego możesz sprawdzić, czy połączenia działają. Uruchom klienta i wybierz numer 901. Jest to numer bezpłatny, pod którym otrzymuje się informacje o stanie konta odczytaną przez syntezer mowy. Alternatywnie można zadzwonić na infolinię Freeconet pod numer 801 009 500.

Jeśli połączenie nie doszło do skutku to spróbuj skonfigurować innego klienta SIP (zdarzało mi się, że klient webowy nie działał). Dane do konfiguracji są podane w mailu od Freeconet. Sprawdź, czy Twój klient działa dzwoniąc pod podane wyżej numery.

Pamiętaj, że połączenia testowe nie mogą być wykonywane z komputera, na którym działa VOIPROX. Jeśli posiadasz bramkę lub telefon VoIP, skorzystaj z nich. W przeciwnym razie uruchom programowego klienta VoIP na innej maszynie.

Uruchomienie programu

Ściągnij i rozpakuj narzędzie VOIPROX:

  $ wget https://www.cryptonix.org/projects/voiprox/voiprox-1.0.tar.bz2
  $ tar jxf voiprox-1.0.tar.bz2
  $ cd voiprox-1.0

Uruchom VOIPROX, podając w linii komend loginy i hasła kont SIP:

  $ ./voiprox login_wejściowy:hasło_1 login_wyjściowy:hasło_2
   12:35:42.411 os_core_unix.c  pjlib 1.8.10 for POSIX initialized
   12:35:42.411 sip_endpoint.c  Creating endpoint instance...
   12:35:42.412          pjlib  select() I/O Queue created (0xa1a0420)
   12:35:42.412 sip_endpoint.c  Module "mod-msg-print" registered
   12:35:42.412 sip_transport.  Transport manager created.
  VOIPROX 1.0 ready to intercept calls.
  Type "help" for a list of commands.
  >>

Przy starcie odtwarzany jest krótki dźwięk, który sygnalizuje prawidłową komunikację z kartą dźwiękową.

Jeśli coś pójdzie nie tak, można uruchomić program z opcją -v, która powoduje, że wyświetlane są dodatkowe komunikaty pomocne przy diagnostyce problemów.

Pierwszy test

Zadzwoń z konta testowego (przypominam: z innego komputera lub urządzenia) na przechwytywany numer, czyli ten który podałeś w konfiguracji konta wejściowego. To połączenie jest bezpłatne w kontekście konta testowego, natomiast obciąży Twoje konto wyjściowe, bo to tak naprawdę z niego zostanie wykonane połączenie na przechwytywany numer.

Po zakończeniu połączenia, w katalogu w którym uruchomiony jest VOIPROX pojawi się plik .wav z nagraniem rozmowy. Gratulacje – właśnie podsłuchałeś swoją pierwszą konwersację telefoniczną ;-)

Dalsze możliwości

Pełna funkcjonalność narzędzia VOIPROX jest dostępna z poziomu konsoli dostępnej po jego uruchomieniu. Możliwe komendy pojawiają się po wpisaniu help:

  >> help
  Possible commands:
    list, show       - show all active connections
    disconnect [[caller|callee] [from]] connection
                     - disconnect caller or calee from connection given by
                       connection id; if caller/callee not given entire
                       connection is terminated
    attach [mic|speaker] [to] connection
                     - attach local microphone or speaker to given connection;
                       if mic/speaker keyword not given both will be attached
    detach [mic|speaker] [from] connection - analogical to attach
    play file.wav [to] connection
                     - play wav file (no spaces allowed in file name)
    help             - show this help
    quit, exit or ^D - terminate all active connections and quit

Nawiąż połączenie i nie rozłączaj się. Po wpisaniu list zobaczysz je na liście aktywnych połączeń (VOIPROX umożliwia przechwytywanie wielu połączeń jednocześnie).

  >> list
  1: 123456789 > 0987654321

Każde nowo nawiązane połączenie sygnalizowane jest krótkim sygnałem dźwiękowym. Każda linia wyniku komendy list zaczyna się on identyfikatora połączenia, który może być podawany do innych komend. Następnie widoczne są numery telefonów, odpowiednio numer osoby nawiązującej połączenie oraz numer docelowy.

Możesz podłączyć lokalny mikrofon i głośnik (słuchawki) do rozmowy wpisując:

  >> attach to 1

Od tego momentu stajesz się pełnoprawnym uczestnikiem połączenia i możesz rozmawiać z jego uczestnikami.

Jeśli chcesz tylko nasłuchiwać, odłącz mikrofon wpisując:

  >> detach mic from 1

Komenda disconnect, jak sama nazwa wskazuje służy do rozłączania połączenia. Natomiast można ją twórczo wykorzystać na połączeniu, na którym wykonano attach podając opcję caller (odłączenie osoby dzwoniącej) lub callee (odłączenie osoby odbierającej połączenie). Ponownie podłącz mikrofon:

  >> attach mic to 1

Następnie wpisz:

  >> disconnect caller from 1

Spowoduje to, że osoba dzwoniąca zostanie rozłączona, zaś osoba odbierająca zacznie rozmawiać z Tobą. Pomyśl jakie daje to możliwości w systemach automatycznej autoryzacji telefonicznej...

Pozostaje jeszcze komenda play, pozwalająca na odegranie pliku wav. Archiwum VOIPROX zawiera testowy plik wav. Wpisz:

  >> play test.wav to 1

aby odtworzyć tekst znany z klasyki polskiego kina ;-)

Życzę miłej zabawy – bawcie się grzecznie!

Disclaimer

VOIPROX to narzędzie proof of concept. Może zawierać (i zawiera) błędy. Udało mi się przechwytywać równolegle dwa połączenia, nie robiłem testów większej liczby jednoczesnych rozmów. Testowane na Ubuntu 9.10.

Podczas tworzenia narzędzia VOIPROX wszystkie przechwycone połączenia były inicjowane przeze mnie i zostały wykorzystane jedynie na potrzeby testów.

Używasz narzędzia VOIPROX na własną odpowiedzialność. Nie wykorzystuj go do łamania prawa. Pamiętaj, że Freeconet rejestruje informacje o wszystkich połączeniach. Logi mogą być wykorzystane w sądzie jako dowód w sprawie.

Mam nadzieję, że narzędzie nie zostanie wykorzystane przez osoby o złych intencjach. Upublicznienie narzędzia powinno spowodować szybkie wyeliminowanie podatności przez Freeconet, co nie da prawdziwym przestępcom czasu na przygotowanie profesjonalnych ataków. Natomiast osoby, które wiedziały o podatności już wcześniej i wykorzystują ją w tajemnicy do celów niezgodnych z prawem, stracą taką możliwość.

Kontakt

Jeśli chcesz się ze mną skontaktować, skorzystaj z maila, który znajdziesz na stronie www.cryptonix.org.