Home

Szukaj

Statystyka

gości: 22571

Polls

Czy podoba Ci się ta strona?
 
Łamanie haseł MD5
        Naszła mnie jakiś czas temu ochota na przygotowanie systemu do łamania haseł MD5. Metoda jest bardzo prosta. Bierzmy słownik, obliczamy skróty MD5 wszystkich słów w słowniku a następnie wyszukujemy odpowiedniego wpisu. Długo nie mogłem znaleźć odpowiedniego słownika w sieci aż w końcu wpadłem na pomysł wykorzystania słownika ortograficznego dostępnego w Open Office. Wersja tego słownika zawiera około 280 tyś haseł. A więc odnajdujemy plik pl_PL.dic słownika (siedzi gdzieś w katalogu z OO). Jest to plik tekstowy gdzie każde słowo umieszczone jest w nowej linii. Zabawę psuje nam fakt, że nie które linie zawierają inne informacje po znaku /. A by je usunąć można wykorzystać awk:
{
split ($0,tab,"/")
print tab[1]
}
wywołując go tak:
awk -f go.awk pl_PL.dic >> clear_dic
Rozwiązanie to ma wadę. Dla linii bez znaku / zwraca napis ze znakami końca wiersza ale gdy awk wytnie nam pierwsze bajty do / to otrzymamy napis bez tych znaków. Nie bardzo wiedziałem jak to naprawić więc przerzuciłem się na prosty program w C.
#include <stdio.h>
#include <stdlib.h>
#define LINE_SIZE 200
int main()
{
   char line[LINE_SIZE];
   FILE *fp = fopen("pl_PL.dic","r");
   if(!fp)
   {
      perror("Nie moge otworzyc pliku");
      return 1;
   }

   FILE *out = fopen("clear_dic","w");
   
while(fgets(line,LINE_SIZE,fp)!=NULL) {
      int firstword=strcspn(line,"/");
      char ff[LINE_SIZE];
      if(firstword==strlen(line))
      {
            strncpy(ff,line,firstword);
            ff[firstword-2]='\n';
            ff[firstword-1]='\0';
            strcpy(line,ff);
      }
      else
      {
            strncpy(ff,line,firstword);
            ff[firstword]='\n';
            ff[firstword+1]='\0';
            strcpy(line,ff);
      }
      printf(line);
      fprintf(out,"%s",line);
      }

   close(out);
   close(fp);
}
         Mając już plik bez śmieci możemy wygenerować zapytania do bazy danych. Ja użyłem PostgreSQL. Skrypt w bash ma postać: 
rm out for line in `cat clear_dic`;
do
    result=$(echo -n $line |/usr/bin/md5sum);
    md5=$(echo $result | cut -d ' ' -f 1);
    echo $line;    
echo "INSERT INTO data VALUES ('$line','$md5');" >> out;
done
Tabela może wyglądać tak:
 CREATE TABLE data ( word text, md5 text );
       Teraz mamy już gotowy plik z 280 tyś zapytaniami do bazy. Dodawanie rekordów trwało około 10 minut. Generacja zapytań w bashu około 3 godzin. Czyszczenie pliku z śmieci kilka sekund (Celeron M 1,4). Odpalamy jakiś program wspomagajacy dostep do bazy i możemy pytać:  SELECT word FROM data WHERE md5=tu_wpisujemy_skrót  po 300ms otrzymujemy odpowiedz :) Metoda może nie zbyt skuteczna na 40 użytkowników złamałem 5 haseł - satysfakcja gwarantowana. W sieci znajdziecie podobne „lepsze” metody łamania MD5 z wykorzystaniem tęczowych tablic.
 
« poprzedni artykuł   następny artykuł »