Hackme ECSM 2015 – rozwiązanie

Data publikacji: 17/11/2015, Łukasz Siewierski

Niedawno ogłosiliśmy zadanie w ramach Europejskiego Miesiąca Bezpieczeństwa Cybernetycznego. Zadanie okazało się sprawiać trochę problemów, ale mimo wszystko pięć osób prawidłowo odnalazło ukrytą flagę:

    1. Michał Celiński-Mysław
    2. Wociech Kol
    3. S1lesianB0y
    4. Michał Ferdyniok
    5. Jakub Jóźwiak

Gratulujemy! Poniżej znajduje się rozwiązanie zadania.

Rozwiązanie

W zadaniu prosiliśmy o znalezienie flagi – ciągu znaków, który będzie znajdował się pomiędzy

<span class="text">flag{</span>

a

<span class="text">}</span>

. Flagę tę znaleźć trzeba było w pliku PCAP, który udostępniliśmy. Po rozpakowaniu pliku i otwarciu za pomocą darmowego narzędzia Wireshark. Poniżej znajduje się zrzut ekranu, na którym widać podejrzaną komunikację z sewerem

<span class="text">tajnyserwer.test</span>

.

ecsm_2015_wireshark

Z dwóch strumieni TCP skierowanych do

<span class="text">tajnyserwer.test</span>

możemy wyodrębnić plik JPG oraz plik 7zip. Najprościej można to zrobić korzystając z opcji

<span class="text">File|Export Objects|HTTP</span>

i wybierając obie komunikacje. Kiedy to zrobimy plik 7zip okazuje się być zaszyfrowany i jesteśmy proszeni o podanie hasła. Hasło do tego pliku znajduje się w informacjach EXIF zdjęcia katedry, jako

<span class="text">Title</span>

. Można wydobyć t ę informację np. za pomocą narzędzie

<span class="text">exiftool</span>

:

$ exiftool photo.jpg
Title: 4F5dzRYXBTNmM2jT
Comment: File source: https://commons.wikimedia.org/wiki/File:Catedral_de_Salisbury,_Salisbury,_Inglaterra,_2014-08-12,_DD_49.JPG

Po wpisaniu hasła

<span class="text">4F5dzRYXBTNmM2jT</span>

jesteśmy w stanie rozpakować plik

<span class="text">matrioszka.zip</span>

, który również jest spakowany z hasłem. Ponieważ jednak nie jest zaszyfrowana lista plików, widzimy już co nas czeka w następnym etapie: najprawdopodobniej skrypt języka Python (

<span class="text">decrypt.py</span>

) oraz zaszyfrowane dane (

<span class="text">tajne.data</span>

).

Hasło do pliku zip znajduje się również w informacjach EXIF. Tym razem jednak trzeba zwrócić uwagę na współrzędne geograficzne:

GPS Latitude                    : 35 deg 41′ 6.00″ N
GPS Longitude                   : 139 deg 45′ 5.00″ E
GPS Position                    : 35 deg 41′ 6.00″ N, 139 deg 45′ 5.00″ E

Jak wywnioskować można z komentarza EXIF do zdjęcia jest to katedra w Salisbury w Anglii. Współrzędne geograficzne wskazują jednak na zupełnie inne miejsce – okolice Pałacu Cesarskiego w Tokio. I właśnie

<span class="text">Tokio</span>

jest hasłem do pliku zip. Po rozpakowaniu i zajrzeniu w skrypt języka Python widzimy, że przyjmuje on trzy parametry: hasło, plik wejściowy i plik wyjściowy.

Z hasła jest tworzony 32-bajtowy (256 bitów) klucz AES, którym to algorytmem następnie jest odszyfrowywany plik wejściowy. Jednak tylko 5 znaków hasła jest wykorzystywanych do wytworzenia klucza. Co więcej muszą być to litery bądź cyfry. Ogranicza to znacząco liczbę możliwych kombinacji i powoduje, że wykorzystanie metody brute-force może okazać się opłacalne. Jednak musimy za każdym razem sprawdzić czy wynikowy plik jest rzeczywiście tym czego szukamy. Możemy to zrobić ograniczając pulę otrzymywanych plików do sensownych typów, np. plików PDF (co po naszej podpowiedzi było już oczywiste). Po znalezieniu odpowiedniego hasła (

<span class="text">VbrFv</span>

) otrzymujemy zaszyfrowany plik PDF. Hasło do tego pliku znajduje się w początkowym pliku PCAP, w rekordzie TXT odpowiedzi DNS, jak pokazano poniżej.

ecsm_2015_txt

Po wpisaniu hasła widzimy dokument taki jak na obrazku poniżej. Można spróbować uzyskać flagę zaznaczając zaciemniony prostokąt i przekształcając ciąg znaków zakodowany base64 na postać jawną, ale wtedy otrzymamy tylko

<span class="text">This is not the flag that you are looking for</span>

.

ecsm_2015_pdf

Prawdziwa flaga znajduje się w stopce dokumentu i jest napisana białą czcionką. Poprawna odpowiedź to:

<span class="text">NagrodaJestDlaMnie</span>

.