W założeniu twórców, CORBA (Common Object Request Broker Architecture) jest architekturą niezależną od producentów sprzętu i oprogramowania, pozwalająca współpracować różnym aplikacjom dzięki sieci komputerowej. Pozwala zintegrować maszyny od potężnych systemów typu mainframe, po niewielkie maszyny przenośne typu handheld. Podstawą technologii jest język IDL służący do zdefiniowania interfejsu. Oczywiście język ten jest niezależny od używanych języków programowania. Pozwala to nie tylko na współpracę maszyn o różnych architekturach, ale także programów pisanych w różnych językach.
Doskonałym przykładem obrazującym możliwości takiej architektury, jest zlecanie przez maszyny klienckie czasochłonnych operacji szybkim maszynom, serwującym takie usługi. Z technicznego punktu widzenia, program uruchomiony na serwerze, powinien udostępniać pewien obiekt. Zdefiniowany w języku IDL interfejs pozwala programom klienckim poznać składnię dostępnych metod, oraz typy udostępnionych własności.
Jako przykład wykorzystania technologii CORBA, stworzony został program Password Cracker, służący do łamania haseł metodą siły. Pozwala on na rozszyfrowanie zadanego hasła, które przekształcone zostało za pomocą najpopularniejszych haszujących funkcji jednokierunkowych. Obecnie stosuje się funkcje MD5 (Message Digest 5), oraz jej ulepszoną wersję SHA (Secure Hash Algorithm). Dokonują one odpowiednio przekształcenia hasła w ciągi 128-bitowe i 160-bitowe. Stopień skomplikowania tych algorytmów praktycznie uniemożliwia znalezienie funkcji odwrotnych w sensownym czasie. Przeprowadzane przez te funkcje operacje można porównać do rozbierania mechanizmu zegarka na części. Operacją odwrotną byłoby natomiast złożenie takiego zegarka przez laika.
Typowo hasło może składać się z określonej liczby znaków alfanumerycznych. Najprostsza jego forma składa się ze ściśle określonej liczby cyfr. Często hasło tego typu zwane jest kodem PIN (Personal Identification Number). Stosowane jest powszechnie wraz z kartami kredytowymi, telefonami komórkowymi, prostymi zamkami szyfrowymi, oraz innymi systemami wyposażonymi w klawiaturę zawierającą jedynie kilkanaście klawiszy.
Prawie wszystkie systemy umożliwiają samodzielny dobór hasła, tak by jego zapamiętanie nie stanowiło dla użytkownika dużego problemu. Poniżej przedstawiono tabelę, pokazującą statystykę wyboru haseł na podstawie zbioru o liczności 15000 elementów.
Typ hasła |
Udział procentowy |
Typ hasła |
Udział procentowy |
Nazwa
użytkownika/konta |
2,7% |
Film
i aktorzy |
0,1% |
/usr/dict/words |
7,4% |
Filmy
rysunkowe |
0,1% |
Liczby |
0,1% |
Sławni
ludzie |
0,4% |
Nazwy
miejsc |
0,6% |
Fantastyka |
0,4% |
Nazwy
pospolite |
4,0% |
Przydomki |
0,1% |
Imiona
kobiet |
1,2% |
Terminy
sportowe |
0,2% |
Imiona
mężczyzn |
1,0% |
Nazwy
maszyn |
1,0% |
Mity
i legendy |
0,5% |
Gwiazdy |
0,1% |
Wszystkie z przedstawionych powyżej haseł należy zakwalifikować do grupy bardzo prostych. Dla znalezienia takich haseł, wystarczy posłużyć się metodą słownikową. Jednakże jedynie 7,4% wybieranych haseł stanowi podstawową formę wyrazu zawartego w średniej wielkości słowniku. Zatem szanse na znalezienie szukanego hasła w ten sposób nie są duże.
Okazuje się, iż prościej i pewniej jest zlecić komputerom wypróbowanie wszystkich możliwości. Dodatkową zaletą jest znajomość czasu sprawdzania wszystkich możliwości. Niestety, chociaż z drugiej strony na szczęście, jak wszystkie metody przeglądu zupełnego, także i Brutal Force jest operacją wielce czasochłonną. Ilość kombinacji zależy w tym przypadku od jakości hasła. Na jakość hasła składa się:
§ rozmiar użytego alfabetu,
§ długość hasła,
§ niepospolitość hasła.
Jako alfabet używany jest najczęściej zbiór cyfr [0-9] (liczność alfabetu równa 10), liter [A-Z] (liczność 26) bądź zbiór znaków alfanumerycznych [A-Z|0-9] (liczność 36). Poszerzenie alfabetu zyskuje się poprzez rozróżnianie dużych i małych liter. Większość systemów komputerowych dodatkowo pozwala na wprowadzanie dodatkowych znaków specjalnych, co jeszcze bardziej poszerza dostępny zbiór znaków.
Ilość kombinacji w jeszcze większym stopniu zależy od długości hasła. Ilość możliwych do uzyskania haseł jest funkcją wykładniczą, gdzie w podstawie znajduje się wielkość alfabetu, a w wykładniku długość hasła. Niniejszą zależność przedstawia powyższy wykres. W poniższej tabeli przedstawiono natomiast statystykę długości stosowanych haseł. Wykonano ją bazując na grupie 1400 rzeczywistych haseł.
Długość hasła |
Udział procentowy |
|
1 znak |
0,57% |
|
2 znaki |
3,21% |
|
3 znaki |
4,71% |
|
4 znaki |
9,71% |
|
5 znaków |
17,21% |
|
6 znaków |
25,29% |
|
7 znaków |
15,43% |
|
8 znaków |
12,07% |
|
9 znaków |
5,79% |
|
10 znaków |
2,29% |
|
11 znaków |
1,29% |
|
12 znaków |
0,79% |
|
13 znaków |
0,71% |
|
14 znaków |
0,21% |
|
15 znaków |
0,14% |
|
16 znaków |
0,7% |
System, na podstawie którego zebrano powyższe informacje, nie narzucał ograniczeń na długość hasła. Fakt używania najczęściej haseł o długości sześciu znaków, potwierdzają też wyniki z innych źródeł. Posługując się metodą łamania siłowego, hasła można złamać w średnim czasie
,
gdzie n to liczba możliwych do uzyskania haseł, a t jest czasem potrzebnym na wypróbowanie każdego z nich. Już dla 36-znakowego alfabetu i haseł 12-znakowych czas ten jest na tyle duży, że obecne maszyny nie są w stanie znaleźć rozwiązania w realnym czasie. Wszystko to oczywiście po spełnieniu trzeciego z warunków wpływających na jakoś hasła. Jeśli hasło tworzy pospolity wyraz, znajdujący się w słowniku, to może ono zostać złamane w przeciągu kilku sekund.
Ponieważ czas złamania hasła może dochodzić nawet do kilku miesięcy, rozwiązaniem pozwalającym na jego skrócenie, jest praca równoległa kilku maszyn. Do tego celu można właśnie wykorzystać mechanizmy technologii CORBA. Napisany program składa się z serwera odpowiedzialnego za samo sprawdzanie poszczególnych haseł, oraz klienta zlecającego mu to zadanie. Klient określa przestrzeń haseł, która ma zostać sprawdzona, oraz informowany jest o postępach. Możliwe jest zatem zlecenie poszukiwania hasła maszynie dużo szybszej, lub też rozbicie zadania na kilka mniejszych i zlecenie poszukiwania go na kilku maszynach równocześnie.
Serwer dla obiektu TPasswordCracker, tworzy interfejs IPasswordCracker. Zostaje on zdefiniowany w języku IDL.
[
uuid(FAD50805-3843-4102-9EEA-B13FEDB99743),
version(1.0),
helpstring("PasswordCracker Library")
]
library Server
{
importlib("stdole2.tlb");
importlib("STDVCL40.DLL");
[
uuid(BB329110-511F-4360-A61E-DA9AE8D54AAB),
version(1.0),
helpstring("Dispatch interface for PasswordCracker
Object"),
dual,
oleautomation
]
interface IPasswordCracker: IDispatch
{
[propget, id(0x00000002)]
HRESULT _stdcall DecodedPassword([out, retval] LPSTR * Value );
[id(0x00000003)]
HRESULT _stdcall Crack([in] LPSTR Password, [in] LPSTR
Alphabet, [in] unsigned char LengthFrom, [in] unsigned char LengthTo, [in]
unsigned char Algorithm );
[propget, id(0x00000004)]
HRESULT _stdcall Progress([out, retval] short * Value );
[propget, id(0x00000005)]
HRESULT _stdcall Finished([out, retval] long * Value );
[propget, id(0x00000001)]
HRESULT _stdcall Remained([out, retval] long * Value );
};
[
uuid(63341EC0-6B3D-4F36-BB91-7DE279822738),
version(1.0),
helpstring("PasswordCracker Object")
]
coclass PasswordCracker
{
[default] interface IPasswordCracker;
};
};
Obiekt udostępnia metodę Crack(Password, Alphabet, LengthFrom, LengthTo, Algorithm) uruchamiającą proces łamania hasła. Przekazywane parametry jednoznacznie określają zadaną przestrzeń haseł.
§ Password - służy do przekazania hasła w postaci zaszyfrowanej
§ Alphabet - zawiera alfabet użyty do generowania haseł
§ LengthFrom, LengthTo - określają długość haseł jakie mają zostać sprawdzone
§ Algorithm - określa rodzaj algorytmu, którym zostało zaszyfrowane hasło (MD5 lub SHA)
Obiekt udostępnia również kilka właściwości. Wszystkie one są tylko do odczytu.
§ DecodedPassword - zawiera złamane hasło
§ Progress - określa postęp wyrażony w procentach
§ Finished - flaga ustawiana po zakończeniu procesu wyszukiwania
§ Remained - określa ilość haseł, które pozostały jeszcze do sprawdzenia
Serwer do uruchomienia wymaga zainstalowanego pakietu VisiBroker 3.3 lub nowszego. Uruchomiona powinna być usługa Visibroker Activation Daemon oraz Visibroker Smart Agent. Poprawnie uruchomiony serwer zgłasza się otwierając okno z komunikatem Waiting.
Klient aby zlokalizować komputer oferujący wybrany obiekt, korzysta z usług serwisu Smart Agent, uruchomionego po stronie serwera. Nie wymaga on jednak zainstalowania całego pakietu. Wystarczą mu biblioteki: "borlandmm.dll", "cp3245mt.dll", "orb_br.dll", "orbpas50.dll".
Po uruchomieniu programu klienta, pokazuje się okno główne. W sekcji Data należy podać zaszyfrowane hasło, oraz określić rodzaj algorytmu użytego do jego zaszyfrowania.
W grupie Parameters należy określić alfabet stosowany do generowania haseł. Można wybrać taki, który składa się z cyfr, małych liter, dużych liter, bądź znaków specjalnych. Wszystkie te wybory można łączyć. Dodatkowo możliwe jest zdefiniowanie własnych znaków tworzących alfabet. Również w tej grupie należy podać zakres długości haseł jakie mają zostać sprawdzone.
Ostatnia grupa Progress ma charakter informacyjny. Po uruchomieniu pokazuje ona postęp procedury przeszukującej przestrzeń haseł. Informuje o ilości sprawdzanych haseł na sekundę, oraz określa szacunkowy czas jaki pozostał do zakończenia przeszukiwania całej przestrzeni.
Przycisk Crack służy do rozpoczęcia poszukiwań. Stop przerywa tę operację. About otwiera okno informacji o programie, a Quit kończy działanie programu.
Wszelkie ostrzeżenia, błędy, oraz informacje, program zgłasza użytkownikowi otwierając osobne okna. Ponieważ metoda Crack() zamraża bieg programu, konieczne okazało się uruchomienie osobnego wątku, służącego do obsługi przycisku Stop, oraz do odświeżania informacji o postępie. Klient w trakcie łamania hasła, odpytuje serwer, odczytując własności Progress, Remained, oraz Finished. Ta ostatnia służy do synchronizacji obu wątków działających po stronie klienta. Serwer wykonany w technologii CORBA automatycznie dzieli się na wątki, gdy w jednym czasie zapytanie zgłasza więcej niż jeden klient.