NFsec Logo

OK Google, złam mi hasło

18/04/2021 w Bezpieczeństwo Brak komentarzy.  (artykuł nr 782, ilość słów: 1491)

U

sługa Colaboratory, w skrócie “Colab” to produkt firmy Google, który umożliwia każdemu pisanie i wykonywanie dowolnego kodu Pythona za pośrednictwem przeglądarki. Najczęściej wykorzystuje się go w szybkim przygotowaniu jakiegoś dowodu koncepcji w analizie danych lub napisania kawałka skryptu. Z technicznego punktu widzenia Colab to hostowana usługa oparta na rozwiązaniu Jupyter, która nie wymaga żadnej konfiguracji, a jednocześnie zapewnia bezpłatny dostęp do zasobów obliczeniowych, w tym procesorów graficznych*.

Ktokolwiek pracował na środowisku Jupyter Notebooks wie, że oprócz normalnych procedur języka Python można wydawać jeszcze czyste polecenia systemowe, które umożliwiają np. instalację dodatkowych pakietów poprzez pip czy inne pakiety dla systemu Linux. Wszystko, co wystarczy zrobić to umieścić znak “!” przed poleceniem. Oznacza to, że dostajemy za darmo* małą maszynę wirtualną (np. 2 vCPU / Intel(R) Xeon(R) CPU @ 2.30GHz z 13 GB RAM oraz 110 GB HDD) z możliwością podpięcia ją do karty graficznej (np. Nvidia Tesla T4). Otóż to – moc obliczeniowa pozwalająca na amatorską zabawę w łamanie haseł.

W celu demonstracji logujemy się na konto Google, następnie wchodzimy na stronę projektu Colab. Zakładamy nowy notatnik i z GUI wybieramy “Środowisko wykonawcze”, a następnie “Zmień typ środowiska wykonawczego”. Dodajemy akcelerator sprzętowy GPU oraz sprawdzamy, jaki rodzaj karty otrzymaliśmy. W tym celu już w naszym, nowym notatniku wydajemy polecenie:

!nvidia-smi
Fri Apr 16 15:14:51 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.67       Driver Version: 460.32.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            Off  | 00000000:00:04.0 Off |                    0 |
| N/A   64C    P8    11W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

W kolejnej zakładce przeglądarki otwieramy usługę Google Drive i tworzymy pusty katalog o nazwie: hashcat. Ponieważ z naszą maszyną mogą występować różne perturbacje – pozwoli to nam na zapisywanie sesji programu hashcat do stałego dysku, który nawet po zniknięciu maszyny będzie posiadał dane umożliwiające nam wznowienie sesji łamiącej, czy już załamane przez nas hasze. Teraz musimy podmontować nasz folder z Google Drive do Colab. W notatniku wpisujemy:

from google.colab import drive
drive.mount('/content/drive')

Na tym etapie powinniśmy uzyskać link pozwalający na uzyskanie kodu. Po kliknięciu na link i wprowadzeniu kodu naszym oczom powinien ukazać się komunikat:

Mounted at /content/drive

Teraz musimy stworzyć link symboliczny do naszego dysku zarazem montując go tam, gdzie hashcat będzie zapisywał swoje metadane:

!ls /content/drive/My\ Drive/hashcat
!ln -s /content/drive/My\ Drive/hashcat /root/.hashcat
!ls -al /root | grep hashcat
lrwxrwxrwx 1 root root   31 Apr 16 15:21 .hashcat -> /content/drive/My Drive/hashcat

Teraz możemy przejść do instalacji programu łamiącego w najnowszej, dostępnej wersji:

!apt install cmake build-essential -y
!apt install checkinstall git -y
!git clone https://github.com/hashcat/hashcat.git
!cd hashcat && git submodule update --init && make && make install

Po instalacji sprawdzamy wersję oraz jego wydajność względem łamania MD5:

!hashcat -w 4 -m 0 --benchmark
hashcat (v6.1.1-229-g96c6878ef) starting in benchmark mode...

nvmlDeviceGetFanSpeed(): Not Supported

CUDA API (CUDA 11.2)
====================
* Device #1: Tesla T4, 15007/15109 MB, 40MCU

OpenCL API (OpenCL 1.2 CUDA 11.2.109) - Platform #1 [NVIDIA Corporation]
========================================================================
* Device #2: Tesla T4, skipped

Benchmark relevant options:
===========================
* --workload-profile=4

Hashmode: 0 - MD5

Speed.#1.........:  9973.7 MH/s (268.81ms) @ Accel:64 Loops:1024 Thr:1024 Vec:1

Started: Fri Apr 16 15:33:03 2021
Stopped: Fri Apr 16 15:33:13 2021

Posiadając już warunki do łamania możemy dodać przykładowe hasze:

!echo "58e9d1d6cdd1a288ad676cd5ee76187d" >> hash.txt
!echo "525be34566615b2810d7c97726a1d314" >> hash.txt
!echo "b994109e6bccc1d40473fb03b208109a" >> hash.txt
!echo "ed8a9fb186464b9f44ef49f911762357" >> hash.txt
!echo "63e1aa65a9fa1780125b6f10c6b6d100" >> hash.txt
!echo "f5d3a2b13d5d8ef1701f2a0d6e7ebaae" >> hash.txt
!echo "eb7ef8785f1eaa5b02fc6f52d040a792" >> hash.txt
!echo "c295e06796e65295ba449e63bc259868" >> hash.txt
!echo "16c25aa83dff11805fa608a9e6bc006a" >> hash.txt
!echo "1dcc07acf54297a2634127a341a77aa6" >> hash.txt
!echo "7764442f70e644d8e8d6a40b5ab60f1c" >> hash.txt
!echo "b318c80c42dfeb2c2c510b160867b392" >> hash.txt
!echo "cab69d0d40f1f29f82255880fd70a9c4" >> hash.txt
!echo "dd67b8aa204c1209e15579defdf1ce0d" >> hash.txt
!echo "2fc0f8a3c058fb21ba1114ad2f57e095" >> hash.txt
!echo "2843bb0a418644ec00efeb8b58f5f60c" >> hash.txt

