Данная, весьма объемная заметка, посвящена админам чаттера, пострадавшим лицам, а также всем кому это может быть интересно.
Также она может рассматриваться как бесплатный аудит безопасности.
Предыстория.
Как вы все, должно быть, знаете, на чаттере у нас ("владельцев" комнаты Андерграунд) произошел определенный конфликт с администрацией чата, в котором каждая сторона считала себя безусловно правой, и который в итоге зашел в тупик.
Вкратце его суть заключалась в том, что хозяева чаттера отстаивали свое право делать все что захотят в любой комнате, а мы, со своей стороны, считали, что поскольку посетители комнаты платят деньги, то имеют право на свои правила в комнате.
В итоге комнату мы оплачивать перестали, и она была удалена администрацией.
Хотя подобного рода деятельность не является моей специальностью, у меня сразу возникла мысль дестабилизировать работу чата хотя бы на время, добавить работы админам, заставить нервничать хозяина чата (хотя он и так нервный), и таким образом, взять психологический реванш.
Задача казалась достаточно сложной, учитывая то что чаттер существует уже приличное время, и вероятно разного рода хакерские атаки и ддос не раз были на него проведены. При беглом осмотре также я не обнаружил каких-то критических косяков, которыми можно было бы воспользоваться. Но как известно, нет ничего невозможного, если приложить определенные усилия. И несколько, не особо опасных, но все же чувствительных для пользователей и администрации чата, мне удалось найти, и воспользоваться ими. Благодаря ним было произведено 3 вида атак, о которых я ниже и собираюсь подробно рассказать. Воспользоваться описанными техниками лица, прочитавшие этот материал вряд ли уже смогут (по крайней мере двумя первыми, но и третий метод сравнительно легко можно заблокировать, хотя на момент написания он еще позволяет парализовать работу чата).
Итак, обо всем по порядку.
Изыскания можно было направить на:
1. Сам чат, то есть на веб-сайт (не знаю на чем он написан, на PHP, Perl, или чем-то еще)
2. На веб-сервер,
3. Почтовый сервер
4. На сам сервер, то есть физический компьютер, с целю получения к нему полного удаленного доступа.
Первый метод был самый простой, поскольку требовал всего лишь включить Firebug и Fiddler и смотреть какие данные отправляются, а какие принимаются при различных манипуляциях на сайте чата.
Второй метод, возможно, был перспективен, поскольку использовалась сравнительно старая версия Apache, и не исключено что для нее написано уже много эксплойтов. Но мне он не очень подходил, т.к. в Linux я разбираюсь крайне поверхностно.
Третий метод я толком и не рассматривал.
Четвертый метод вообще, вероятно требовал истинно хакерских познаний и долгого упорного труда без всякой гарантии результата. И хотя потенциально он бы принес полный контроль над чатом, так сказать, рейдерский захват, для меня он также не особо подходил ввиду слабости познаний в Linux.
Таким образом, я решил сосредоточиться на первом методе и с его помощтю провел 3 различные по типу атаки на чат.
Техника 1-й атаки - /расслыка персональных сообщений/
Первым делом, я решил автоматизировать отправку сообщений пользователям. Это было весьма просто. Всего навсего требовалось сымитировать запросы к серверу, в точности такие которые отправляются браузером.
Это оказалось легким делом. Основная сложность тут заключалась в том чтобы получить cookies аутентификации, но это и сложностью назвать в принципе нельзя - все элементарно отслеживается через Fiddler. Отправляем логин, пароль, получаем несколько куков в ответ, подставляем их в запросы к сайту, и шлем всякую ересь.
Толку правда с этого, немного. Примерно таким же занятием долго баловался небезызвестный goblin, рассылая всякю лабуду по комнатам.
Но такого юзера можно моментально забанить и сайт перестанет принимать сообщения от забаненного юзера. Точнее, принимать-то он их будет, а вот рассылать всем кто находится в комнате - уже нет.
Более того, в связи с защитой от флуда на чаттере есть оганичение - примерно не более 1 сообщения с аккаунта в секунду. Таим обоазом, засрать весь чат и тем более, положить его большим количеством сообщений, не вышло бы. Ну и посетители могут точно также заигнорить юзера, от имени которого отправляется сообщение.
Но тут я вспомнил, что на чаттере же есть еще персональные сообщения! Не личка, а именно персональные сообщения в переписке. А что если там нет подобных ограничений?
Оказалось что да, там нет ограничений на скорость отправки и на количество отправленных сообщений вообще! Было лишь ограничение на размер сообщения - не более 8000 байт. Остальные байтыобрезались.
Отлично, для начала я решил отправить всем пользователям чата сообщение, с ссылкой на наш форум, на тему в которой описывалось нехорошее поведение Ло.
Для отправки требовался лишь uid.
Этих уидов примерно 111 тысяч от 1 до 111 тысяч. У каждого юзера свой уид. Можно было просто в цикле последовательно их перебрать и каждому отправить сообщение, для чего я быстренько написал программу.
На отправку ушло всего 4 часа.
В результате, каждый пользователь чата получил сообщение, многие наверное это помнят. Кроме того, был еще один побочный эффект. Посещаемость чаттера резко скакнула вверх! Я не понимал в чем дело, пока не почитал о чем пишут люди. Оказывается, при поступлении сообщения, информация об этом дублируется на почту юзера. То есть, тем кто давно не был в чате, приходили на почту сообщения, и они из любопытства залазили в чат, выяснить от кого и по какому поводу.
Реально, сообщения были отправлены 91 тысяче пользователей. Остальные примерно 20 тысяч аккаунтов были удалены.
Конечно, из них много было фейков, многие потеряли пароль, или потеряли интерес к чату, женились, умерли, и.т.д.
Судя по количеству постетителей форума (в районе 300 приблизительно за сутки), можно было предположить что сообщение прочитало около 500 человек. Ну наверное именно столько на чаттере постоянных посетителей и есть. Постоянные посетители успели прочитать сообщение. А потом они были затерты проснувшимися админами, и я только читал кучу сообщений у себя типа "вы мне что-то писали но тут пусто!" или "мне пришел емайл, но тут пусто".
Ответить я не мог, т.к. админы отключили на моем аккаунте возможность отправки сообщений, но почему-то не удалили сам аккаунт (хотя впоследствие его все же удалили).
Но перед тем как админы проснулись, мне пришла в голову еще одна идея - полностью забить жескткий диск сервера сообщениями.
Ведь ограничений на скорость отправки не было, и на количество отправленных сообщений тоже.
Я выбрал несколько уидов и начал им слать сообщения, по 8000 символов, причем случайных, чтобы их труднее было сжать.
Всего было отправлено около 1 гигабайта, и заняло это прилично времени. Не знаю какой там был на сервере жесткий диск, но наверное не меньше 100 гигабайт, короче, затея была обречена на неудачу, это надо было месяц хотя бы держать программу включенной, чтобы надеяться на то что место закончится и сервер чата отрубится.
Но проснулись админы, быстро поняли в чем дело и ввели ограничение на кол-во отправленных сообщений.
Перед этим впрочем, я успел поразвлекаться с несколькими противными на мой взгяд юзерами. Дело в том что при отправке сообщения, об этом выводится уведомление во фрейме той комнаты где находится юзер в данный момент. Ну и звуковой сигнал, если он установлен. А т.к. ограничений на скорость нет, фрейм юзера моментально засирается с бешеной скоростью.
Правда, только до тех пор, пока юзер не догадывался отключить возможность принятия от меня персональных сообщений.
Это был определенный успех, но не полный. Да, я мог засрать фрейм любого юзера, или даже всех юзеров комнаты или чата. Впрочем, этой возможностью я не стал пользоваться.
Потом мой аккаунт удалили вообще. Очевидно, проснулся Ло.
Это навело меня на мысль о том что можно взломать хотя бы несколько аккаунтов и сидеть под ними, время от времени громко о себе заявляя...
Техника 2-й атаки - /Взлом аккаунтов, и использование их в личных интересах и для массового флуда/
Идея самого метода взлома аккаунтов была довольно проста. Посколкьку я мог написать программу, которая производит авторизацию на сайте (для этого нужен был всего 1 запрос с логином и паролем), то конечно я мог и узнать - была ли попытка авторизации успешной, или нет. То есть, верный логин с паролем или не верный.
В качестве логина использоались UIN, то есть то что мы видим в информации у пользователя когда отрываем его анкету в чате.
Сначала надо было получить все UINы.
Для этого надо было сымитировать запрос открытия анкеты, и прогнать по нему все UID, которые как мы знаем, представляют из себя ряд чисел от 1 до 111 тысяч.
В общем, это не заняло много времени.
UIN я получил, но этого конечно было мало. Для успешной авторизации требовался также пароль. Естесствено, паролей я не знал.
Но зато знал, что большинство пользователей используют очень простые пароли, типа qwerty или 123456. Надо сказать, я и сам использовал простой пароль.
Я скачал с интернета базу самых расрпространенных паролей, там было всего 200 штук. Среди них я с удивлением обнаружил даже свой пароль, который я использовал.
После чего я начал прогон. Тут правда меня поджидала сложность. Дело в том, что с 1 IP адреса, после нескольких неудачных попыток авторизации с неверными логином/паролем чат все равно выдавал сообщение о неудачной попытке, даже если логин/пароль были уже верные. Именно выдавал сообщение о неверности логина пароля а не "подождите некоторое время, слишком частые попытки", для того чтобы взломщик не догадался в чем дело. Конечно я быстро раскусил эту малоэффективную хитрость.
Реально, требовалосб подождать около 1 минуты чтобы чат начал опять выдавать реальную инфу о логине/пароле.
Но ждать как-то не хотелось, с ограничением даже в 1 минуту скорость перебора бы упала в 1000 раз и идея бы не сработала.
Но в интернете есть хренова туча сайтов с бесплатными прокси. Более того, у меня есть маленький VPS сервер для сбора как раз таких прокси, я их использую при работе. То есть мне не пришлось даже писать парсер для сбора этих прокси, он у меня уже был.
Вот эти сайты (эта информация может быть интересна админам):
http://proxy-list.org/
http://nntime.com/
http://foxtools.ru/Proxy
http://proxy-fresh.ru/proxy/
http://awmproxy.com/
http://www.prime-speed.ru/proxy/free-pr … -proxy.php
http://proxydb.ru/en-us/
http://xseo.in/freeproxy
На некоторых из них прокси защищены от тупого скачивания разными методами - методом "текст в виде картинки" и методом "JavaScript")))
Хотя все это весьма примитивные способы, которые я в свое время быстро обошел.
Короче, для каждого запроса я выбирал случайный прокси (а их было у меня в районе 1500, причем они постоянно автоматически обновлялись с сайтов), и перебор пошел медленно но верно. Примерно 1 раз в 3 минуты я слышал звуовой сигнал, который говорил мне о том что найдено сочетание.
Для каждого логина я использовал список из 200 паролей, а также логин. То есть пароль такой же в виде логина. Это сочетание, конечно КРАЙНЕ УЯЗВИМОЕ, оказалось на 1 месте по встречаемости. На втором - пароль 123456. Потом, кажется, 123456789, и так далее...
Я быстро заметил это явление, и решил сначала перебрать все наиболе часто встречающиеся пароли.
Процесс пошел во много раз быстрее. Перебор я осуществлял в 100 параллельных потоков и примерно раз в 20 секунд находилась успешная комбинация.
Я начал изучать что за личностей я взломал, но знакомых было мало. В основном, всякие онанисты с вирта.
Пароли я нигде не менял. Не было желания заморачиваться, да и не в этом была моя цель, да и вообще, это же нехорошо было бы - поменять человеку пароль.
Зато кучу аккаунтов перебанили в разных комнатах.
Я зашел в комнату "дурдом" и быстро довел Ло до нервного срыва, после чего он удалил несколько аккаунтов.
То есть, Ло начал удалять аккаунты своих пользователей.
Конечно до него еще не совсем доходило в чем дело.
В итоге, на него начали нападать и другие юзеры, он разозлился окончальельно и снес комнату вообще.
Перед этим впрочим, я успел ему сообщить что собираюсь устроить массовую атаку с помощью акков. И посоветвал принять меры, а также оплатить работу программистов. Вероятно он воспринял это всерьез, т.к. на следующий день чат несколько раз перезагружали, че-то там прикручивали какой-то функционал. Наверняка, для упрощения процедуры бана "ботов".
Реально в моем распоряжении было около 500 аккаунтов, но я сказал ему про 2000. Хотя чтобы собрать 2000 потребовалось бы еще примерно дня 3 - 4. И вероятно, это было близко к пределу.
Но 500 это тоже было более чем достаточно.
Я написал еще одну программу, которая заходила, опять же через случайные прокси и через случайный аккаунт в какую-то комнату, и начинала писать хрень Про то что ло мудак, и т.д. То есть, я мог нагнать в любую комнату кучу ботов, которые быстро че-то писали и сваливали. Любая комната могла за минуту вырости до 150 посетителей. Правда почему-то сваливали не все, некоторые оставались висеть, с этим явлением я толком не разобрался.
Это было уже веселее чем рассылать персональные сообщения.
Модеры упорно банили ботов, а заодно и случайно подвернувшихся пользователей, сносили им аккаунты вообще. Появилась масса недовольных, их было в принципе не так много, но возмущенные голоса звучали громко, а те кто не имел запасного акка, пошли к в другие чаты и там жаловались на несправдливость.
Модеры упорно банили и банили, в видимого эффекта не было. Потом правда, они перебанили в основном все акки, но я собирал еше штук по 50, и заново проводил атаку, непродолжительную но веселую, пока мне это не надоело.
Через какое-то время собрался консилиум админов и начали че-то думать в своей комнате. Вероятно, они решили что надо спровоцировать меня на визит в их комнату, чтобы я повторил атаку, и они могли рассмотреьть как это делается и принять дополниьтельные меры. Ло начал флудить на весь чат чтобы шли в его комнату. Я решил "принять вызов".
Ло начал бешено банить аккаунты уже админской своей комнате, и зацепил также тех кто ему сказал хоть что-то отдаленно неодобрительное, или ему так показалось.
Это уже стало смешно.
Под конец, примерно 70% из имеющихся у меня аккаунтов оказалось снесена, остальные я решил сохранить на всякий случай.
Данная атака стала возможна благодаря глупейшей недоработке - пароль мог быть практически ЛЮБЫМ, начиная от 3 символов.
Также возможен был пароль совпадающий с логином, что и стало, как уже говорилось, самой распростаренной комбинацией.
(Кстати, интереса ради, я проверил прямо сейчас, в процессе написания этих строк, устнанена ли эта проблема? Оказывается - нет. До сих пор не устранена. Видимо Ло считает что достаточно погрозить пальчиком и сказать юзеру "БУДЬ МУЖИКОМ БЛЕАТЬ, ПРИДУМАЙ СЛОЖНЫЙ ПАРОЛЬ!!!".)
В принципе, мне не удалось выяснить, зашифрованы ли у них в базе пароли или нет. Особой пользы это бы не принесло, ведь все равно базу стащить я бы не смог, но просто интересно - насколько быстро админы поняли что взломаны именно простые пароли? В итоге они это поняли, хотя это мало о чем говорит.
На время я успокился и сидел в чате бегемота, кроме того была работа. Но вот появилось свободное время...
Техника 3-й атаки - /Как уложить чаттер, "надежно защищенный от DDOS атак"/
Поскольку аккаунты раздобвать было бы все сложнее, ну и вообще их можно банить быстро, я решиил исследовать вопрос о том - возможно ли настолько загрузить чаттер запросами без всякой авторизации, чтобы он вообще заглох?
На главной чаттера внизу слева гордо красуется надпись "надежно защищено от DDOS атак". Она с самого начала выглядела для меня весьма вызывающе.
Конечно, не факт что эта надпись реально значит что сайт защищен посредством какого-то сервиса, ведь это стоит денег, которые надо платить ежемесячно. Может быть она просто исполняла функцию пугала для птиц на пшеничных полях.
В любом случае, я решил попробовать заддосить сайт, и некоторые идеи по этому поводу у меня уже были, я даже че-то пытался сделать, но без особого успеха.
Сейчас же я решил взяться за это серьезно.
Идея в общем-то была проста и заключалась в атаке на базу данных чата (причем мне все равно какая эта база, я даже так и не понял, может там и нет никакой базы, а тупо все на файлах).
Самый примитивный ДДОС атакует сетевую карту или веб сервер, без учета внутренней структуры сайта. Вряд ли это бы подошло в данном случае, неизвестно какой канал на чаттере, но даже если 100 мбит, то у меня тоже 100, и положить не получится, хотя можно вплотную к этому приблизиться. Ну тупо например запрашивая гланвую страницу сотни раз в секунду.
Чаще всего без авторизации сайты отдают лишь статический или кешированный контент, для защиты от ддоса, ну и вообще, нафига неавторизованному человеку че-то получать из базы данных?
Чаттер - сравнительно небольшой сайт. Я быстро изучил все действия, которые доступны неавторизированному пользователю.
Задача была - найти такие, если они есть, которые вероятно отдают незакешированный контент, а лезут каждый раз в базу данных.
И такие в принципе нашлись. Самое очевидное сначала было проверить получение списка комнат, при заходе на главную. Но мне покзаалось, что там необязательно лезать в базу данных, и хотя некоторые косвенные признаки говорили о том что это все же происходило, потенциально нагрузка могла быть небольшая.
Тогда обратил внимание на очень интересную страницу. А именно - страницу регистрации нового пользователя.
Как я быстро увидел, при ее реализации была допущена серьезная ошибка! Очень серьезная, и на месте админов я бы обратил на это первостепенное внимание, благо сделать это просто.
Суть этой ошибки заключается в следующем.
Как мы можем виждеть, зайдя на нее, там есть капча. Но прок от нее только в том случае если следует предотвраить или замедлить автоматическую регистрацию ботов.
А все дело в том, что корректность введенной капчи проверяется ПОСЛЕ всего что стоит перед ней - правильности введенного емайла, наличия емайла, наличия уже существующего логина, введена ли дата, пол...
Чтобы проверить корректность емайла, сервер чаттера почти не требует вычилительной мощности. А вот проверка наличия пользователя и емайла - требует заглянуть в базу данных!
То есть разработчики допустили очевидную ошибку. Если бы они сначала проверяли капчу... То до обращения к БД бы дело не дошло.
Есть и еще один косяк, тоже важный, легко устранимый, и говорящий о невнимательности разрабов. Отстуствие проверки длины вводимых параметров в POST запросе. Я мог сделать логин, пароль, имя и фамилию в целый мегабайт, и сервер пережевывал все это... Ну впрочем, не факт все же что легко устранить, так же как не факт что это мы мне что-то дало.
Сравнение мегабайтной строки с 10-байтной на равенство выполняется в принципе так же бысро как 10-ти байтной с 10-байтной, ведь сравнению подлежить лишь первые 10 байтов, точнее, можно вообще сначала сравнить длину.
И все же, я смог загрузить свою сетевую карту до заветных 100 мбит работая в 300 потоков, такого мне вообще не удавлось никогда. То есть, сервер настроен дерьмово, я думаю что запрос регистрации тупо должен отваливаться уже на уровне сервера, или на уровне той самой "защиты от ддоса", если она имеет место быть.
Что ж, я загрузил сетевую карту свою, а значит вероятно и чаттера на 100%, но пытаясь зайти в чаттер я не обнаружил каких-т тормозов и проблем. Все работало шустро. Это немного разочаровало меня. Я еще не знал что до заветного падения чаттера остается всего 10 минут..
Итак, у нас есть регистрация... А что мы еще можем сделать? Восстановить пароль. Этот запрос легко отправить, и он нагружает не только БД, но и почтовый сервер. Отправить запрос на восстановления пароля легко, за некоторое время до этого я экспериментировал. Нужны только емайлы пользователей. А среди полученных мною логинов были логины в виде емайлов. И это еще одна дыра. Ведь вводя логин в виде емайла, юзер раскрывает свой емайл, а чаттер не препятсввует этому и позволяет регистрироваться.
У меня было 20 тысяч емайлов.
И на 99% из них отлично отправлялся запрос восстановления пароля.
Итак... я прихожу к идее. Грузим базу данных параллельно запросами на поиск емайла, логина и вообще все действия которые выполняются до проверки капчи. И одновременно с этим грузим базу данных на запись информации - о том что юзеру был отправлен новый пароль. Ведь 100% это пишется куда-то. Ну и параллельно почтовый сервер отъедает процессорное время, рассылая юзерам письма с ссылкой подтверждения смены пароля.
Сокращаю POST данные в запросах регистрации до минимума (нам нужно количество запросов а не трафик)
Запускаю...
Иду на чаттер...
10 секунд... F5... 10 секунд... индикатор загрузки крутится крутится но что-то долго. и? "Чат выключен". Да ну нахуй?
В чате Бегемота пишу всем проверить. Говорят - да, НЕ РАБОТАЕТ.
Цель достигнута. И всего 3 мегабита исходящего трафика!
Если зайти в комнату, а потом включтить ДДОС, то общение во фрейме парализуется, все молчат. Интересно, почему? Не пишутся ли все логи общения (а стало быть и лички) также в БД? Интересно, инетерсно. Конечно никто нам не скажет, но очень на то похоже.
Отключаем ддос - общение моментально возобновляется, правда тут же появляются несколько "вышедших юзеров", то есть собщение об их выходе, как и вообще любое сообщение, сначала дожидалось записи в БД, прежде чем быть отосланным по сети? Очеь вероятно.
Раза 3 - 4 я побаловался с данной функцией включая ее на 5 минут, дразня модераторов. Приятно было показывать им что они вовсе не такие могучие нажиматели кнопок как привыкли себя ощущать.
Через некоторое время появились админы.
Решил почитать что они пишут под одним из акков, потом начал общаться.
Было конечно искушение показать им, но не было главного админа - Ло. К тому же, не давали повода, ну нельзя же просто так баловаться. Я начал общаться с админом Графом Де Ля Хером).
В принципе, он произвел на меня впечатление нормального человека, не агрессивного и общительного, и у меня быстро угасло желание хулиганить, я пообщал больше так не делать.
Мы закончили общение, и я пошел писать это повествование, которое надеюсь, было интересным, полезным, и которое подошло к концу.