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.
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.
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.
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!
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.
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.
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.
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.
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.
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.
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'
Będziesz potrzebować trzech kont SIP:
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).
Przy użyciu haseł z wiadomości, które przyjdą na podanego maila zaloguj się na i skonfiguruj:
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.
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.
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.
Ś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.
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ą ;-)
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!
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ść.
Jeśli chcesz się ze mną skontaktować, skorzystaj z maila, który znajdziesz na stronie www.cryptonix.org.