Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 109, ЯНВАРЬ 2008 г.

Как уломать железную тетку

goabruce

Хакер, номер #109, стр. 062

(goabruce@beesoftware.ru)

Создание брутфорсера для голосового меню

У одного моего знакомого есть тайное сексуальное желание (этот извращенец поведал мне его в пьяном бреду) - он хочет уломать «железную тетку» (так в простонародье называют автоинформатор). Вот уже на протяжении нескольких лет он набирает один и тот же номер, слышит в ответ: «Здравствуйте, вы попали в автоматическое сервисное меню компании...» - и уговаривает этот милый голосок провести с ним хотя бы пять минут за чашкой кофе, но она неприступна как скала (жалко беднягу).

Описание предметной области

Но если серьезно, «железный голос» звучит в нашей жизни все чаще: это и сообщение о задолженности за телефон, и автоматическое сервисное меню операторов сотовой связи, и сервисное меню интернет-провайдеров; даже некоторые банки и платежные системы предоставляют услугу управления счетом по телефону. Практически во всех перечисленных телефонных системах при доступе к конфиденциальным данным и сервисам, таким как сведения о лицевом счете, управление профилем и т.д., используется система аутентификации, основанная на вводе номера пользователя (договора, контракта, счета, телефона и т.д.) и некоторого пароля, назовем его ПИН-кодом. То есть пользователь использует тоновый режим работы телефона (режим генерации DTMF-сигналов) для передачи данных.

Система аутентификации стара, как мамонт, и методы ее взлома такие же. Естественно, самый простой способ - это перебор всех возможных вариантов ПИН-кода (предположим, что номер договора/контракта/счета/телефона уже известен), но слабое место этого метода - время, необходимое для перебора множества вариантов. А вот тут начинается самое интересное. Во-первых, ПИН-код является числом, то есть это пароль, в котором используются только цифры, так как через телефонную сеть в тоновом режиме можно передавать только цифры, знак «#» и знак «*». Во-вторых, не знаю почему, ПИН-код у большинства систем составляют четыре цифры. Получается, что, для того чтобы подобрать ПИН-код, достаточно перебрать не более 10 000 вариантов. На один ПИН-код уходит примерно 30 сек; соответственно, на перебор 10 000 вариантов потребуется 300 000 сек (или 83,3 часа). Для компьютера это ерунда, а вот для человека будет весьма затруднительно. Более того, автоинформатор специально создавался для ручного ввода. Но если попытаться автоматизировать процесс работы с автоинформатором, то ситуацию можно исправить.

Автоматизировать процесс передачи логина и ПИН-кода в тоновом режиме не проблема, это умеет любой модем (voice-модемы могут даже распознавать такие данные). Но вот получить ответ гораздо сложнее, так как ответ о правильности/неправильности пароля дает непосредственно сама «железная тетка». Вот теперь обратная ситуация: человек поймет, о чем говорит «железная тетка», а для компьютера это будет некоторой проблемой. Несмотря на то что «тетка» «железная», говорит она человеческим голосом, соответственно, здесь необходима некоторая система распознавания речи.

Итак, думаю, ты вник в предметную область, теперь давай я сформулирую цель и задачи, которые преследовал конкретно я. Цель: получить логин и пароль для одной забугорной системы, работающей на основе голосового меню.

Задачи

  1. реализовать цикл перебора пароля;
  2. реализовать модуль передачи данных в телефонную сеть в виде DTMF-сигналов;
  3. реализовать модуль приема ответа в виде голосового сообщения;
  4. реализовать модуль распознавания ответа.

Основной способ достижения поставленной цели - создание брутфорсера, но для его создания необходимо решить поставленные задачи. С первой задачей проблем не возникло, поэтому будем считать, что она решена. Вторую и третью задачу надо решать совместно, поскольку обе предполагают работу с телефонной сетью. В общем случае необходимо синтезировать DTMF-сигналы и передавать их в телефонную сеть (как я уже говорил, это можно сделать через модем), затем необходимо записать ответ. Если быть более точным, надо оцифровать сигнал из телефонной линии (это опять же можно сделать через voice-модем).

