Взлом капчи за 0.05 секунд с помощью Машинного Обучения
Оказывается, нейросети уже давно могут «притворяться» людьми — рассказываем про новую модель генеративно-состязательной сети (GAN), которая распознаёт системы CAPTCHA на 32 посещаемых веб-сайтах.
Автор: Roberto Iriondo, Machine Learning Department of Carnegie Mellon University
ДИСКЛЕЙМЕР
Текст данной статьи приведен исключительно в образовательных целях для информирования пользователей о возможных уязвимостях при разработке сайтов. Информация предоставляется в целях противодействия эксплуатации уязвимостей. Редакция сайта не поддерживает никакие виды противозаконной деятельности в сети Интернет.
Никто не любит капчи (в смысле, никто из людей, ведь у ботов нет эмоций) — надоедливые картинки с трудно читаемым текстом, который вы должны ввести для доступа к чему-либо в интернете. CAPTCHA (Completely Automated Public
Схема алгоритма:
Исследователи используют небольшой набор несинтезированных капч для обучения синтезатора CAPTCHA. Синтезатор (1) используется для генерации синтетических CAPTCHA (2), которые применяются для обучения базового решателя (base solver) (3). Base solver затем совершенствуется для создания точно настроенного решателя (fine-tuned solver) несинтезированных капч.
Одним из первых известных людей, которые продемонстрировали уязвимость CAPTCHA, был Эдриан Роузброк. В своей книге “Deep Learning for Computer Vision with Python” Эдриан рассказывает, как он обошёл системы CAPTCHA на сайте E-ZPass New York. Для обучения своей глубокой модели он использовал большой набор изображений с примерами CAPTCHA.
Основное отличие решения Адриана от подхода учёных из Ланкастера, Северо-Западного университета и Пекина — последние не использовали набор данных с примерами, а синтезировали CAPTCHA с помощью генеративно-состязательной сети (GAN). Почти вся обучающая выборка состояла из сгенерированных капч, и лишь небольшая часть — из реальных.
Генеративно-состязательные сети, представленные Яном Гудфеллоу вместе с другими учёными — это глубокие архитектуры, состоящие из двух нейросетей. Эти сети «соревнуются» друг с другом в игре с нулевой суммой (zero-sum game) и синтезируют образцы, близкие к подлинным. Это может быть очень полезно в случае, когда модель не имеет доступа к большому набору данных.
Исследователи оценили свой подход с помощью 33 текстовых схем CAPTCHA, 11 из которых в настоящее время используют 32 самых популярных веб-сайта по данным Alexa. Туда входят схемы Google, Microsoft, eBay, Wikipedia, Baidu и многие другие. Модели, создаваемой для работы с этими системами, понадобилось всего 500 реальных капч, в то время как другим (в том числе модели Эдриана) требовались миллионы примеров.
Сеть GAN инициализируется с учётом параметров безопасности капчи, показанных на рисунке:
Затем она генерирует партию CAPTCHA, чтобы обучить синтезатор с помощью 500 реальных изображений из различных схем капч:
Список текстовых схем капчи, используемых в качестве обучающих данных для синтезатора и тестовых данных для решателя
Исследователи использовали 20 тыс. капч для обучения модели Preprocessing и 200 тыс. сгенерированных капч для обучения базового решателя.
Прототип создан с помощью Python, модель Preprocessing построена в приложении Pix2Pix, которое реализовано с помощью TensorFlow. Точно настроенный решатель сделан с помощью Keras.
Реальные Google CAPTCHA и сгенерированные версии, созданные синтезатором CAPTCHA
После обучения GAN со сгенерированными и реальными капчами, решатель CAPTCHA использовался для атаки на системы защиты таких сайтов как Megaupload, Blizzard, Authorize, Captcha.net, Baidu, QQ, reCaptcha, Wikipedia и т.д. Большинство капч было определено с точностью около 80%, а на сайтах Blizzard, Megaupload и Authorize.net — 100%. Этот метод оказался более точным, чем все предыдущие решения, в которых использовались большие несинтезированные наборы обучающих данных.
Сравнение решателя CAPTCHA с четырьмя другими методами
Помимо увеличения точности, исследователи упоминают в статье, что их подход также оказался более эффективным и не таким дорогостоящим, как другие решения. Это первая GAN-нейросеть для распознавания капч с открытым исходным кодом — отсюда её эффективность и дешевизна.
Однако, у модели есть некоторые ограничения: например, капчи с переменным количеством символов. В текущем подходе используется фиксированное число — если его увеличить, то прототип не будет работать. Ещё модель не поддерживает многословные и фото- или видео-капчи. В теории её можно обучить так, чтобы избавиться от этих ограничений, но пока что они присутствуют.
Посещаемым веб-сайтам следует использовать более надёжные способы защиты своих систем, такие как меры по обнаружению ботов, диагностика кибербезопасности и аналитика. Следует также поддерживать отслеживание местоположения устройства, его тип, используемый браузер и т.д., поскольку теперь сайты стали ещё более лёгкой мишенью для атаки.
Ссылка на оригинальную статью на портале medium.com.
Взломщики CAPTCHA заработали $25 млн / Habr
Уникальное в своём роде дело начал рассматривать суд Нью-Джерси. Группа мошенников и программистов обвиняется (акт, PDF, 43 стр.) в том, что с 2002 по 2009 годы заработала около $25 млн на нелегальной перепродаже билетов на концерты, спортивные состязания и другие мероприятия. Потерпевшая сторона — онлайновые сайты по продаже билетов, в том числе Ticketmaster, Musictoday и Tickets.com.Вся афера была основана на взломе визуальных и звуковых CAPTCHA. Мошенникам удалось эффективно взломать систему reCAPTCHA при помощи перехвата пользователей, пытающихся логиниться на Facebook, где используется такая же система, и автоматическое составление базы правильных ответов.
Разработка системы по взлому CAPTCHA стоила, по примерным оценкам, несколько миллионов долларов. Дело в том, что на некоторые популярные события вся распродажа завершалась в течение 30 секунд, поэтому взлом CAPTCHA должен был работать очень эффективно. Спроектированные боты автоматически заполняли все необходимые поля и автоматически осуществляли тысячи сделок покупки одновременно.
Одним из главных обвиняемых по всем мошенничествам является 37-летний программист и системный администратор компании Джоел Стивенсон (Joel Stevenson), который лично написал основную часть кода для проведения онлайновых афер, а также управлял командой программистов в США и Болгарии. Известно, что трём болгарским программистам платили от $1000 до $1500 в месяц.
Скупка билетов обрела такие масштабы, что по некоторым событиям Wiseguy стал вообще крупнейшим дистрибьютором билетов. Естественно, у него их можно было купить дешевле, чем у конкурентов. Достаточно сказать, что в 2007 году компания Wiseguy предлагала своим сотрудникам премию 100% к зарплате, если они смогут вывести компанию на уровень покупки 1 млн билетов определённой стоимости.
В 2007 году фирма фактически взломала лотерейный розыгрыш дефицитных билетов на плей-офф команды NY Yankees. Розыгрыш был ограничен двумя билетами в одни руки, а компания смогла «выиграть» 1924 билета, которые потом были проданы примерно за $159.000.
Две мошеннические фирмы обнаглели до того, что даже размещали объявления о найме на работу программистов, у которых есть опыт в разработке систем по взлому CAPTCHA. Они также выискивали и приглашали на интервью бывших сотрудников фирм-жертв, чтобы выяснить технические подробности мер защиты, детали CAPTCHA-систем и алгоритмы блокирования IP-адресов.
via Wired
Взлом каптчи файлообменника / Habr
Введение
В данной статье коротко рассказывается о процессе взлома captcha с ifolder.ru. Применение в процессе языка Python и сторонних библиотек. Применение алгоритма преобразований Хафа в составе библиотеки Open Computer Vision © Intel позволит нам избавиться от шума на изображении, простая в использовании и быстрая библиотека FANN (Fast Artificial Neural Network) сделает возможным применение искусственной нейронной сети для задачи распознавания образа.
Моя мотивация состояла, прежде всего, в том, чтобы попробовать язык Python. Как известно, лучший способ изучить язык — решить на нём какую-нибудь прикладную задачу. Поэтому параллельно описанию процесса обработки изображения я буду рассказывать о том, какие библиотеки и для чего я использовал.
Обзор проблемы
Имеем следующий вид captcha:
ifolder.ru это файлообменник, который при скачивании и закачивании хочет удостовериться в том, что вы не робот. Ресурс был взят потому, что я давно хотел применить нижеописанный алгоритм преобразований Хафа к данной задаче.
В чём трудности распознавания данной captcha? Их несколько, опишем их в порядке влияния на сложность решения задачи:
1. Наличие пересечений символов. Наглядный пример таких случаев:
Процент таких случаев относительно невелик, поэтому мы их записываем в брак с пометкой «распознаванию не подлежит».
2. Наличие линий. На каждом изображении имеются 4 линии разной длины(причём длина может быть эквивалентна линейным элементам распознаваемых объектов), толщины и угла наклона. Их мы рассматривает как главный элемент шума, от которого придётся избавляться.
3. Большой разброс в расположении символов на изображении. Символы расположены на разном уровне, на разном расстоянии.
4. Поворот символов. Символы имеют наклон по одной оси, но не более, чем на ~30 градусов (величина получена эмпирически).
5. Плавающий размер и толщина символов.
С виду достаточно простая captcha при более детальном изучении не такая уж и простая. 🙂 Но всё не так плохо. Let’s start.
Этап 1. Создание обучающей выборки и препроцессинг
Начнём с того, что скачаем с сайта несколько сотен образцов captcha, скажем 500. Этого хватит для того, чтобы отработать алгоритмы и составить первичную обучающую выборку для нашей нейронной сети.
С помощью библиотеки urllib и незамысловатого скрипта, мы скачиваем n-ое количество необходимых образцов с сайта. После чего конвертируем их из gif в 8битный bitmap, именно с таким форматом мы продолжим работу. Важным моментом является инверсия изображения. Т.е. белые объекты на чёрном фоне. Позже будет понятно, зачем это.
Скрипт, который осуществляет всё вышеописанное:
from urllib2 import urlopen
from urllib import urlretrieve
from PIL import Image, ImageOps, ImageEnhance
import os
import sys
import re
import time
def main(url, n):
# get url session url
data = urlopen(url).read()
match = re.search(r»/random/images/\?session=[a-z0-9]+\", data)
if match:
imgurl = «ifolder.ru» + match.group()
else:
return -1
# gen imgs
for i in range(n):
urlretrieve(imgurl, ‘/test/’ + str(i) + ‘.gif’)
time.sleep(1)
print str(i) + ‘ of ‘ + str(n) + ‘ downloaded’
# convert them
for i in range(n):
img = Image.open(‘/test/’ + str(i) + ‘.gif’).convert(‘L’)
img = ImageOps.invert(img)
img = ImageEnhance.Contrast(img).enhance(1.9)
img.save(‘/test/’ + str(i) + ‘.bmp’)
#os.unlink(‘/test/’ + str(i) + ‘.gif’)
if __name__ == «__main__»:
url = sys.argv[-1]
if not url.lower().startswith(«http»):
print «usage: python dumpimages.py http://ifolder.com/?num»
sys.exit(-1)
main(url, 500)
Этап 2. Удаление шума, локализация и разделение объектов.
Самый интересный и трудоёмкий этап. Примеры captcha, что я показал в обзоре, мы возьмём за образец в данной статье и будем работать с ними дальше. Итак, после первого этапа мы имеем следующее:
Для работы с изображениями я пользовался библиотеки PIL. Простая в использовании как тяпка, но достаточно функциональная и очень удобная библиотека.
Вернёмся к нашим баранам. В данном случае под шумом я подразумеваю линии.
В качестве решения проблемы я вижу несколько вариантов:
1. Генетические алгоритмы.
2. Преобразования Хафа. Можно рассматривать как разновидность автоматической векторизации.
ГА освещались на Хабре несколько раз, в том числе в процессе решения схожей задачи по взлому captcha Яндекса. Не составит труда написать модификацию генетического алгоритма для детекта прямых линий.
Тем не менее, я сделал выбор в пользу второго алгоритма. По сравнению с ГА, преобразования Хафа являются математически более строгим и детерминированным алгоритмом, в котором нет влияния случайного фактора. В данном случае он менее ресурсоёмок, в тоже время достаточно прост для понимания и применения.
Кратко, смысл алгоритма заключается в том, что любая прямая на плоскости может быть задана двумя переменными – углом наклона и расстоянием от начала координат (theta, r). Эти переменными можно рассмотреть как признаки, они формируют своё собственное двумерное пространство. Поскольку прямая есть совокупность точек и каждой из них соответствует своя пара признаков (theta, r), то в пространстве этих признаков мы будем иметь скопления точек (максимумы или peaks на пересечении) в пределах конечных окрестностей признаков соответствующие точкам прямой на исходной плоскости(изображении). Но всё проще, чем кажется. 🙂
Более подробно можно прочитать в Википедии и посмотреть визуализацию работы алгоритма здесь. Сразу станет ясно о чём речь.
Писать реализацию самостоятельно естественно лень. К тому же она есть в библиотеке OpenCV, с которой я достаточно часто работаю на С/С++. Есть биндинги для Python’a, которые легко собираются и устанавливаются.
В целом OpenCV достаточно низкоуровневая библиотека и работать с ней на питоне не очень удобно, поэтому авторы предусмотрели adaptors для преобразования в формат объектов PIL. Делается это очень просто:
src = cvLoadImage(‘image.bmp’, 1) # OpenCV object
pil_image = adaptors.Ipl2PIL(src) # PIL object
Процедура удаления линий выглядит следующим образом:
def RemoveLines(img):
dst = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 )
cvCopy(img, dst)
storage = cvCreateMemStorage(0)
lines = cvHoughLines2( img, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 35, 35, 3 )
for line in lines:
cvLine( dst, line[0], line[1], bgcolor, 2, 0 )
return dst
Изображения должны быть монохромными, значащие пиксели белыми. Именно поэтому мы инвертировали изображение на первом этапе и будем инвертировать при распознавании.
Ключевым моментом является вызов функции cvHoughLines2. Следует обратить внимание на параметр CV_HOUGH_PROBABILISTIC, который означает применение более «умной» модификации алгоритма. Три последних параметра так же очень важны, они отражают: количество попавших точек в ячейку пространства признаков; минимальную длину линии; и максимальный пробел (gap), т.е. количество пропущенных пикселей на линии. Подробнее в документации к библиотеке.
Очень важно правильно подобрать эти параметры, иначе мы удалим с изображения прямые являющиеся частью символов или наоборот оставим много шума. Я считаю, что подобранные мною параметры являются оптимальными, но далеко не идеальными. Давайте, например, в два раза увеличим максимальный gap. Это приведёт к такому эффекту:
Вместе с линиями мы удалили много полезной информации. В тоже время правильно подобранные параметры позволяют достичь приемлемого результата:
Вы уже заметили, что, поскольку, линии часто пересекают символы, мы неизбежно удаляем и полезную информацию тоже. Это не смертельно, частично мы сможем её восстановить позже и в конечном счёте всё будет зависеть от того насколько хорошо обучена наша нейронная сеть.
Следующая задача это локализация и разделение символов. Здесь возникают проблемы, описанные в пунктах 1 и 3 в обзоре. Плавающее положение символов и поворот не позволяют нам опираться на единые координаты и расположение. Символы часто «соприкасаются», что мешает нам применить какой-нибудь алгоритм из серии contours detection.
Ясно, что делить надо по вертикали. Недолго думая, посчитаем количество белых пикселей в каждом столбце изображения и отобразим их в окне:
Чтобы построить графики я использовал библиотеку matplotlib. Библиотека поражает своей гибкостью и заложенным функционалом, ничего подобного на других языках не встречал. В качестве front-end GUI использовался PyQt4.
Если соотнести графики с изображением, то видно наличие 3х локальных минимумов. По ним и будем «обрезать» изображение. Оптимальный алгоритм поиска минимумов в данном случае трудно придумать, если он вообще есть. Поэтому мною был реализован простой алгоритм поиска локального минимума, параметры получены эмпирически, и он далеко не оптимален. Это важный момент и более продуманный алгоритм может существенно повысить качество распознавания.
Процедуру разделения изображения на символы вы можете найти в исходниках(FindDividingCols и DivideDigits).
Далее мы обрезаем символы т.к. остаётся много фоновой области. После можно попытаться восстановить потерянную полезную информацию. Могу посоветовать применить морфологические алгоритмы, например Erosion & Dilation (Эрозия и Дилатация) или Closing (Замыкание). Их можно найти в библиотеке OpenCV, пример использования на питоне есть в репозитории библиотеки — OpenCV\samples\python\morphology.py. Все полученные изображения отдельных символов приводятся к единому размеру 18х24.
Результат разделения на символы:
Этап 3. Распознавание
Следующий этап это создание нейросети и её обучение. Из 500 изображений (по 4 символа на каждом) я получил меньше 1000 образцов приемлемого качества и содержания использованных для обучения. Если мы обучим сеть до уровня распознавания одного символа с вероятностью 0.5, то получим общую эффективность 0.5^4 = 0.0625 или 6%. Цель более, чем достижима. Полученной выборки для неё хватило. Если у вас есть желание поработать «китайцем» несколько дней, то велика вероятность добиться лучших результатов, тут главное терпение, которого у меня нет. 🙂
Для создания и использования нейросетей удобно использовать библиотеку FANN. Wrapper для питона без напильника никак собираться не хотел, пришлось править код полученный SWIG’ом. Я решил выложить скомпилирированную библиотеку, инсталлер для питона 2.6 и несколько примеров использования. Скачать можно здесь. Я написал небольшие инструкции по установке, смотрите INSTALL.
На вход подаём массив из 18*24 = 432 пикселей (точнее передаём 1 если пиксель значащий и 0 если фон), на выходе получаем массив из 10 чисел, каждый из которых отражает вероятность принадлежности входного массива к тому или иному классу (цифре). Таким образом входной слой нашей нейросети состоит из 432 нейронов, выходной из 10. Создаётся ещё один скрытый слой с числом нейронов == 432 / 3.
Код для создания и обучения сети:
from pyfann import libfann
num_input = 432
num_output = 10
num_layers = 3
num_neurons_hidden = 144
desired_error = 0.00006
max_epochs = 50000
epochs_between_reports = 1000
ann = libfann.neural_net()
ann.create_standard(num_layers, num_input, num_neurons_hidden, num_output)
ann.set_activation_function_hidden(libfann.SIGMOID_SYMMETRIC_STEPWISE)
ann.set_activation_function_output(libfann.SIGMOID_SYMMETRIC_STEPWISE)
ann.train_on_file(‘samples.txt’, max_epochs, epochs_between_reports, desired_error)
ann.save(‘fann.data’)
ann.destroy()
Использование:
def MagicRegognition(img, ann):
ann = libfann.neural_net()
ann.create_from_file(‘fann.data’)
sample = []
for i in img.size[1]:
for j in img.size[0]:
if colordist(img.getpixel((j, i)), bgcolor) < 10:
sample[j + i * img.size[0]] = 0
else:
sample[j + i * img.size[0]] = 1
res = ann.run(sample)
return res.index(max(res))
Заключение
Python великолепный язык, очень лаконичный и красивый, с множеством сторонних библиотек, которые покрывают все мои повседневные потребности. Низкий порог вхождения, во многом благодаря солидному сообществу и количеству документации. Питонщики, теперь я с вами 😉
Дополнительные библиотеки, которые использовались:
NumPy
SciPy
Исходники (mirror 1, mirror 2)
Для подстветки синтаксиса использовался ресурс highlight.hohli.com.
UPD: 1. Перезалил исходники на 3 ресурса. 2. По просьбе, из файла dumpimages.py убрал три последних символа в регулярном выражении для ссылки на каптчу на странице ifolder. А то «дети» балуются 🙂
Исследователь нашел способ обмануть reCAPTCHA с помощью Google Speech Recognition API — «Хакер»
Независимый исследователь, известный под псевдонимом East-EE, продемонстрировал обход reCAPTCHA, обусловленный тем, что он назвал «логической уязвимостью». Дело в том, что для обмана системы защиты можно использовать один из сервисов Google, а именно Speech Recognition API.
East-EE пишет, что обнаружил проблему еще в 2016 году и даже сообщил о ней специалистам Google, но, по его словам, баг до сих пор не исправили. На GitHub East-EE опубликовал proof-of-concept, который позволяет автоматизировать весь механизм взлома.
Исследователь объясняет, что против Google reCAPTCHA v2 можно использовать другой сервис Google. Так как разработчики заботятся о пользователях с ограниченными возможностями, в reCAPTCHA всегда есть возможность переключиться на аудиоверсию теста. Если при этом пользователь использует устаревший браузер, или в системе не поддерживается воспроизведение звука, Google также предоставляет возможность скачать аудиофайл.
East-EE обнаружил, что загруженный аудиофайл можно «скормить» другому сервису Google, распознающему речь — Speech Recognition API. В итоге API вернет текстовую версию записи, которую можно будет вставить в соответственное поле reCAPTCHA. Учитывая, что исследователь создал работающий proof-of-concept, позволяющий автоматизировать и ускорить этот процесс, вполне можно ожидать, что вскоре появятся веб-сервисы или расширения для браузеров, созданные на основе наработок East-EE.
Напомню, что это далеко не первый случай взлома reCAPTCHA. Так, в 2016 году исследователи из Колумбийского университета представили метод, который позволял обойти Google CAPTCHA в 70,78% случаев. Решить Facebook CAPTCHA оказалось еще проще: система побеждала их в 83,5% случаев.
Как найти зашифрованный код капчи – Лайфхакер
При массовом распространении информации в интернете или множественной регистрации в сети возникает проблема обхода капчи. Как известно, капча является проверкой пользователя, которая должна исключить активность на сайте робота. Обойти капчу с помощью специального программного обеспечения возможно, однако для этого бот должен уметь не только распознавать картинки, но и предпринимать попытку расшифровки кода капчи. Если код можно легко расшифровать, то преодоление капчи становится простой задачей. Остается лишь определить, где же спрятан сам код?
Как работают программы для обхода капчи?
Специальное программное обеспечение способно преодолевать капчу в большинстве случаев. Конечно, подобные боты не совершенны и делают ошибку примерно в 25-30% случаев ввода капчи. Однако они все же остаются эффективным решением и ускоряют процесс выполнения различных задач в интернете.
Программы для обхода капчи способны взломать капчу различными способами. Самый простой из них – подбор правильного ответа, дело в том, что у простых капчей существует всего несколько сотен или даже десятков ответов.
Для робота подобрать нужный вариант оказывается не так сложно, бывает же, что в интернете встречаются капчи, которые можно взломать. Бот оценивают капчу и если ее код легко добыть, то поиск правильного ответа не заставит себя ждать.
Антикапча-сервис ручного распознаванияНад распознаванием капчи работают живые люди, поэтому сервису подвластно все, что способен распознать человек:текстовые капчи, графические капчи: ReCaptcha V2, KeyCaptcha, FunCaptcha и др.
Зарегистрироваться>>>
Как можно обходить капчу на простых ресурсах?
Взлом капчи – задача не простая, поэтому если вы решили заняться разработкой программного решения, способного обходить капчу, то должны быть готовы научить программу искать сразу несколько вариантов решения задачи. Сайты с надежной защитой практически невозможно взломать для получения ответа на капчу, однако простые ресурсы иногда совершают распространенные ошибки, позволяющие обойти капчу.
Самый простой способ обойти капчу без взлома ее кода – загрузка сайта без картинки капчи. Если в коде капчи зашифрован ответ в виде сравнения картинки и ответа на изображение, но сама картинка не загрузилась, то достаточно будет просто оставить поле пустым. Сайт сравнит два пустых значения и подтвердит успешное прохождение капчи. В PHP, как известно, несуществующее значение считается соответствующим пустому полю, поэтому незагруженная картинка позволит легко обойти капчу. Это способ работает редко, так как надежные сайты имеют в коде капчи более сложную схему сравнения.
Где зашифрован код капчи и как его получить
Чаще всего код капчи помещен в PHP-скрипт index.php и недостаточно защищенный сайт позволяет легко получить код для последующего взлома. Обычно в скрипте капчи зашифрован ее собственный алфавит и варианты ответа на те или иные изображения.
Смотрите видео – Сервис для автоматического распознавания капчи:
Антикапча-сервис ручного распознаванияНад распознаванием капчи работают живые люди, поэтому сервису подвластно все, что способен распознать человек:текстовые капчи, графические капчи: ReCaptcha V2, KeyCaptcha, FunCaptcha и др.
Зарегистрироваться>>>
Достаточно лишь сравнить код изображения с соответствующим кодом в скрипте для успешного преодоления капчи. Главная проблема, опять же, заключается в том, что надежные не позволяют выявить код капчи в коде страницы.
Андрей Меркулов
Инвестор, учредитель проекта Территория Инвестирования
Владелец ряда активов — доходный дом, доходные квартиры, доходные сайты
Предприниматель, эксперт по трафику, тиражированию бизнеса и бизнес системам
Взлом звуковой CAPTCHA на примере сайта Digg.com / Habr
Многие владельцы новостных сайтов сталкиваются с потребностью размещения обратных ссылок на свою статью в популярных сервисах таких как, например 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, но ничто не мешает перенести проект на другие языки.
- Вручную создаем базу с готовыми капчами (примерно 100 штук).
- Для каждого символа пару звуковых капч, в которых он встречается только один раз, и все остальные символы уникальны, т.е. в разных каптчах не повторяется. Например для цифры — 2, берем такие: AS2DE, 2ZTKJ.
- В выбранных каптчах, обычным перебором ищем одинаковую максимально совпадающую последовательность. На выходе получим примерно 2000 символов.
- Контролируем, чтобы нам не попался фрагмент ‘паузы’.
- Добавляем полученный результат в базу.
Пример простого перебора для двух каптч:
- def compare(letter, filename1, filename2):
- tfile1 = filename1 + ‘.mp3’
- tfile2 = filename2 + ‘.mp3’
- f = open(tfile1, «r»)
- test1 = f.read()
- f2 = open(tfile2, «r»)
- test2 = f2.read()
- cnt = i = j =-1
- k = 3000
- for item in test1[:-k]:
- i = i + 1
- j = i + k
- cnt = test2.find(test1[i:j])
- if cnt > 0:
- res = test2[cnt:cnt+k]
- f3 = open(‘sources/’+letter, ‘w’)
- f3.write(res)
- return
- return
На этом все, результат распознавания 100%. Теперь когда робот отправляет нашу новость на digg.com, он на странице находит адрес картинки Captcha, заменяет на mp3, запрашивает озвучку используя cookies, находит искомых 6 символов, сравнивая с собственной базой данных, и отправляет результат. Все новости с вашего сайта будут публиковаться на digg.com за считанные секунды.
Если на вашем сайте есть звуковые каптчи, рекомендую отказаться от них, либо обезопасить следующими рекомендациями:
- Использовать разных людей, с различными акцентами и интонациями.
- Варьировать уровень звука, особенно на заднем плане.
- Добавлять шумы, сгенерированные случайным образом.
Для взлома более защищенных звуковых Catcha, простой метод сравнения кусков mp3 файлов может не дать положительных результатов. В этом случае рекомендуется использовать специальные фильтры для обработки аудио дорожки и удаления шумов. После чего, как вариант, можно применить нейронные сети для анализа последовательностей. Конечно результат будет меньше 100%, но зато будет оставаться на уровне. Кроме того можно попробовать сервисы распознавания речи. Лучший который я встречал — это Google Voice, надо только отправить голосовую почту с нашей mp3 и через некоторое время получить транскрипцию (интересно было бы посмотреть на результаты).
Многие сайты в интернете настолько увлеклись усложнением своей защиты от ботов, что в результате только отдалились от реальных пользователей. И пытаясь наладить обратный контакт с ними, сами создают слабые места, которыми обязательно кто-нибудь воспользуется. Из особо крупных вебсайтов, подверженных такой уязвимости могу отметить GoDaddy.com, точно такая же аудио Captcha в их сервисе whois при проверке доменов.
Все скрипты выполнены с использованием языка Python и доступны тут.
Upd: Перенес в блог Информационная безопасность.
Исправлена уязвимость, позволявшая обмануть reCAPTCHA — «Хакер»
Эксперт в безопасности облаков и приложений Андрес Рианчо (Andres Riancho) обнаружил способ обхода защитного механизма reCAPTCHA, основанного на тесте Тьюринга. Нужно направить небезопасным образом специальный запрос к /recaptcha/api/siteverify.
Исследователь объясняет, что Google предлагает на выбор пользователя ряд картинок и использует JavaScript для их отображения в браузере. Когда пользователь закончил задание и, например, нашел на предложенных изображениях все автомобили, он подтверждает свой выбор, что провоцирует отправку HTTP-запроса веб-приложению, которое верифицирует выбор пользователя, обращаясь к reCAPTCHA API.
Приложение аутентифицирует себя с помощью секретного параметра и reCAPTCHA-generated-hash. Если пользователь решил задание корректно, API подтверждает, что все в порядке, приложение обрабатывает полученный ответ и допускает пользователя к ресурсу, которое защищает.
Рианчо обнаружил, что если применить здесь технику HTTP parameter pollution, то веб-приложение может быть использовано для обмана reCAPTCHA.
«HTTP parameter pollution практически всюду: на стороне клиента и сервера, и связанные с этим риски сильно зависят от контекста. В некоторых отдельных случаях это может привести к огромным брешам в безопасности, но в большинстве случаев такая находка чревата низкими рисками», — рассказывает исследователь.
Специалист отмечает, что возможно направить два HTTP-запроса сервису Google и получить одинаковый ответ. reCAPTCHA API всегда будет использовать первый секретный параметр в запросе, но проигнорирует второй, что и эксплуатировал Рианчо.
«Если веб-приложение уязвимо перед HTTP parameter pollution и URL сконструирован таким образом, что ответный параметр идет перед секретным, тогда атакующий может обойти верификацию reCAPTCHA», — пишет Рианчо.
Специалисты Google уже исправили проблему без всяких патчей. Исследователь, заработавший на обнаружении этого бага 500 долларов США, объясняет, что разработчики поработали с REST API, и теперь если запрос к /recaptcha/api/siteverify содержит два параметра HTTP с одинакомыми именами, в ответ возвращается ошибка.