Pull to refresh

Взлом звуковой CAPTCHA на примере сайта Digg.com

Reading time4 min
Views5.6K

Введение


Многие владельцы новостных сайтов сталкиваются с потребностью размещения обратных ссылок на свою статью в популярных сервисах таких как, например Digg.com (один из крупнейших новостных аггрегаторов). Но проблема в том, что необходимо вручную заходить на сайт и добавлять ссылку каждый раз, либо перекладывать этот процесс на плечи посетителей. Естественно хотелось автоматизировать этот процесс.

Сайт Digg.com предоставляет довольно мощный API, который позволяет выполнять многие вещи: комментировать, голосовать за новость, поиск и т.д… Но он не позволяет главного — публиковать свою новость. В принципе нас ни что не ограничивает написать скрипт для автоматического добавления новостей со своего источника. Единственно препятствие — это Captсha, ей мы и займемся.


Структура каптчи

  • Наклоненные буквы, на разной высоте.
  • Перечеркнутый задний фон.
  • По экспериментам Captha не чувствительна к регистру букв.
  • Буквы английского алфавита a-z, кроме o,i,z.
  • Цифры 2,3,4,6,8

И тут мы остановимся… На хабре уже пробегали способы распознавания символов на картинках с помошью python, OCR и нейронных сетей. Наиболее полно эта тема освещена в статье уважаемого Indalo. Но такой способ не давал 100% вероятности распознавания и относительно сложен в реализации. Зная, что всегда ещё способ решить задачу проще, я случайно увидел интересную фразу: «Can't read the text? Listen it».

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

При заполенении форм сайт отдает нам такого вида картинку (Внимание требует cookies!):
http://digg.com/captcha/2c7ea3845d5ddfc5a7461c5429b6a7e5.jpg



Звуковой файл будет выглядеть так (Внимание требует cookies!):
http://digg.com/captcha/2c7ea3845d5ddfc5a7461c5429b6a7e5.mp3



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


Распознавание символов


Далее приведен процесс распознавания. В этой работе я использовал python, но ничто не мешает перенести проект на другие языки.
  1. Вручную создаем базу с готовыми капчами (примерно 100 штук).
  2. Для каждого символа пару звуковых капч, в которых он встречается только один раз, и все остальные символы уникальны, т.е. в разных каптчах не повторяется. Например для цифры — 2, берем такие: AS2DE, 2ZTKJ.
  3. В выбранных каптчах, обычным перебором ищем одинаковую максимально совпадающую последовательность. На выходе получим примерно 2000 символов.
  4. Контролируем, чтобы нам не попался фрагмент 'паузы'.
  5. Добавляем полученный результат в базу.

Пример простого перебора для двух каптч:
  1. def compare(letter, filename1, filename2):
  2.  
  3.     tfile1 = filename1 + '.mp3'
  4.     tfile2 = filename2 + '.mp3'
  5.  
  6.     f = open(tfile1, "r")
  7.     test1 = f.read()
  8.  
  9.     f2 = open(tfile2, "r")
  10.     test2 = f2.read()      
  11.  
  12.     cnt = i = j =-1
  13.     k = 3000
  14.  
  15.     for item in test1[:-k]:            
  16.         i = i + 1
  17.         j = i + k
  18.  
  19.         cnt = test2.find(test1[i:j])
  20.  
  21.         if cnt > 0:
  22.             res = test2[cnt:cnt+k]
  23.             f3 = open('sources/'+letter, 'w')
  24.             f3.write(res)
  25.     return
  26. return

На этом все, результат распознавания 100%. Теперь когда робот отправляет нашу новость на digg.com, он на странице находит адрес картинки Captcha, заменяет на mp3, запрашивает озвучку используя cookies, находит искомых 6 символов, сравнивая с собственной базой данных, и отправляет результат. Все новости с вашего сайта будут публиковаться на digg.com за считанные секунды.


Если на вашем сайте есть звуковые каптчи, рекомендую отказаться от них, либо обезопасить следующими рекомендациями:
  • Использовать разных людей, с различными акцентами и интонациями.
  • Варьировать уровень звука, особенно на заднем плане.
  • Добавлять шумы, сгенерированные случайным образом.

Для взлома более защищенных звуковых Catcha, простой метод сравнения кусков mp3 файлов может не дать положительных результатов. В этом случае рекомендуется использовать специальные фильтры для обработки аудио дорожки и удаления шумов. После чего, как вариант, можно применить нейронные сети для анализа последовательностей. Конечно результат будет меньше 100%, но зато будет оставаться на уровне. Кроме того можно попробовать сервисы распознавания речи. Лучший который я встречал — это Google Voice, надо только отправить голосовую почту с нашей mp3 и через некоторое время получить транскрипцию (интересно было бы посмотреть на результаты).


Выводы


Многие сайты в интернете настолько увлеклись усложнением своей защиты от ботов, что в результате только отдалились от реальных пользователей. И пытаясь наладить обратный контакт с ними, сами создают слабые места, которыми обязательно кто-нибудь воспользуется. Из особо крупных вебсайтов, подверженных такой уязвимости могу отметить GoDaddy.com, точно такая же аудио Captcha в их сервисе whois при проверке доменов.

Все скрипты выполнены с использованием языка Python и доступны тут.

Upd: Перенес в блог Информационная безопасность.
Tags:
Hubs:
+163
Comments61

Articles

Change theme settings