Ściągamy słownik, który zawsze jest pomocny w polskich frazach:

!wget https://nfsec.pl/media/nfsec_pl.txt.gz
!gunzip nfsec_pl.txt.gz

Ściągamy regułę, które “rządzi” innymi regułami:

!wget https://raw.githubusercontent.com/NotSoSecure/password_cracking_rules/master/OneRuleToRuleThemAll.rule

I zaczynamy proces łamania haseł:

!hashcat --session nfsec -O -m 0 -a 0 hash.txt nfsec_pl.txt -r OneRuleToRuleThemAll.rule
Session..........: nfsec
Status...........: Exhausted
Hash.Name........: MD5
Hash.Target......: hash.txt
Time.Started.....: Sat Apr 17 18:36:49 2021 (21 mins, 27 secs)
Time.Estimated...: Sat Apr 17 18:58:16 2021 (0 secs)
Guess.Base.......: File (nfsec_pl.txt)
Guess.Mod........: Rules (OneRuleToRuleThemAll.rule)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:  5853.8 MH/s (2.38ms) @ Accel:8 Loops:128 Thr:1024 Vec:1
Recovered........: 15/16 (93.75%) Digests
Progress.........: 7683516097330/7683516097330 (100.00%)
Rejected.........: 44881304075/7683516097330 (0.58%)
Restore.Point....: 147774134/147774134 (100.00%)
Restore.Sub.#1...: Salt:0 Amplifier:51968-51995 Iteration:0-128
Candidates.#1....: $HEX[7a776f646f77616e69] -> $HEX[fffffffffffffffffefe]
Hardware.Mon.#1..: Temp: 76c Util: 92% Core:1560MHz Mem:5000MHz Bus:16

Started: Sat Apr 17 18:36:36 2021
Stopped: Sat Apr 17 18:58:17 2021

Po 22 minutach udało nam się złamać 15 z 16 haszy. Jeden oparł się naszemu algorytmowi, ale to nie szkodzi. Jeśli zapiszemy wszystkie 15 wyników do osobnego pliku o nazwie cracked.txt i odpalimy łamanie w trybie kombinatora to w czasie mniejszym od sekundy będziemy mieli komplet:

!hashcat --session nfsec -O -m 0 -a 1 hash.txt cracked.txt cracked.txt
63e1aa65a9fa1780125b6f10c6b6d100:***

Session..........: nfsec
Status...........: Cracked
Hash.Name........: MD5
Hash.Target......: hash.txt
Time.Started.....: Sat Apr 17 20:04:26 2021 (0 secs)
Time.Estimated...: Sat Apr 17 20:04:26 2021 (0 secs)
Guess.Base.......: File (cracked.txt), Left Side
Guess.Mod........: File (cracked.txt), Right Side
Speed.#1.........:   959.6 kH/s (0.08ms) @ Accel:32 Loops:34 Thr:1024 Vec:1
Recovered........: 16/16 (100.00%) Digests
Progress.........: 1156/1156 (100.00%)
Rejected.........: 0/1156 (0.00%)
Restore.Point....: 0/34 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-34 Iteration:0-34
Candidates.#1....: *** -> ***
Hardware.Mon.#1..: Temp: 68c Util: 51% Core:1200MHz Mem:5000MHz Bus:16

Started: Sat Apr 17 20:04:25 2021
Stopped: Sat Apr 17 20:04:27 2021

Bonus:

Jak posortować duży słownik? Dzieląc go na mniejsze części:

agresor@darkstar:~$ du -m mega_pl.txt
5830    mega_pl.txt
agresor@darkstar:~$ split -l 10000000 mega_pl.txt split-mega_pl.txt-
agresor@darkstar:~$ for i in `echo split-*`; do LC_ALL=C sort -us -o sorted-$i $i; done
agresor@darkstar:~$ sort -m sorted-split-mega_pl.txt-* > mega_pl

*** – Colab jest w stanie zapewnić bezpłatne zasoby po części dzięki dynamicznym limitom użytkowania, które czasami ulegają wahaniom, i nie zapewniają gwarantowanych lub nieograniczonych zasobów. Oznacza to, że ogólnie limity użytkownia, a także okresy bezczynności, maksymalny czas życia maszyny wirtualnej, dostępne typy procesorów graficznych i inne czynniki zmieniają się w czasie. Niestety Google nie publikuje tych limitów. Dołączanie GPU ma czasami priorytet dla użytkoników, którzy używają Colab interaktywnie, a nie do długotrwałych obliczeń, lub dla użytkowników, który ostatnio używali mniej zasobów w Colab. W rezultacie użytkownicy (konta), którzy używają Colab do długotrwałych obliczeń lub użytkownicy, którzy ostatnio używali więcej zasobów w Colab, są bardziej narażeni na limity użycia i mają tymczasowo ograniczany dostęp do GPU.

Więcej informacji: colabcat, penglab, cloudtopolis

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , , , , , ,

Komentowanie tego wpisu jest zablokowane.