Но для себя я решил эту задачу несколько иным образом, как мне кажется, более простым. В качестве посредника при доступе в телефонную сеть я использовал Skype. Он подошел мне по двум причинам. Во-первых, он имеет очень простой программный интерфейс, позволяющий решить все проблемы с генерацией DTMF и оцифровкой. Во-вторых, Skype мог позволить мне сэкономить на международных звонках, поскольку я «работал» с одним очень далеким американским голосовым сервисом :). Skype позволяет записать разговор в виде WAV-файла, соответственно, четвертый модуль будет представлен в виде функции сравнения двух файлов, но к этому мы еще вернемся (это самый интересный модуль). Общая схема моего брутфорсера представлена на рисунке.

Модуль связи с Skype

Ты, наверное, уже сталкивался с программой Skype. Помимо того что эта программа является интернет-телефоном, она также представляет собой некоторый сервер с командным интерфейсом на борту (Skype API) для управления внутренними функциями (управление звонками, сообщениями, видеоконференциями и т.д.). Для приложений Win32 в Skype имеется два способа передачи команд. Первый способ основан на системе оконных сообщений, то есть программа может отправлять команды, используя сообщения WM_COPYDATA. Сначала программа отправляет широковещательное сообщение всем окнам и получает ответ от Skype, затем отправляется сообщение WM_COPYDATA и в параметре LPARAM передается сама команда для Skype. Второй способ предполагает использование COM-объекта Skype4COM, который предоставляет Skype API в виде некоторого интерфейса. Но в этом случае необходимо еще скачать файл Skype4Com.dll, который и является этим интерфейсом.

Я писал свой брутфорсер на C#, поэтому мне было удобнее задействовать второй способ. Для отправки DTMF-сигналов я использовал команду SET CALL DTMF <value>, где value - один из символов 0-9, «#», «*». Для оцифровки ответа - команду ALTER CALL <id> SET_OUTPUT FILE=”FILE_LOCATION”, где id - идентификатор сеанса связи (их может быть несколько), FILE_LOCATION - имя файла, в который будет записываться весь звуковой поток (WAV PCM, 16 кГц моно, 16 бит). Проще говоря, я перенаправлял выходной звуковой поток в WAV-файл. Также звуковой поток можно перенаправить на звуковую карту или локальный TCP-порт. Как создать или прервать сеанс связи (ну, в смысле дозвониться), я думаю, ты уже разобрался.

Модуль распознавания ответа

Итак, теперь самое важное и интересное - реализация модуля распознавания, поскольку без него никакого брутфорсера не получится. Для начала покажу всю схему работы переборщика (в скобках указано примерное время на выполнение операции).

В принципе, его можно создать и без непосредственного распознавания, ведь, прослушав сообщение о результате аутентификации, сделать вывод о том, какая фраза была произнесена, можно по его длине, поскольку после ПИН-кода возможно два сообщения: либо ответ «Да», либо ответ «Нет». Но при таком подходе возникает проблема.

Как видно из схемы, суммарное время, затраченное на один вариант, составляет 52-66 сек. Перебор 10 000 вариантов может занять до 183 часов, причем это время будет затрачено на подбор пароля для одного логина. Приветствие, ответ и подтверждение логина можно сократить без последствий (если сервисное меню позволяет это). А вот сообщение результата аутентификации сократить нельзя, поскольку тогда невозможно будет распознать тип ответа.

Опять же для себя я выбрал несколько другой способ. С технической точки зрения он более сложный, но, как говорил один персонаж мультика «Крылья, ноги и хвосты», «лучше день потерять, а потом за пять минут долететь». Я записал первые 3 секунды сообщения результата аутентификации при ответе «Нет» и принял эту запись за эталонное значение. Далее в самом брутфорсере (в модуле связи с Skype) я реализовал запись первых 3 сек. результата аутентификации и затем сравнил с эталонным значением. Если записи совпадают, то ПИН-код является неверным, в противном случае все OK.

