W 2020 roku napisałem artykuł o tym, że używanie numeru PESEL jako hasła do PDF-a nie chroni skutecznie jego zawartości. Pokazałem, jak na domowym komputerze z przeciętną kartą graficzną przełamać takie zabezpieczenie w kilkanaście sekund.
Gdy natrafiłem na informację o wymyślnym schemacie konstruowania hasła chroniącego PDF-a z rocznym podsumowaniem rachunku PKO TFI, postanowiłem powtórzyć ów eksperyment – tym razem przy użyciu szybszej karty graficznej. Czy wyniki różniły się znacząco? Sprawdźmy!
Wydajność karty graficznej
Przesiadka z GeForce GTX 1660 Super na RTX 3060 Ti oznacza przyrost mocy obliczeniowej o około 40-60%. Pierwsze zaskoczenie przeżyłem więc, gdy na nowszym sprzęcie powtórzyłem atak słownikowy z poprzedniego artykułu – trwał dokładnie tyle samo czyli dwadzieścia kilka sekund. Okazuje się, że hashcat nie zawsze będzie w stanie wykorzystać większą liczbę rdzeni w nowszym modelu karty – niektórych obliczeń nie jest w stanie bardziej zrównoleglić.
Powtórka ataku typu brute force, opisanego pod koniec cytowanego tekstu, potwierdziła jednak poprawność nowej konfiguracji. Na RTX 3060 Ti osiągnąłem przeszło trzy miliardy haseł na sekundę – to 57% więcej, niż poprzednio. Uzbrojony w tę wiedzę przystąpiłem do działania.
Konstrukcja hasła do PDF-a od PKO TFI
Można podejrzewać, że nad konstrukcją hasła do PDF-a z rocznym podsumowaniem stanu rachunku PPK ktoś spędził dłuższą chwilę. Zacytujmy fragment maila, do którego załączony był dokument:
Ze względów bezpieczeństwa załącznik został zaszyfrowany, aby uniemożliwić dostęp do pliku osobom trzecim. Hasłem dostępu do pliku jest ciąg 11 znaków wyznaczonych w oparciu o imię i nazwisko oraz datę urodzenia. Wprowadź je w następującej kolejności:
MM
– miesiąc urodzeniaAB
– pierwsza i ostatnia litera imienia [wielka litera]RRR
– trzy ostatnie cyfry z roku urodzeniaAB
– pierwsza i ostatnia litera z nazwiska [wielka litera]DD
– dzień urodzenia.Przykład: imię i nazwisko: Jan Testowy, data urodzenia: 3 lipca 1965 r. → hasło do pliku:
07JN965TY03
.
Czy takie fikołki mają sens? Wrócimy do tego później, teraz mamy hasło do złamania!
Łamanie hasła – podejście naiwne
Do łamania hasła użyjemy, jak poprzednio, aplikacji hashcat. Nie pracuje ona bezpośrednio na szyfrowanych plikach, lecz na tzw. skrótach (hash). Ich pokonanie daje możliwość rozszyfrowania pierwotnego pliku.
Do wyciągnięcia hasha użyjemy skryptów pdf2john.py (Python) albo pdf2john.pl (Perl) z pakietu John the Ripper jumbo. Efektem jest kilkusetznakowy ciąg znaków wyglądający jakoś tak:
$pdf$5*6*256*-4*1*16*374c3ec1c2ecf64a8216ad654ade88c5*48*d82daacd1e1560a34de1a0893c93fd4b9af [...] 4c05ba6fdcb62c8979cbd3f5b7274703755
Wrzucamy ten ciąg do pliku hash.txt i odpalamy hashcata ze wzorcem hasła. Przykładowe hasło to 07JN965TY03, dla nas wzorcem będzie ciąg cyfr (w komendzie hashcata: „?d”) i wielkich liter („?u”).
Będziemy uruchamiać komendę
hashcat.exe -m 10700 -O -a 3 hash.txt ?d?d?u?u?d?d?d?u?u?d?d
Znaczenie poszczególnych parametrów, patrząc od końca:
?d?d?u?u?d?d?d?u?u?d?d
– wzorzec hasła do złamaniahash.txt
– plik ze skrótem-a 3
– wariant obliczeń korzystający ze wzorca hasła-O
– użycie zoptymalizowanych modułów obliczeniowych-m 10700
– użycie trybu nr 10700
Ten ostatni parametr określimy sprawdzając wersję pliku PDF albo zaglądając na stronę z przykładowymi hashami. Widzimy, że początek naszego skrótu ($pdf$5*6
) odpowiada tam pozycji PDF 1.7 Level 8 i wariantowi obliczeń nr 10700.
Gdy uruchomimy hashcata, oczom naszym ukaże się następujący widok:
Szacowany czas sprawdzenia wszystkich kombinacji wynosi ROK I DZIEWIĘĆ MIESIĘCY! Co tu się wydarza? Przecież w poprzednim artykule łamaliśmy PDF-a chronionego numerem PESEL w kilkanaście sekund!
Nie tylko ja byłem zaskoczony, połowa głosujących w twitterowej ankiecie stawiała na minutę lub mniej.
Czemu tak powoli?!
Ano, różne typy PDF-ów są łamane z różną wydajnością. Co więcej – nowszy nie zawsze znaczy lepszy. Mój sprzęt będzie łamać hasła z następującą prędkością:
- PDF 1.1 – 1.3 – dziesięć miliardów prób na sekundę
- PDF 1.4 – 1.6 – trzydzieści siedem milionów prób na sekundę
- PDF 1.7 Level 3 – cztery miliardy prób na sekundę
- PDF 1.7 Level 8 – dziewięćdziesiąt tysięcy prób na sekundę
Między „dziewięćdziesiąt tysięcy” a „dziesięć miliardów” jest taka różnica, jak między jedną sekundą a trzydziestoma godzinami. Znamy już więc źródło problemu – PKO TFI użyło wariantu najbardziej odpornego na atak siłowy.
Łamanie hasła – podejście nieco sprytniejsze
Nasz wzorzec hasła był bardzo naiwny – wszystkie możliwe kombinacje dużych liter i cyfr na wskazanych pozycjach. Niektóre sprawdzaliśmy niepotrzebnie, bo nie ma miesięcy o numerze większym niż 12 albo dni o numerze większym od 31. Skonstruujmy lepszy wzorzec.
Na początku hasła jest miesiąc. Zdefiniujmy (pierwszy) specjalny typ oznaczający jedynie cyferki „zero” i „jeden”. W komendzie hashcata będzie to opcja -1 01
, zaś fragment wzorca przyjmie postać ?1?d
. Oszczędzamy 8/10 czasu.
Potem mamy dwie litery imienia a potem trzy ostatnie cyfry roku urodzenia. Plik do badań dostałem od obcego mężczyzny, ale zakładam, że urodził się między rokiem 1970 a 1999. Definiuję więc specjalny typ (drugi) z cyferkami „7”, „8” i „9” za pomocą opcji -2 789
, odpowiednia część wzorca przyjmie postać 9?2?d
. Dziewiątka na początku to po prostu dziewiątka, bez innych wariantów dopasowania. Skoro uwzględniamy jedynie 30 z 1000 lat, oszczędności wynoszą kolejne 970/1000 czasu.
Numer dnia miesiąca na końcu – analogicznie. Wycinamy nieistniejące możliwości, trzeci typ specjalny to -3 0123
, fragment wzorca to ?3?d
. Nadal będziemy przeprowadzać niepotrzebne obliczenia dla dni nr 32-39, ale numery od 40 w górę są wycięte. Tu oszczędzamy jeszcze 6/10 czasu.
Nasz nowy wzorzec będzie miał postać ?1?d?u?u9?2?d?u?u?3?d
a cała komenda to:
hashcat.exe -1 01 -2 789 -3 0123 -m 10700 -a 3 -O hash.txt ?1?d?u?u9?2?d?u?u?3?d
Jest bez porównania lepiej! Całą przestrzeń przeszukiwania przejrzymy w półtorej doby! To nadal sporo w porównaniu do kilkunastu sekund, ale postęp jest niewątpliwy.
Czy da się jeszcze szybciej?
Ze strony dane.gov.pl pobrałem listę imion występujących w rejestrze PESEL by sprawdzić, czy sens ma eliminacja par liter nie stanowiących początku i końca żadnego istniejącego imienia. Porzuciłem ten pomysł, bo wszystkich kombinacji liter mamy 676 (26*26, założyłem brak polskich znaków diakrytycznych w haśle) a szybkie sprawdzenie imion dało mi ponad 600 legalnych par znaków.
Jak wyeliminować ze wzorca „ogony” takie, jak dzień numer 32 albo miesiąc nr 13? Można wywalić wzorzec i przekazać do hashcata plik z wszystkimi możliwymi hasłami. Byłoby to jednak niepraktyczne, bo ponad 5 miliardów 11-znakowych haseł zajęłoby na dysku przeszło 60 GB.
Możemy jednak utworzyć hashcatowi dwa słowniki – jeden z początkiem hasła, drugi z końcówką. Generator takich połówek umieściłem na Githubie, jest to krótki programik w języku C#.
Pierwszy tworzony plik zawiera 243 tysiące wariantów pierwszych siedmiu znaków, od 01AA970
do 12ZZ999
. Drugi plik zawiera ponad 20 tysięcy wariantów czterech ostatnich znaków, od AA01
do ZZ31
. Hashcat samodzielnie wygeneruje sobie wszystkie 5 miliardów kombinacji, łącząc każde rozpoczęcie z każdą końcówką.
Po uruchomieniu komendy
hashcat.exe -m 10700 -a 1 -O hash.txt dict1.txt dict2.txt
dowiadujemy się, że wybrany zakres potencjalnych haseł zostanie przejrzany w 18 godzin. Tu niewiele dałoby się już urwać, więc nastawiłem hashcata i poszedłem spać.
Kilka chwil po tym, gdy zasiadłem rano przed ekranem, wycie wentylatora ucichło a oczom mym ukazało się 11-znakowe hasło zaczynające się od 06A……
Czy hasło zadziałało? Jakżeby inaczej!
Czy da się uszczknąć coś jeszcze?
Prognozowane 18 godzin na przejrzenie wszystkich kombinacji to w średnim przypadku 9 godzin pracy mojego komputera. Miałem lekkiego farta, bo sukces przyszedł po niecałych 8 godzinach. Oczywiście tę pracę da się dzielić na większą liczbą silniejszych kart graficznych. Dwie sztuki RTX 4090 złamałyby każdego PDF-a od PKO TFI w jakieś dwie i pół godziny.
Możemy też dostroić słowniki haseł stosownie do wiedzy płynącej z demografii i ekonomii. Jeśli omawiane dziś dokumenty otrzymują głównie ludzie w wieku 25-45 lat, możemy wystawić na początek testowane hasła z ich rocznikami. Jeśli znamy płeć odbiorcy, możemy użyć słowników dla kobiet lub mężczyzn (litera „a” na końcu imienia promowana albo spychana na koniec).
Poza tym jednak zdziałamy niewiele. Przy tej wersji PDF-a nawet atak na 11-znakowe hasło o znanym wzorcu trwa długie godziny.
Czy PKO TFI zrobiło dobrą robotę?
Użyteczność systemów informatycznych to zawsze balans między bezpieczeństwem a wygodą. W idealnym świecie losowe hasło z 20 dużych i małych liter zapewniłoby dokumentowi absolutną poufność, ale takiego hasła nikt nie zapamięta. W idealnym świecie trafiłoby do menedżera haseł, w prawdziwym świecie – na żółtą karteczkę pod klawiaturą.
Owszem, dobrze byłoby pozwolić zainteresowanym podać własne hasło szyfrowania o samodzielnie określonej złożoności, ale domyślne hasło wytrzymujące kilkanaście godzin łamania spełnia swoją rolę. Pamiętajmy, że wyciąg z rachunku PPK zawiera jedynie adres korespondencyjny i informacje o zarobkach, a to zestaw informacji, który raczej i tak zostanie ujawniony podczas wycieku danych albo włamania na skrzynkę e-mailową.
Jedyne, co budzi pewne rozbawienie, to sam schemat konstrukcji hasła. Może przeplatanie cyfr i liter ma budzić iluzję bezpieczeństwa, wynikającą w jakiś sposób ze skomplikowania schematu? Tak to jednak nie działa. Jeśli przykładowe hasło Jana Testowego zmieni postać z 07JN965TY03 na 9650703JNTY (czyli RRRMMDD a potem litery z imienia i nazwiska), liczba kombinacji pozostanie taka sama. Czas potrzebny do złamania hasła będzie identyczny.
Niezależnie od tego jednak, mamy do czynienia ze znaczącym krokiem w dobrą stronę. Wiele instytucji opędza temat ochrony danych osobowych minimalnym nakładem sił i środków, miło więc raz na jakiś czas zobaczyć efekty pracy, w której zadbano o szczegóły. Przekonaliśmy się też, że istnieją techniczne środki ku temu, by nawet hasło złożone z danych o niskiej entropii stawiało opór nie przez sekundy, a przez długie godziny.
Za udostępnienie pliku PDF do eksperymentów bardzo dziękuję Arkowi!
O autorze: zawodowy programista od 2003 roku, pasjonat bezpieczeństwa informatycznego. Rozwijał systemy finansowe dla NBP, tworzył i weryfikował zabezpieczenia bankowych aplikacji mobilnych, brał udział w pracach nad grą Angry Birds i wyszukiwarką internetową Microsoft Bing.
5 odpowiedzi na “Łamiemy hasło do szyfrowanego PDF-a”
Łamanie hasła to jedno, ale skąd w ogóle wziąć takiego PDF-a? Takie dokumenty przychodzą w mailach. Są cztery drogi pozyskania takiego dokumentu: podsłuchanie nieszyfrowanej komunikacja między bankiem a serwerem poczty, wyciek z banku, nieautoryzowany dostęp do poczty, ewentualnie dostęp do dysku, na którym użyszkodnik zapisał dokument. Pierwszy przypadek jest możliwy tylko teoretycznie (może poza służbami amerykańskimi, ale one nie potrzebują wykradać PDF-ów, żeby mieć taką wiedzę). W drugim hasło może być przechowywane niedaleko tego dokumentu, albo atakujący może sobie wyciągnąć bazę klientów, i na tej podstawie wyliczyć hasło. Zostają błędy użyszkodnika. Jeżeli ktoś ma dostęp do skrzynki mailowej, to z dużym prawdopodobieństwem jest tam imię i nazwisko, np. w ustawieniach konta. Datę urodzenia też można znaleźć w ustawieniach, albo np. znaleźć maila od Facebooka, kiedy to ktoś napisał nam życzenia na timeline. Albo nawet pacjent może mieć maila jan.kowalski.1960 @ dupa . pl. To już PESEL jest ciut bezpieczniejszy, bo przynajmniej trzeba złamać 3,5 cyfry (sprawdzić, czy pacjent nie wysyłał numeru PESEL mailem). A jeżeli użyszkodnik zapisał PDF-a na dysku, i atakujący pozyskał dokument z dysku, to na tym samym dysku nieszyfrowane dokumenty z datą urodzenia, imieniem i nazwiskiem, a może nawet i PESEL-em się znajdą. I dlatego uważam, że szyfrowanie takich dokumentów z banków/instytucji finansowych jest pozbawione sensu i nie zmienia nic w kwestii bezpieczeństwa.
Fully agree. Dziś rzadko kiedy trzeba coś łamać w przypadku zwykłego człowieka, bo wszystko jest już podane albo leży obok.
Lamanie hasla, jakiekolwiek by bylo to przeciez pokonywanie zabezpieczen. podpada pod paragraf. Nikt nie daje peselu jako haslo po to, zeby zabezpieczyc dokument, tylko po to, zeby jego otwarcie wymagalo lamania hasla.
Jeśli atakujesz konkretny dokument konkretnego człowieka, zakładam, że wiesz, jak on się nazywa. Ustalenie jego daty urodzenia też nie jest trudne – tego typu informacje są dość powszechnie dostępne. A znając schemat budowy hasła, to już wystarczające informacje, by go w ogóle nie musieć łamać. Pod tym względem PESEL może być bezpieczniejszy, bo jednak jest kilka cyfr, jakich tą drogą nie odtworzysz.
Ale jest tych cyfr tak mało, że zabezpieczenie jest niewystarczające.
Nauka szyfrowania asymetrycznego powinna być na lekcjach informatyki w pierwszej klasie szkoły ponadpodstawowej. Niezaliczenie egzaminu praktycznego z GPG powinno skutkować brakiem promocji.