Опять ты, Брут? Изучаем возможности «прокси наоборот» на примере брутфорсераВ середине 2008 года мы с человеком, скрывающимся под ником OstWay, написали SRQ Brute – брутфорс ICQ с поддержкой абсолютно нового (для ICQ) типа прокси – анонимайзеров. В то время это было революцией в бруте ICQ. Спустя два года, я думаю, настало время совершить новую революцию. Общая теорияКакими же они будут, эти новые прокси, и зачем они нужны? Давай рассмотрим основные проблемы, с которыми приходится сталкиваться при бруте через обычные прокси. Предположим, что у тебя есть приватный SOCKS-бот, и есть где взять загрузки. Перед тобой встанут следующие затруднения:
«Ну, и что же делать?», – спросишь ты. Так вот, сегодня я поведаю тебе об абсолютно новой концепции брута. Как обычно работает брутфорс? Он коннектится к прокси (SOCKS4/5 или HTTP(s)), передает им информацию, получает ответ и анализирует его. В нашем случае все будет по-другому — прокси коннектятся к брутфорсу, он вместо целого пакета логина передает только пару uin;password, и получает в ответ всего один байт – так мы уменьшаем объем переданной информации, и, следовательно, увеличиваем скорость. Пакет для логина собирается уже самой проксей, ею же анализируется ответ. Все предельно просто. Бот будет написан на чистом C++ и WinSock (я использую MS Visual C++ 2008 Express; кстати, только ради этого проекта я держу винду), а брутфорс – на C++ с фреймворком Qt, так как будет меньше возни, быстрее написание + кроссплатформенность, что очень актуально – вдруг я захочу юзать свое творение на линуксовом или бээсдешном дедике? Теория ICQКак происходит логин на сервер ICQ? Если брать небезопасный логин (где пароль передается в открытом виде, а нам как раз этот способ и нужен, поскольку так проще), то логин выглядит так: (здесь и далее: «->» – действие от нас, «<-» – действие со стороны сервера)
Как видишь, сервер первым «здоровается» с нами. Если первый байт от сервера не равен 0x2a, значит, мы приконнектились не к тому серверу. На четвертом шаге, если мы залогинились удачно, нам приходит пакет SRV_COOKIE, содержащий адрес BOS-сервера, и, собственно, куки для авторизации. Если неудачно – пакет с описанием ошибки. В любом случае, после передачи этого пакета нас дисконнектит (пакет отправляется по каналу 0x04, то есть CLOSE_CONNECTION). В протоколе OSCAR существуют три основных типа данных, ниже они перечислены в порядке «вложенности» – как в матрешке, начиная с самой маленькой:
Первый пакет, который мы должны отправить – CLI_IDENT:
ПрактикаПокаюсь – на практике из описанного реализовано пока далеко не все (в связи с катастрофической нехваткой времени), поэтому статья достаточно абстрактна, однако, даже если бы проект был полностью готов, исходников прибавилось бы немного – это же коммерческая тайна! Коннектиться к серверу мы будем по протоколу TCP (как к серверу с брутфорсом, так и к серверу ICQ). Для этого я написал небольшой класс, реализация которого абсолютно тривиальна, поэтому я покажу тебе только его объявление:
Один и тот же класс будет использоваться для двух объектов-сокетов. Сначала нужно приконнектиться к данному нам ICQ-серверу и проверить, является ли он ICQ-сервером: Далее, если все нормально – коннектимся к брутфорсу, и проверяем, а брутфорс ли это?
Если тут тоже все идет нормально – получаем UIN и пароль от сервера, и пытаемся залогиниться.
Чтобы не собирать пакет CLI_IDENT вручную, я собираю его из кусков, полученных с помощью ICQMenace – все части пакета, кроме UIN и Password, статичны и одинаковы при любом раскладе. Вот тебе полный дамп, «перегнанный» в C-style массив байт – а со сборкой пакета разбирайся сам :). Не буду раскрывать все карты, тем более тут уже указано, что и где должно быть: Далее мы получаем данные от ICQ-сервера, сверяемся, подошел пароль или нет, и отправляем ответ серверу, к примеру, 0 – подошел, 1 – не подошел, 2 – ошибка. БрутфорсПришло время писать серверную часть брутфорса на Qt. В Qt есть класс для создания TCP-сервера – QTcpServer. Посмотрим, какие методы нам от него потребуются:
Запускает прослушивание заданного порта на заданном интерфейсе. Советую оставлять интерфейс дефолтным (QHostAddress::Any) во избежание проблем с подключением.
Как только мы «поймаем» этот сигнал, мы можем «взять» сокет из очереди с подключенным к нему клиентом с помощью метода
Если в данный момент активных соединений нет, то функция вернет нулевой указатель. Далее от нас требуется просто писать в сокет данные и читать их (поочередно), например, так:
Идем дальше. Эта функция:
позволяет создавать приложения с использованием сокетов в блокирующем режиме – она возвращает управление только после того, как на сокете появятся данные, либо истечет время, равное msecs (в миллисекундах). Также, если мы хотим сделать все красиво и правильно, нужно дождаться отключения сокета до его удаления, то есть вызвать блокирующий метод waitForDisconnected(), и только после этого удалять объект. Также не забудь подключить модуль QtNetwork в файле .pro. Делается это так:
ЗаключениеНу вот, основы я тебе объяснил, дальше дерзай сам! Что тебе осталось сделать?
Кстати, ответ от ICQ-сервера в любом случае приходит по четвертому каналу (CONNECTION_CLOSE). Кроме того, могу посоветовать использовать UDP-сокеты для связи бота с сервером-брутфорсом – отправка таких пакетов менее палевна из-за отсутствия лишних соединений (это пригодится в случае, если ты надумаешь брутить на не совсем легальном дедике :)). С этим тебе поможет класс QUdpSocket. Само собой, брутить таким способом можно не только ICQ-номера; такой ботнет можно адаптировать для любого сервиса с авторизацией. CDИсходников не будет, так как, во-первых, целиком их у меня нет, во-вторых, коммерческая тайна :) WWW
WARNINGИнформация предоставлена исключительно в ознакомительных целях. |