• XSS.stack #1 – первый литературный журнал от юзеров форума

Распределение словарей на сервере

Quake3

TPU unit
Забанен
Регистрация
03.11.2010
Сообщения
4 529
Решения
4
Реакции
5 305
Депозит
0.046
Пожалуйста, обратите внимание, что пользователь заблокирован
Задумался над таким вопросом. Вот есть у нас ботнет, который, к примеру, брутит к чему-то там пароли (архивы, хэши, цмски). Есть бот, который устанавливается на машине юзера, получает с админки список паролей, и перебирает; и есть админка, которая собственно, контролирует успешные/неуспешные попытки, выдает пароли и так далее.

Вопрос вот в чем - как грамотно синхронизировать выдачу этих самых паролей ботам? Вот есть у нас, допустим, файл на 100кк различных английских слов. И есть 3-5к ботов. Как распределить это все грамотно между ними? Где хранить пароли в админке,чтобы не пришлось каждый раз перечитывать весь этот огромный файл?

Я вижу несколько вариантов:
1. Разбить большой файл на десятки/сотни небольших (допустим, по тысячи или около того слов), вести в админке учет, вида - file1.txt отдали, file2.txt свободен.
Самое простое решение,но и самое примитивное.

2. Загрузить файл в базу данных - в плане, или создать базу на миллионы записей varchar/char с максимальной оптимизацией для выборки, либо разделить, опять таки, на записи по несколько сотен и тысяч слов, и их хранить в базе.
Это решение более интересное, позволяет вести какую-то статистику, добавлять/удалять данные, но - доп. нагрузка на базу , и сам факт поддержки еще Mysql. + надо грамотно споектировать таблицы (индексы и все такое).

3. Использовать HTTP Range. Что это такое - см. в гугле,вкратце - это заголовок , который позволяет получить не весь документ, а допустим, байты с 300 по 500, 200 байтов с конца файла и так далее. Т.е. алгос такой - бот отправляет запрос в админку,ему идет ответ в виде диапазона, отправляет этот диапазон файлу со словами, получает данные.
С одной стороны, решение очень простое, не надо ни с чем морочиться, разбивать файлы. С другой - все ли вебсервера его поддерживают? (Apache точно, nginx - хз), и главное - как это скажется на производительности при файлах на сотни миллионов записей?
 
создаешь поток который раздает словарь, маппишь файл в память и раздаешь ботам
можно сделать несколько потоков и разделить файл соответсвенно
также я был вел статистику по удачным паролям и перемещал их в начало файла
 
Quake3, вопросик- требуется брать пароли из админки, или приемлемы и иные варианты?
Скажу за способ, которым неоднократно пользовались: брали огромный словарь на сколько-то.кк(к...), делили на мелкие, давали каждому боту свою часть и просто давали команду ботам успешные\неудачные попытки логгировать в отдельный файл, а так же ограничить и запретить ботам брутить иные варианты,чтобы не было ситуации, когда несколько ботов брутят одно и то же. (такое должно заранее быть реализовано в боте).
 
Пожалуйста, обратите внимание, что пользователь заблокирован
MrLoki
создаешь поток который раздает словарь, маппишь файл в память и раздаешь ботам
можно сделать несколько потоков и разделить файл соответсвенно
Маппинг неплохая идея, но я такое смогу сделать только на винде.
Мне желательно решение для линукс сервера, и пхп админки.

Dark Koder
вопросик- требуется брать пароли из админки, или приемлемы и иные варианты?
хм, а откуда еще боты могут получить эти пароли? Изначально все равно будет какая-то админка, которая распределяет, не делать же билды с ресурсами.
 
Возьмем к примеру mysql. В нем каждая таблица отдельный файл. Значит можно бить пароли по частям. К примеру начинающиеся на "А" в одну таблицу, на "Б" в другую и т.д. Но на самом деле кроме облегчения дисковых операций и (возможны варианты) сокращения времени обращения за данными - это особого прироста не даст. Потому как при использовании php при каждом запросе создается свой коннект и своя выбока. Что не айс. Тебе правильно подсказали на тему воркера. Некой абстрактной части твоего проекта которая висит потоянно в памяти, выдирает из БД в оперативку словарь частями (пусть по 10000 слов) и по мере необходимости отдает части словаря ботам через запрос от php-скрипта на обработку.

Второй приемлемый вариант - это NoSQL. Я бы посмотрел в торону mongoDB. Но есть одно старое правило которое мне вдолбил один из разрабов мира танков. Он говорил о том, что любая БД работает быстро пока умещается в оперативке. Если пошел своп - то все они работаю в той или иной мере паршиво.

Потому напрашивается еще одно решение. Временные таблицы. В которые ты будешь выбирать словари порционально. И если во времянке порция закончилась - то триггером или иным способом пополнять времянку новой порцией. Это позволит не ворошить огромными массивами данных и при этом не ломает структуру ранее созданных решений.
 
Асм дает кучу преимуществ: скорость, компактность, нет утечек памяти (или легко обнаружить), узкие места легче устранить.
Сколько не писал под разные платформы, но больше всего нравится асм за его силу и гибкость.
Да и задача достаточно простая, накидал бы код, да занят в других проектах.
Если писать на ЯП, то смотри в сторону хэшей типа такого http://habrahabr.ru/post/142589/
 
Мне тоже кажется, что наилучшая идея - разбить словарь на части, и называть их в хронологическом порядке создания. Далее следует создать некий рабочий "стэк", где бы хранились названия файлов, и 2 обычных массива. Далее схема простая:
1)Бот подключается
2)Сервер выдает номер/адрес
3)Бот скачивает
4)Номер перекидывается во временный массив
5)Бот пробрутил, дал результат
6)Номер попадает в конечный массив
Мне кажется не так сложно реализовать такой механизм на бэкэнде...
PS последние 2 массива можно сделать иначе: изменять названия файлов и т.п.
 
надо 3 массива:
1) не обработанные
2) в обработке
3) обработанные, тут еще желательно хранить по каким адресам отработано, если боты разные ресурсы отрабатывают
 
MrLoki Ну я и предложил такую концепцию, а реализовывать можно даже не держа в памяти. С помощью названия файлов. Допустим, "свободные" словари начинаются с цифр, "рабочие" словари с буквы "a", а отработанные с "z". Дальше, либо бот парсит список и ищет те, что начинаются с цифр, а если сортировка идет по имени, то просто первое, либо сервер парсит и выдает адресс/номер.

Только что прочитал про сервер на asm. :)
_http://www.opennet.ru/opennews/art.shtml?num=42267
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ассемблер это дело хорошее, но для сервера совершенно ненадежное. По крайней мере, я бы не использовал самописное.

дабы не разжигать холивар - я сам давно пишу на Масм , но одно дело - какой-то бот или простой гуй, а второе - полноценный сервак. Там игры с регистрами могут привести к трудноулавливаемым ошибкам.
Да и вообще, кодить что-то свое нет смысла, т.к. от линукса я далек, разве что брать windows-сервер.

В общем, спасибо всем за советы, буду тестировать.
 
Для раздачи заданий - сервер очередей Gearman или RabbitMQ. Эффективнее всего работать с данными загруженными в память - для словарей подходит Redis. Если значений сотни миллионов и оперативы не хватает, то и на частые выборки больших размеров из mysql её тоже не хватит. скорее всего сразу работать со всеми данными и не нужно будет. Можно разделять данные между redis и mysql по частоте обращений.

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

п.с. не могу восстановить пароль от акка, письмо не приходит.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх