System szesnastkowy, alfabet królowej i zagnieżdzone pliki zip. Canvas, The secret of a Queen, Eternal Loop – Hack The Box

Canvas

We want to update our website but we are unable to because the developer who coded this left today. Can you take a look?

Po ściągnięciu aplikacji internetowej przeglądamy pliki w poszukiwaniu czegoś ciekawego. Po przenalizowaniu ich natrafiamy na plik o nazwie login.js. Szczególnie interesujące wydają się ostatnie linijki pliku. Cały plik wykorzystuje format heksadecymalny.

var res=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](0x48,0x54,0x42,0x7b,0x57,0x33,0x4c,0x63,0x30,0x6d,0x33,0x5f,0x37,0x30,0x5f,0x4a,0x34,0x56,0x34,0x35,0x43,0x52,0x31,0x70,0x37,0x5f,0x64,0x33,0x30,0x62,0x46,0x75,0x35,0x43,0x34,0x37,0x31,0x30,0x4e,0x7d,0xa);

Po wrzuceniu ich do konwertera z wybranym kodowaniem UTF-16 big endian, dostaniemy flagę.

The secret of a Queen

Decrypt the code and find the Queen’s secret!

Zadanie z serii „najciemniej jest pod latarnią”. Jako plik zadania dostajemy poniższe zdjęcie.

Po wpisaniu w internecie „The secret of a Queen alphabet”, znajdziemy stronę z Mary Stuart Code. Po użyciu dekodera dostajemy flagę. Trzeba ją uzupełnić o dodatkowe klamry, aby całość pasowała do konwencji flag.

Eternal Loop

Can you find a way out of this loop?

Po ściągnięciu i rozpakowaniu archiwum hasłem z Hack The Box, dostajemy kolejny plik o rozszerzeniu zip. Do odpakowania go potrzebujemy jednak kolejne hasło, którego nie znamy. Po zabawach bruteforce okazuje się, że hasłem jest nazwa zagnieżdżonego w nim pliku zip. Po odpakowywaniu kilku archiwów jeden po drugim, dochodzimy do wniosku, że łatwiej będzie napisać prosty skrypt, który odpakowuje wskazane archiwum bazując na nazwie pliku, który w nim jest, a następnie wywołuje tą samą akcję na nowo wypakowanym archiwum. Bierzemy więc nazwę ostatniego odpakowanego pliku o rozszerzeniu zip i używamy go jako parametru w prostym skrypcie, który prezentuje się następująco:

import zipfile

def unzip_files(file_name):
    with zipfile.ZipFile(file_name) as file:
	
        list_of_file_names = file.namelist()
        next_zip_file_name = list_of_file_names[0]
        next_zip_file_name_size = len(next_zip_file_name)
        password = next_zip_file_name[:next_zip_file_name_size - 4]

        file.extractall(pwd = bytes(password, 'utf-8'))  
        print("Extracting a file named {}. Its password is {}".format(file_name, next_zip_file_name))

        unzip_files(next_zip_file_name)

unzip_files("49805.zip")

Efekt skryptu:

┌──(bugspace㉿kali)-[~/Downloads]
└─$ python3 unzipFiles.py
Extracting a file named 49805.zip. Its password is 13811.zip
Extracting a file named 13811.zip. Its password is 45133.zip
Extracting a file named 45133.zip. Its password is 4030.zip
Extracting a file named 4030.zip. Its password is 12132.zip
Extracting a file named 12132.zip. Its password is 33130.zip
Extracting a file named 33130.zip. Its password is 8789.zip
(...)

Po kilkuset plikach dostajemy oczekiwany błąd w konsoli.

Extracting a file named 27833.zip. Its password is 6969.zip
(...)
File "/usr/lib/python3.9/zipfile.py", line 835, in __init__
    raise RuntimeError("Bad password for file %r" % zipinfo.orig_filename)
RuntimeError: Bad password for file 'DoNotTouch'

Oznacza to, że pozostaje nam do rozpakowania archiwum 6969.zip. Sposób na odczytanie poprzednich archiwów się nie sprawdził. Spróbujmy zatem użyć wrócić do ataków bruteforce. Użyjemy do tego narzędzia John The Ripper. Najpierw jednak trzeba zapisać w osobnym pliku hashe haseł, które będą crackowane.

┌──(bugspace㉿kali)-[~/Downloads]
└─$ zip2john 6969.zip > 6969.hashes                        
ver 2.0 efh 5455 efh 7875 6969.zip/DoNotTouch PKZIP Encr: 2b chk, TS_chk, cmplen=335181, decmplen=884736, crc=E8183254

Następnie możemy użyć narzędzia JTR aby je złamać. Ponadto, użyjemy słownika rockyou.txt.gz.

┌──(bugspace㉿kali)-[~/Downloads]
└─$ john 6969.hashes --wordlist=/usr/share/wordlists/rockyou.txt   
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
letmeinplease    (6969.zip/DoNotTouch)
1g 0:00:00:00 DONE (2021-08-12 23:51) 33.33g/s 5461Kp/s 5461Kc/s 5461KC/s korn13..24782478
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Teraz pozostało użyć poniższego polecenia aby sprawdzić zawartość pliku (notabene jest to baza danych) w poszukiwaniu słowa kluczowego 'HTB’.

grep -Pa 'HTB' DoNotTouch

W taki sposób dostajemy finalną flagę.

Źródła

https://dfir.science/2014/07/how-to-cracking-zip-and-rar-protected.html
https://github.com/openwall/john

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.