« Восстановление сайта из архива | Пробой капчи гугла »
Решил иногда писать про всякие хакерские технологии, в основном с целью саморазвития чтоб не забыть. Итак, брутфорс это такой хакерский термин, означающий подбор пароля. Предположим что вы опять же, веб-разработчик из Саратова (из глуши). У вас на сайте есть формочка, куда саратовский юзверь вводин ФИО и пароль, скрипт на сервере при обработки формы сверяет пароль с ранее записанным и если он совпал, то юзверю выдаётся кука, с которой он может попасть в закрытые разделы сайта. Вроде всё чики-пуки, спрашивать пароль и высылать юзеру куку можно даже по https, а вместо пароля для пущей секьюрной безопасности хранить только его хэш, но всё это так, пока не пришёл злой молдавский хакер.
Который по специально составленному словарю, а то и без оного, не начнёт отсылать десятки/сотни/тысячи одновременных запросов на аутентификацию. Защититься от этого довольно просто, главное осознавать сам факт, что такое возможно.
Сделать нужно так: одновременно принимать не более 2х запросов на аутентификацию для одного аккаунта. Два запроса (а не один) нужно разрешить, чтобы ламеры нажимающие даблклик не парили вам головной мозг, что “сайт не работает”. После неправильного запроса на аутентификацию – нужно делать паузу, в течении которой тому же аккаунту запрещено аутентифицироваться, пауза может быть статической, типа 15 секунд или возрастающей каждый раз скажем на 2 секунды, брутфорсилка её быстро загонит до больших значений, что сделает подбор пароля невозможным, а юзер сделавший случайную опечатку – просто не заметит. У меня всё это реализовано через создание файла на сервере, логически связанного с аккаунтом, для которого происходит попытка аутентификации. В файл каждый раз дописывается время запроса (с помощью дописывания в конец – меньше шансов случайно стереть файл, даже с блокировкой), при успешной аутентификации, файл стирается, из этой информации легко получается всё нужное.
Проблема с таким подходом заключается в том, что хакер может устроить юзеру маленький персональный DOS, если законный юзер будет пытаться логиниться одновременно с хакерским нападением. Разрулить ситуацию можно выдав юзеру при успешном логине специальную долгоиграющую куку, которая будет служить не для аутентификации, а наоборот, для авторизации аутентификации, то есть юзеру с такой кукой будет позволено обойти главный механизм аутентификации, но с теми же ограничениями что и без куки (2 запроса), чтобы кука сама по себе не стала объектом охоты молдаван. Вместо куки можно в невидимой части профайла юзера хранить несколько (много) ip-адресов, с которых он успешно логинился и разрешать обход с этих адресов. Маловероятно что хакер будет брутфорсить именно с них, а если да, то юзер при неудачном логине, получит нужный сигнал о попытке взлома.
На последок картинка для медитации: Authentication vs. Authorization
30 Responses
November 8th, 2007 at 00:21:13
// php gravatar() ?>1Ну да, это основы хака… Правда брут малоактуален для сайтов(форм) с подобной системой безопасности, что описал ты. Гораздо проще ломануть праймари-мыло, куда попросить пароль выслать. Это ведь не только аськи касается, но и множества сервисов/сайтов/порталов, а вычислить мыло человека непросвященного – дело техники. Ведь в первую очередь в основе old-school хака лежит социальная инженерия и психология и лишь потом программинг.
з.ы.: оч быстро однажды пришлось отказаться полностью почти от всех аккаунтов на мэйл.ру, рамблере и яше, и некоторых других фрии-сервисах(не только русских). Ломают только в путь по налаженной схеме любое мыло.
Если уверены в своем мэйл-серваке, держите праймари мыло у себя, ежели нет уверенности или сервака – в Gmail вам дорога.
November 8th, 2007 at 01:54:17
// php gravatar() ?>2имхо наиболее частый метод брутфорса это не one-to-many, а many-to-one следовательно девелоперу надо иметь именно такой вариант как основной и строить защиту от него.
November 8th, 2007 at 02:01:43
// php gravatar() ?>3[...] и заодним, пока меняете robots.txt – почитайте как защитить от брутфорса сайт вашего ПТУ, который вы девелопите за зачет по [...]
November 8th, 2007 at 02:20:45
// php gravatar() ?>4Sodium Carbonate, many-to-one это как? О чём речь вообще?
November 8th, 2007 at 02:39:40
// php gravatar() ?>5когда подбирают пароль не к одному аккаунту.
один_аккаунт-много_паролей, а шарашат по большому количеству аккаунтов с одним паролем
November 8th, 2007 at 02:59:41
// php gravatar() ?>6Это не брутфорс. Это какое-то вылавливание ламеров.
November 8th, 2007 at 03:36:58
// php gravatar() ?>7это самый что ни на есть брутфорс и он намного более эффективен в том случае когда важен неперсонализированный доступ к системе
самая сложная мысль за день.
November 8th, 2007 at 06:30:00
// php gravatar() ?>8Эффективность к определению никак не относится. Это не брутфорс, см. определение по ссылке.
November 8th, 2007 at 10:09:15
// php gravatar() ?>9А что париться с паузами? Я на своих проектах делаю счетчик, как только количество неудачных попыток доступа к определенному акку превышает N (обычно это 5) за 24 часа, то выводить капчу. Вот и вся защита.
November 8th, 2007 at 11:07:37
// php gravatar() ?>10Как вариант можно сделать в форме авторизации поле hidden, которое будет заполняться javascript’ом при загрузке страницы и полученное значение сравнивать с неким эталоном (вычисляемым на сервере) после сабмита формы. Правда, в этом случае все пользователи, которые отключают javascript в браузере, не авторизуются.
Хорошая капча а-ля гугловская также очень эффективно отсеет ботов.
Ну а от брутфорса паролей ftp спасет пара строчек в настройке iptables / ipfw.
November 8th, 2007 at 11:58:22
// php gravatar() ?>11Цитата: “Разрулить ситуацию можно выдав юзеру при успешном логине специальную долгоиграющую куку…”
А не проще ли разделить эти потоки аутентификации в зависимости от ip, создав файлы с именем:
“user-ip”. Имена для пользователя и хакера будут одинаковые, а ip разные, соответственно при аутентификации будет обрабатываться файл, отличающийся именем от файла для молдавского хакера. ДОС’а для пользователя при такой схеме не предвидится. Все остальное – по желанию.
November 8th, 2007 at 12:14:34
// php gravatar() ?>12А еще лучше – никакой регистраци. Good user is a dead user!
November 8th, 2007 at 15:27:09
// php gravatar() ?>13Roman Pushkin, “париться с паузами” гораздо легче чем париться с капчами. Для этого они и нужны. Это во-первых. Во-вторых, почти любую капчу можно пробить сразу, а если есть немного времени, то слово почти можно удалить – любую капчу можно пробивать автоматом, вопрос времени и ресурсов. То есть защитой от брутфорса капча сама по себе вообще не является. А задержка – да.
November 8th, 2007 at 15:29:46
// php gravatar() ?>14Ed, нет, не будет это “как вариант”. Неизвестно, что использует хакер для нападения, это вполне может быть ботнет из 10000 зараженных браузеров с работающим жабаскриптом. И никакие записи в iptables не могут принципиально спасти от брутфорса, если он делается ботнетом.
November 8th, 2007 at 15:32:13
// php gravatar() ?>15Greignar, не проще, так делать неправильно, потому что хакер придёт сразу с 5000 ip адресов. Удивляет меня русская традиция всегда пытаться придумать собственный неработающий велосипед.
Я написал рабочее решение, получаю сразу 3 разных комментария – как его испортить и превратить в нерабочее.
November 8th, 2007 at 16:32:49
// php gravatar() ?>16[quote]…И никакие записи в iptables не могут принципиально спасти от брутфорса[/quote]
Alexf, не согласен
iptables -I INPUT -p tcp –dport 21 -i eth0 -m state –state NEW -m recent –update –seconds 60 –hitcount 4 -j DROP
Попробуй в течение минуты подсоединиться больше 4-х раз к 21 порту.
November 8th, 2007 at 17:05:52
// php gravatar() ?>17Хм, а что делает эта запись? Запрещает больше 4х запросов в минуту на 21й порт с любого адреса? Что будет если я сам приду на свой фтп в тот момент когда там хакер стучится? С тем же успехом зашишаться от брутфорса можно вытащив сетевой кабель из разъёма.
На самом деле дописав в правило список своих адресов, может бы это имеет право на жизнь.
November 8th, 2007 at 17:21:03
// php gravatar() ?>18[quote[На самом деле дописав в правило список своих адресов, может бы это имеет право на жизнь.[/quote]
Я как раз это и имел в виду, что дописать надо ПАРУ строчек, а не одну – которую я привел
November 8th, 2007 at 18:04:49
// php gravatar() ?>19[...] Защита от брутфорса [...]
November 8th, 2007 at 18:16:40
// php gravatar() ?>20Ну в общем то что ты привёл это глупость, тоже самое что выключить комп из розетки. То что глупость превращается во что-то работающее “дописыванием пары строк” – ничего не меняет пока эти строки не написаны.
November 8th, 2007 at 19:18:43
// php gravatar() ?>21Это ты так вежливо намекаешь, чтобы я еще вторую строчку прямо тут написал? Только после того, как ты выложишь исходники своего решения
А твое решение мало чем отличается от того, что применяется при авторизации на том же умаксфоруме или серченжинс. Ошибись 5 раз с набором пароля и будешь курить 15 минут.
Что принципиально нового ты предложил?
November 8th, 2007 at 19:51:35
// php gravatar() ?>22Да, я именно что вежливо намекаю, что сказав “а”, надо сказать и “б”, иначе не стоит и начинать. А вот наездов на себя в своём блоге я терпеть не стану.
Я нигде не писал, что предлагаю что-то принципиально новое, я дал полное описание работающего решения проблемы, только и всего.
November 9th, 2007 at 01:41:20
// php gravatar() ?>23alexf, “хакер придёт сразу с 5000 ip адресов”? Не смешите меня!!!
5000 ip адресов? Хорошо, в вашей схеме скрипт повесит всю аунтификацию, установив очередь (если вы ее предусмотрите) на запись в один единственный файл посетителя, и НИКАКОЙ пользователь в этот момент не сможет аутентифицироваться! Пара таких брутфорсов и хостер попросит вас съехать или переписать скрипты.
Боитесь брутфорса – должны использовать защиту конкретно от него. Самый жесткий вариант – блокирование ip, лояльный – капча.
November 9th, 2007 at 02:21:43
// php gravatar() ?>24Greignar,
> “хакер придёт сразу с 5000 ip адресов”? Не смешите меня!!!
Я не специально, честное слово – я этот блог никого не заставляю читать насильно.
> Хорошо, в вашей схеме скрипт повесит всю аунтификацию
Не повесит.
> установив очередь (если вы ее предусмотрите) на запись
Во-первых, очередь вы сами придумали, я про неё ни слова не написал, потому что она в данном случае не нужна. Во-вторых, если бы даже она была, никаких проблем нет записать 5000 раз подряд 20 байт в 1 файл.
> в один единственный файл посетителя
Вы невнимательно прочитали – 1 файл для каждого аккаунта, а не 1 на всех посетителей или 1 на посетителя.
> НИКАКОЙ пользователь в этот момент не сможет аутентифицироваться
ВСЕ пользователи смогут аутентифицироваться нормально, включая атакованного.
> Пара таких брутфорсов и хостер попросит вас съехать или переписать скрипты.
Хостер который попросил бы меня переписать скрипты очень горько бы об этом пожалел, поскольку я имею привычку давать негативные отзывы на плохих хостеров на профильных сайтах. А хостер который роется в пользовательских скриптах, без сомнения плохой и я бы сам моментально от такого съехал.
> Боитесь брутфорса – должны использовать защиту конкретно от него.
Во-первых, я не писал что я чего-то боюсь, во-вторых, мной описана именно зашита от брутфорса.
> Самый жесткий вариант – блокирование ip, лояльный – капча.
По второму разу пускаться в объяснения у меня нет никакого желания. Перечитайте мои комментарии выше, ни то ни другое не является защитой от брутфорса.
November 9th, 2007 at 03:43:37
// php gravatar() ?>25А я не говорил о единственном файле для всех. Запись будет производиться в 5000 потоков в один файл пользователя. Сколько надо потратить времени сервера, чтобы открыть на запись файл, записать в него, и закрыть, я про чтение из него даже не упоминаю? Слишком много.
Не каждый может себе позволить держать “за яйца” хостера, поэтому и приходится прибегать к оптимизациям, что очень часто сказывается на конечных пользователях.
November 9th, 2007 at 04:00:57
// php gravatar() ?>26> Сколько надо потратить времени сервера
Микроскопическое количество времени на это уйдёт. Вообще говоря, написав про “одновременные 5000 ip” я не имел в виду, что сразу со всех ип придёт запрос. Это уже будет дос, а я всё-же писал про брутфорс.
Я имел в виду, что атака пойдёт с использованием пула ип-адресов, скажем по 1 запросу в секунду, 5000 адресов переберутся за 1.5 часа. Но даже если бы 5000 запросов пришли на сервер одновременно, при условии что они не забили канал связи, не уронили сервер из-за того что кончилась память, не были отсечены ограничениями в конфигах (всё это реальные проблемы, но ДРУГИЕ проблемы), то сама по себе запись в файл прошла бы без вопросов и заняла на обычном сервере пару-тройку секунд, если же используется виртуальный диск то какую-то малую долю секунды.
November 9th, 2007 at 04:41:30
// php gravatar() ?>27Ну вот, пошли допущения… Я этого и ждал.
5000 адресов переберутся за 1.5 часа – ну и черт с ними, через определенные промежутки времени пройдет “сборщик мусора” и зачистит все лишние файлы – папка для временной аутентификации будет чиста. Зато никаких дополнительных “долгоиграющих” кук и прочих заморочек с записью в файл пользователя, всевозможных инкрементов в них.
Что спорить, каждый пишет (скрипты) как хочет. И говорить, что у кого-то единственно правильное решение – не дальновидно. Надо пытаться комбинировать.
January 8th, 2009 at 18:16:19
// php gravatar() ?>28[...] где я уже давно написал как надо делать правильную защиту от брутфорса. Раз не читали – сами себе [...]
January 16th, 2009 at 17:51:30
// php gravatar() ?>29Есть известный скрипт Дмитрия Бородина, раньше на php.spb.ru валялся. Один раз его подключаешь в каком-то общем файле, подстраиваешь параметры блокировки и все хорошо, никто не выкачивает, никто не брутфорсит, странички слишком часто тоже не дергает.
February 13th, 2009 at 01:31:25
// php gravatar() ?>30[...] блогом повадились лазать какие-то хакеры, пытающиеся подобрать пароли для различных стандартных юниксовых юзверей и заодно [...]
RSS feed for comments on this post · TrackBack URI
Написать комментарий
Про что писал
Календарь
Куйворды
Архив
Подписка на блог
Статистика подписки
Страницы
Комментарии
Последние посты
Blogroll
Счётчики
Свежие записи
Последние комментарии
Интересное на блоге
Самое комментируемое
SEO блог где палят темы is proudly powered by WordPress - BloggingPro theme modified by alexf