Но в моем способе есть один технический нюанс - это функция сравнения эталонного и записанного значении. Оба значения являются WAV-файлами, но побайтное их сравнение невозможно. Посмотри на рисунок, на котором изображены два звуковых файла. Это пример эталонного и записанного значения. На наш взгляд, оба файла одинаковы, но для программы это абсолютно разные файлы, они даже по размеру отличаются друг от друга на несколько сотен байт. Поэтому, совпадает ли эталонное значение с записанным, сказать однозначно нельзя. Но можно оценить степень их схожести в процентах. Назовем эту оценку ошибкой. Чем больше ошибка, тем менее схожесть файлов. Для принятия решения о совпадении эталона и записи указываем пороговое значение ошибки. Оценка производится очень просто: рассчитываю в процентах, насколько каждый байт эталона отличается от соответствующего записанного байта, и нахожу среднее значение процента ошибки. Но если оценивать оба файла напрямую, то даже для представленного примера ошибка будет очень большой. Поэтому, перед тем как производить оценку, я подготавливаю оба файла, то есть делаю нормализацию (масштабирую по высоте), обрезаю паузы в начале и конце каждого файла, затем осуществляю аппроксимацию и сжатие до 100 значений. В результате получаю два массива данных по 100 значений, которые необходимо сравнить. Для показанного примера ошибка составляет 25%, но не стоит забывать, что это относительное значение, поэтому его надо сравнить с пороговым значением ошибки. А вот пороговое значение я определял экспериментально.

Брутфорсер

Для программной реализации самого брутфорсера мне понадобилось следующее: динамическая библиотека Skype4COM.dll, класс для работы с WAV-файлом, математический класс для выполнения нормализации и аппроксимации, а также компонент для визуализации данных (когда подбирал пороговое значение ошибки). Кое-что из этого я нашел в интернете, а кое-что пришлось выдрать из готовых программ (спасибо мелкомягким за создание .NET). Программа состоит из трех основных закладок:

  1. «Анализ» - отображает процесс работы брутфорсера;
  2. «Настройки» - все основные настройки;
  3. «Сравнение» - оценка двух произвольных WAV-файлов.

Самое важное в процессе работы брутфорсера - это четкая синхронизация с «железной теткой». Это необходимо, чтобы записать именно результат аутентификации, а не прощальную фразу. Чтобы достичь нужного результата, надо сделать как можно больше временных настроек и запастись терпением, чтобы подобрать оптимальные значения. Поэтому в настройках брутфорсера я описал весь алгоритм одного опроса (смотри рисунок), что позволяет настраивать временные интервалы каждого этапа опроса.

Выводы

Ну и немного о результатах практического применения брутфорсера. В результате всех действий мне удалось сократить время, затрачиваемое на обработку одного варианта, до 30 сек., и недельная работа брутфорсера принесла 12 логинов с ПИН-кодами и немалый счет за телефонные звонки по Skype (никто не говорил, что это бесплатно). Но в моем случае шкурка стоила выделки, поскольку в конечном итоге вернулась в двадцатикратно большем размере (но это уже совсем другая история).

Я думаю, что при желании ты сможешь найти другой способ создания брутфорсера, а может, и сам метод взлома, но не забывай, что цель должна оправдывать средства :).

DVD

На диске ты сможешь найти мою программу, но так как эта статья является методической, а не практической, программа немного урезана и проверяет только один вариант ПИН-кода. Зато в ней присутствуют неописанные в статье функции. И еще - у программы нет никакого хелпа, так что придется напрячь мозги, чтобы разобраться что к чему.

WWW

SDK для Skype ты сможешь найти на www.skype.com, там же есть множество примеров.

INFO

Skype - программное обеспечение для VoIP, обеспечивающее бесплатную голосовую связь между компьютерами через интернет, а также платные услуги для связи с абонентами обычной телефонной сети.

WWW

Skype API и многое другое ты можешь найти на сайте https://developer.skype.com.

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001