Brute dediks по нов начин свеж подход към програмирането на RDP brute-forcers
Съдържанието на статията
В днешно време само мързеливите не са се опитвали да брутират dediks - за щастие има много инструменти за този бизнес . Най-известните са tss-brute from metal и ActiveX-базирани brute-forces, чиято еволюция беше инициирана от Dizz и аз миналата година. Всички останали груби сили са базирани на тези две - като tss-brute (RDP Brute от Dizz) предни части или клонинги на моя R&D P Brute. Тази година открих нов начин за отвличане на сървъри в Windows. Ако искате да знаете как, прочетете!
Изглежда, че всичко е наред - много груби сили, избирайте или не, но всички те не са без недостатъци.
И така, днес ще ви разкажа как успях да напиша груба сила, която работи на всяка операционна система от семейството на Windows NT, без да използва никакви външни компоненти - всъщност работи директно с RDP протокола версия 5!
Дебрифинг
През есента на 2009 г. сериозно се замислих да напиша нова груба сила. Започнах да търся документация за RDP протокола и, разбира се, не намерих нищо. И тогава се сетих, че има такъв проект като rdesktop - RDP клиент под nix, който работи с X сървър и може автоматично да въвежда потребителско име и парола. Аз изтеглих източниците и започнах да ги изучавам. Невъзможно е просто да се копират няколко функции поради специфичната структура на програмата, затова реших да ги пренапиша във формата, от която се нуждая. След като прекарах около седмица, вкарах по този въпрос. След известно време един от моите чуждестранни познати, който се интересуваше от написването на добра груба сила от мен, ми изпрати интересна информация - кръпка, която превръща rdesktop в груба сила. Изглежда, ето го, щастието, но го нямаше! Brut се оказа еднонишков според списъкапароли и работеше само под Linux, което изобщо не ни устройваше. За пореден път проектът беше оценен. Няколко месеца по-късно случайно попаднах на pudn.com на winRDesktop, порт Windows на rdesktop, като проект за MS Visual Studio. Беше точно това, от което имах нужда и се заех да превърна безобиден софтшел в убийствена груба сила.
Като начало трябва да решим как точно ще изглежда нашата програма. След като разгледах много опции, се спрях на една - грубата сила се състои от две части:
- Модифициран winrdesktop, към който се предават потребителското име, паролата и IP на сървъра. Опитва се да влезе и връща резултата.
- GUI е предният край, който управлява цялата тази доброта: той въвежда многопоточност, позволява ви да сканирате IP диапазони и гарантира работата на ICQ бота. GUI ще бъде написан на C++ с Qt framework.
Вероятно имате въпрос относно бота - как да го внедрим, ако има наистина работещи компоненти за ICQ само под Delphi/BCB? Ще ви разкрия една малка тайна - има QOSCAR Qt-клас за работа с ICQ (написан между другото от мен) и се намира на qoscar.googlecode.com. Тази статия не обхваща писането на бот, всичко е изключително просто и вие (надявам се) можете сами да се справите с този проблем. Това е всичко, лиричното отклонение настрана, нека започнем да кодираме!
Разработчици, разработчици, разработчици!
Като начало трябваше да намеря източниците на WinRDesktop'a. Задачата не беше лека и убих половин ден да измисля как да ги изтегля от един "PUDN". След това намерих корекция, която превръща Rdesktop в груба сила. Но ние нямаме Rdesktop! Няма значение - ще закърпим с ръце софтинката. Стартирайте Visual Studio 2008 (VC++ 2008 също ще работи)Express, но Professional има по-хладен компилатор, така че ви съветвам да го използвате, особено ако сте студент - можете да го вземете безплатно от DreamsPark) и отворете нашия проект. Проектът първоначално е проектиран за VC 9, така че без танци с тамбура във версии, по-млади от VS2008, няма да работи.
Първо, нека добавим няколко константи към файла rdesktop.h, които ще помогнат на програмата да разпознае резултата от паролата. Между другото, корекцията има функция за груба сила за сървъри под Win 2k, но използва четвъртата версия на протокола, която не поддържа автоматично влизане, така че пропускът се въвежда чрез емулиране на бутони . Това не ни устройва, така че няма да поддържаме Win 2000.
Как работи разпознаването? Много е просто - пакетът , получен от клиента, се сравнява байт по байт с някои сигнатури и въз основа на тези сигнатури се прави заключение за успех / неуспех при отгатването на паролата. Например, #define LOGON_AUTH_FAILED"\xfe\x00\x00" означава, че паролата е въведена неправилно. Други константи, които можете да надникнете в кода. Значението на константите трябва да е ясно от името. Ако не, защо четете това? 🙂
След това коригираме рутината process_text2() от файла orders.c. Именно в него се разпознава резултатът от въвеждането на паролата. Въпреки че всъщност не само в него - често при успешно влизане сървърът изпраща пакет със съобщение за това - PDU_LOGON.
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);
Този код трябва да бъде въведен в самото начало на процедурата.
Нека обясня действието му.
process_text2() обработва пакета, в който идватекст от сървъра (което е очевидно от името му), в който сравняваме получения текст с някои предварително известни последователности по време на влизане. Последната стъпка е да отворите rdp.c и да потърсите процедурата process_data_pdu(). В него се интересуваме от част от кода, започващ с "case RDP_DATA_PDU_LOGON:". Просто поставете ExitProcess(4) след него. Защо се нуждаем от ExitProcess() - прочетете нататък.
И така, с настройката на winRdesktop'a, ние го разбрахме. Ако мислите , че най-трудното е зад гърба ви, дълбоко грешите. Най-трудното тепърва предстои.
Първият проблем, с който трябваше да се сблъскам, беше появата на прозореца на приложението при стартиране. Не ни трябва, затова смело правим ShowWindow с параметър SW_HIDE.
Вторият проблем е как грубата сила може да комуникира с външния свят, как ще ни информира за резултата от проверката? Printf() и така нататък не работят, писането на във файл не е готино. Най-простият и в същото време надежден метод е да прекратите приложението с различни ExitCodes. Например ExitProcess(4) ще бъде извикан при правилна парола, ExitProcess(2) при неправилна парола и ExitProcess(3) при неуспешна връзка. Казано, сторено (можете да видите резултата в process_text2() на страничната лента).
Третият проблем, който не успях да разреша - нецифрово потребление на ресурси. Гледайки напред, ще кажа, че 30 нишки зареждат 100% от процесора на моя MSI Wind u90. Това се дължи на разопаковането на растерните изображения (RDP сървърът силно компресира изображенията). Изрязах всички (по мое мнение) ненужни части от код с разопаковане и рисуване върху формуляра (защо да рисуваме върху формуляра, ако не го виждаме?), което позволи да се намали малко потреблението на ресурси, но все още не реши проблема . Ако сте страхотен C кодер и виеще бъде възможно да се намали апетита на разопаковащия, не забравяйте да ме уведомите за това :).
Четвъртият и последен проблем е липсата на символи, различни от английската азбука и цифри. Не успях да науча брутфорс да разбира кирилица , въпреки че може би е за добро - не си струва да брутфорсирате български сървъри :).
Бруту - боже!
По принцип brute force вече е готов, но е еднонишков - също като brute force от метал. Можете, разбира се, да пишете групови файлове, за да изпълнявате brute, но ние сме готини хакери, искаме да премахваме десетки dedics на ден и затова имаме само един изход - да напишем front-end. Като инструмент избрах ... не, не сега модерен C #, но моя любим (и много по-обещаващ, според мен) Qt Framework. В ][ вече е писано повече от веднъж, така че не виждам причина да описвам всичките му предимства. След това предполагам, че вече знаете как да работите с тази рамка. Ако не, съветвам ви да прочетете официалната документация на Qt на qt.nokia.com и, в задължителната редност, книгата на Summerfield и Blanchett (служители на Qt Software, един от тях прави документация пъти, така че книгата е страхотна).
Стартираме Qt Creator (съветвам ви да използвате моментни снимки - те не са по-бъги от стабилните версии, но са по-удобни и съдържат всички предстоящи иновации). И така, нека създадем нов GUI проект с една джаджа. Дизайнът е личен въпрос, можете да видите това на екранната снимка. какво ми се случи.
Първо, нека начертаем малък план.
- Основната нишка започва помощна нишка.
- Помощната нишка изпълнява .exe, който написахме по-рано, и чака резултата.
- Когато изпълнението с груба сила приключи, нишката излъчва сигнал, който се обработва от основната нишка, отнемаслед потребителско име и парола и отива на стъпка 2.
За спомагателни нишки написах класа BruteThread, който всъщност не е нишка, защото не наследява от QThread, а използва само асинхронни методи за извършване на действия, които отнемат много време. BruteThread изпълнява нашия модифициран winRDesktop, използвайки обекта процес на класа QProcess. Класът QProcess е проектиран да изпълнява външни приложения и може да стартира приложението, да изпрати неговия изход към конзолата (какво се извежда чрез printf или cout, например), да наблюдава промените в състоянието и да прекрати процеса. Ние се интересуваме само от стартиране и прекратяване на приложението - ако се случи едно от тези събития, се излъчват съответно сигналите void started() и void finished(int exitCode). Обърнете внимание на последния сигнал - в той предава кода, с който е завършено приложението като параметър - и този параметър ще ни бъде много полезен. Ще обработим само втория сигнал и можете да видите кода на слота в страничната лента „Signal onFinished()“. В него нишката излъчва съответните сигнали и преминава към следващата комбинация за влизане и парола.
Самият процес изглежда така:
Стартиране на бруталния процес
QStringList slArgs; slArgs
Както можете да видите, аргументите на процеса се предават на QStringList, което е много удобно :). И, разбира се, не забравяйте веднага да прикачите сигнала към слота в конструктора на класа:
Ето как изглежда основният слот за нишка, който обработва резултатите:
Резултатите от обработката в основната нишка
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("Добър", QString("%1:%2;%3").arg(sServer).arg(sUser).arg(sPassword)); > друго ако ( iResult == -1 ) iBad++; iChecked++; >
Това е всичко! Останалото трябва да завършите сами, а ако не можете, не се колебайте да погледнете в моите изходни файлове на диска. Само не се надявайте, че можете да отворите проекта, да промените имената на бутоните и да правите пари на Hammer, като продадете новия грубиян - той има няколко елементарни трика и ако сте хлапе скриптове, няма да можете да компилирате проекта. Е, ако знаете как да работите със C поне основно, тогава мисля, че няма да ви създаде проблеми :).
Стигнах до това решение след масово прекомпилиране на моя R&D P Brute, след като изложих източниците му, ученици (да не се бъркат с ученици!), които извършваха сексуални действия с мозъка ми при най-малкия проблем ("Но имам грешната версия на mstscax.dll, какво да правя??", "Какво означава ShowMessage(). "). Един от хората, между другото, сам призна, че няма brain.dll и hands.lib (благодарение на sslBot за дневника, цвилен сърдечно). Е, отклонихме се.
Общо имаме два неразрешени проблема, чието отстраняване поверявам на вас:
- Консумация на ресурси.
- Поддръжка на кирилица (чисто спортен интерес, пак повтарям - не носете българските сървъри).
По този въпрос, нека си дам почивка. Приятно кодиране!
Благодаря
Бих искал да благодаря на следните хора за тяхната помощ при написването на brutus: