Przyspieszyć hashcata

Na blogu nfsec.pl pojawił się wczoraj wpis dotyczący crackowania hashy md5crypt[1]. Spojrzałem na sprzęt i moją uwagę przykuła wydajność karty Intela Intel(R) Iris(TM) Graphics 650:

Hashmode: 500 - md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5) (Iterations: 1000)
Speed.#2.........: 423.2 kH/s (53.30ms) @ Accel:256 Loops:250 Thr:8 Vec:1

Mam Intel Corporation Skylake GT2 [HD Graphics 520] widzianą jako Intel(R) Gen9 HD Graphics NEO i hashcata w wersji v5.1.0 (binarka, stable), na potrzeby zabaw z platformami CTF, o których wspominałem niedawno. Część zadań wymaga użycia brute force, i chociaż nie było do tej pory okazji wyjść poza coś typu gotowy słownik, to pewnie jeszcze się przyda. Rzecz w tym, że moja karta jest znacznie wolniejsza:

Hashmode: 500 - md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5) (Iterations: 1000)
Speed.#1………: 156.1 kH/s (76.04ms) @ Accel:256 Loops:250 Thr:8 Vec:4

Rozumiem, że to inny sprzęt i inny system (u mnie Debian w wersji unstable), ale postanowiłem podrążyć temat.

Po pierwsze, zauważyłem, że mam starsze pakiety OpenCL dla Intela. Aktualizacja nie przyniosła co prawda poprawy wydajności, ale na innym sprzęcie (Ubuntu) była w ogóle niezbędna do poprawnego działania hashcata – bez najnowszej wersji md5crypt w ogóle nie dawał się tam łamać.

Po drugie, użyłem hashcata w wersji z GitHub (wersja development) v5.1.0-951-g6caa7869 (również niezbędny na Ubuntu do poprawnego łamania md5crypt). Efekt okazał się całkiem przyjemny:

Hashmode: 500 - md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5) (Iterations: 1000)
Speed.#1………: 232.7 kH/s (51.57ms) @ Accel:256 Loops:250 Thr:8 Vec:4

Niemal połowę szybciej. Warto aktualizować soft i sterowniki, nawet, jeśli wersja wygląda na tylko nieznacznie nowszą. Co ciekawe, przyrost wydajności jest tak duży tylko dla niektórych algorytmów, w tym md5crypt. Inne, jak zwykłe md5 różnice mają jedynie symboliczne:

Hashmode: 0 - MD5
Speed.#1………: 476.6 MH/s (51.75ms) @ Accel:128 Loops:32 Thr:256 Vec:4

Hashmode: 0 - MD5
Speed.#1………: 493.4 MH/s (50.09ms) @ Accel:512 Loops:128 Thr:16 Vec:4

Tyle tym razem – trochę o instalacji i uruchomieniu hashcata, trochę o przyspieszeniu na poziomie softu. Mam świadomość, że to trochę takie wyścigi ślimaków, ale… jak się nie ma co się lubi, to się lubi co się ma. Może kiedy indziej będzie o doborze parametrów i budowie skutecznych słowników do crackowania hashy przy pomocy hashcata.

[1] Ładnie po polsku, owinięte w bawełnę, nazywa się to audyt haseł. Ewentualnie, mniej owijając w bawełnę, łamanie funkcji skrótu haseł. Zostanę jednak przy brzydkiej, potocznej wersji angielskiej.

Chromium w Debianie unstable nie startuje

Gdyby komuś w Debianie unstable przestało działać chromium, a przy uruchomieniu polecenia w konsoli pokazywało się coś takiego:

$ chromium 
[4278:4278:1113/085947.509811:FATAL:zygote_host_impl_linux.cc(116)] No usable sandbox! Update your kernel or see https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md for more information on developing with the SUID sandbox. If you want to live dangerously and need an immediate workaround, you can try using --no-sandbox.
#0 0x562ca49ba9ee <unknown>
#1 0x562ca492699c <unknown>
#2 0x562ca55b8f90 <unknown>
#3 0x562ca45f9365 <unknown>
#4 0x562ca45fe5ce <unknown>
#5 0x562ca45f7e5a <unknown>
#6 0x562ca2d09e95 ChromeMain
#7 0x7fbb5a4f6b17 __libc_start_main
#8 0x562ca2d09d3a _start

Received signal 6
#0 0x562ca49ba9ee <unknown>
#1 0x562ca49b9433 <unknown>
#2 0x562ca49ba965 <unknown>
#3 0x7fbb633dc8e0 <unknown>
#4 0x7fbb5a509f3b gsignal
#5 0x7fbb5a50b2f1 abort
#6 0x562ca49ba905 <unknown>
#7 0x562ca4926a76 <unknown>
#8 0x562ca55b8f90 <unknown>
#9 0x562ca45f9365 <unknown>
#10 0x562ca45fe5ce <unknown>
#11 0x562ca45f7e5a <unknown>
#12 0x562ca2d09e95 ChromeMain
#13 0x7fbb5a4f6b17 __libc_start_main
#14 0x562ca2d09d3a _start
r8: 0000000000000000 r9: 00007ffe7d2f0920 r10: 0000000000000008 r11: 0000000000000246
r12: 00007ffe7d2f0da0 r13: 00007ffe7d2f0f60 r14: 000000000000016b r15: 00007ffe7d2f0ba0
di: 0000000000000002 si: 00007ffe7d2f0920 bp: 00007ffe7d2f0b70 bx: 0000000000000006
dx: 0000000000000000 ax: 0000000000000000 cx: 00007fbb5a509f3b sp: 00007ffe7d2f0920
ip: 00007fbb5a509f3b efl: 0000000000000246 cgf: 002b000000000033 erf: 0000000000000000
trp: 0000000000000000 msk: 0000000000000000 cr2: 0000000000000000
[end of stack trace]
Calling _exit(1). Core file will not be generated.

to sprawa jest znana, błąd jest zgłoszony i wystarczy doinstalować pakiet chromium-sandbox.

Lynis – narzędzie do audytu bezpieczeństwa systemów Linux

Czasem zdarza się, że znajdę jakieś stare, fajne narzędzie, którego nie znałem wcześniej. Tak jest w przypadku Lynis – programu open source napisanego przez CISOfy służącego do audytu bezpieczeństwa systemu na podstawie bieżących ustawień. Przypadkiem, na komórce w tramwaju mignął mi wpis o nim gdzieś w sieci, opis był ciekawy, więc postanowiłem dać szansę, choć od dłuższego czasu nie interesowałem się podobnymi programami. Kiedyś, na początku przygody z Linuksem bawiłem się Bastille Linux i to w zasadzie wszystko, jeśli chodzi o automaty.

Działanie Lynis sprawdzałem tylko na Debianie i Ubuntu – działa bardzo sprawnie, generuje sensowne raporty z uwzględnieniem specyfiki dystrybucji. Przy każdym raporcie jest link do krótkiego opisu z wytłumaczeniem danej opcji. Dla początkujących jest to dobra okazja do poczytania nt. ustawień i ich wpływu na bezpieczeństwo systemu, dla zaawansowanych automat, który sprawdzi, czy czegoś nie przeoczyliśmy lub nie zapomnieliśmy włączyć np. po testach.

Program jest dostępny jako pakiet, więc instalacja sprowadza się do:

apt-get install lynis

Uruchomienie audytu również jest proste:

lynis audit system

Polecam dodanie przełącznika -Q. Program jedynie generuje raport, niczego nie zmienia w systemie, więc uruchomienie jest bezpieczne. Wynik wyświetla na ekran oraz do logu, znajdziemy tam zarówno znalezione błędy, ostrzeżenia, jak i wskazówki do hardeningu systemu.

Narzędzie ma zastosowanie raczej dla systemów, prywatnych,  utrzymywanych ręcznie – te konfigurowane automatycznie raczej nie mają miejsca na powstanie błędu, a forma raportu jest raczej przyjazna dla ludzi, niż maszyn.

Oczywiście przy domyślnej konfiguracji zgłosi także odstępstwa od normy, które są zamierzone albo nieistotne, więc wynik będzie nieco przegadany. Mimo to polecam wypróbowanie samodzielnie.

Polecenie su – zmiany

Jakiś czas temu zauważyłem, że mój Debian unstable na domowym desktopie zmienił zachowanie. Na koncie root przestał działać skrypt do aktualizacji systemu i usypianie.

Szybko sprawdziłem i oczywiście chodziło o PATH. Dopisałem pełne ścieżki do poleceń i prawie zapomniałem o sprawie, przypuszczając, że chodzi o jakiś chwilowy błąd w którymś z pakietów.

Jednak problem nie zniknął, więc postanowiłem sprawdzić dokładnie, co się wydarzyło. Na pierwszy ogień poszło sprawdzenie /etc/profile, w którym znalazłem spodziewane:

if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"

Również w /etc/login.defs wszystko wyglądało poprawnie:

# *REQUIRED* The default PATH settings, for superuser and normal users.
#
# (they are minimal, add the rest in the shell startup files)
ENV_SUPATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV_PATH PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Skończyły mi się pomysły, więc udałem się na kanał #debian-next z pytaniem, czy to błąd, czy może były ostatnio jakieś zmiany. I okazuje się, że zmiany były, grubsze, dotyczące polecenia su.

Uprzednio, wydanie „gołego” polecenia su zmieniało użytkownika na root oraz ustawiało należną mu ścieżkę. Obecnie należy podawać su – (forma niezalecana) lub, lepiej, su -l, aby osiągnąć ten efekt.

I jeszcze co ciekawsze fragmenty dokumentacji (man su). Było:

The current environment is passed to the new shell. The value of $PATH is reset to /bin:/usr/bin for normal users, or /sbin:/bin:/usr/sbin:/usr/bin for the
superuser. This may be changed with the ENV_PATH and ENV_SUPATH definitions in /etc/login.defs.
[...]
-, -l, --login
Provide an environment similar to what the user would expect had the user logged in directly.

Aktualnie jest:

For backward compatibility, su defaults to not change the current directory and to only set the environment variables HOME and SHELL (plus USER and LOGNAME
if the target user is not root). It is recommended to always use the --login option (instead of its shortcut -) to avoid side effects caused by mixing envi-
ronments.
[...]
-, -l, --login
Start the shell as a login shell with an environment similar to a real login:
o clears all the environment variables except TERM
o initializes the environment variables HOME, SHELL, USER, LOGNAME, and PATH
o changes to the target user's home directory
o sets argv[0] of the shell to '-' in order to make the shell a login shell

Więc gdyby komuś w jakiejś debianopodobnej dystrybucji niebawem su przestało ustawiać PATH, to najprawdopodobniej chodzi o tę zmianę.

Debian SID jest czasem zepsuty

Niezbyt krótki wpis o urokach Linuksa na desktopie, o tym, że człowiek uczy się całe życie i o tym, czemu warto jednak korzystać z Debiana w wersji unstable AKA SID.

I przekornie zacznę od końca. Dawno temu przeczytałem świetny wpis o tym, dlaczego Debian unstable nie zasługuje na tę nazwę. Jak lubię Debiana i od dawna jest to mój podstawowy system na desktop, jeśli tylko mogę go używać (z polityką firmy się nie dyskutuje; nie każdy soft działa na Linuksie), tak używanie wersji stabilnej było nieco męczące, choćby ze względu na nieco stary soft. Przypominam, że było to w czasach, gdy backports nie były oficjalną częścią dystrybucji.

Radziłem sobie na różne sposoby – a to używając pakietów z wersji testing lub unstable, a to robiąc backporty. Jakoś to działało, ale wpis mi się spodobał i stwierdziłem, że dam szansę wersji unstable. Ku mojemu zaskoczeniu, zrobiło się dużo prościej i wcale nie mniej stabilnie. Rzekłbym nawet, że problemów z aktualizacją pakietów jest znacznie mniej, niż przy mieszaniu wersji. Nie to, że zawsze wszystko działa, ale konieczność downgrade pakietu, bo jakaś kluczowa funkcjonalność nie działa, zdarzyła mi się małe parę razy. W ciągu kilku lat.

No i właśnie, wróciłem z konfy, odpalam rano do kawy komputer, by sprawdzić pocztę i… nie wstał. Czarny ekran z kursorem, nawet nie migającym. Przejście do trybu tekstowego nie działa. I ciężko stwierdzić, która aktualizacja namieszała, bo zwykle usypiam laptopa, zamiast wyłączać. Smuteczek i zły moment.

W jakieś pół godziny nie udało mi się do niczego sensownego dojść, poszedłem do pracy. Po powrocie nie było wiele lepiej. Uruchomienie w single mode i aktualizacja pakietów nie pomogła, choć bardzo liczyłem na to.

Po krótkiej walce udało mi się za to ustalić, że wina leży w okolicy xorg. Tu słowo wyjaśnienia i ważna uwaga. Laptop to Dell Vostro 1440 i ma dwie karty graficzne. I zawsze były z nimi przygody, głównie za sprawą niedziałającego przełączania między nimi. Nie żeby mi jakoś specjalnie zależało na konkretnej – jak były działające sterowniki, to korzystałem z ATI, jeśli nie – z Intela, a przełączałem je przy pomocy zmiany konfiguracji w xorg.conf, dlatego w ogóle ten plik posiadam. Pamiętam, że kiedyś przestała działać mysz i klawiatura i musiałem dopisać stosowne sekcje w xorg.conf. I w ogóle przez lata zebrało się kilka wersji tych konfiguracji, chociaż gdzieś tak od dwóch korzytałem z tej samej.

W każdym razie, po nieco dłuższej walce z downgrade podejrzanych pakietów i zasięgnięciu języka na IRCu udało mi się uruchomić Xy, ale… znowu bez klawiatury i myszy. Dopisywanie stosownych sekcji w xorg.conf powodowało albo powrót do niedziałania grafiki, albo nie przynosiło efektów. Stwierdziłem, że pomysły mi się skończyły i pora na bardziej radykalne rozwiąznia, czyli sprawdzenie, jak też wygląda konfiguracja Xów i działanie pod Debianem live. I o dziwo nie miał najmniejszych problemów, mimo braku xorg.conf. Jednak Debian live jest oparty o wersję stabilną, nie unstable.

Wygenerowałem xorg.conf na live, potem jeszcze trochę poszukałem i znalazłem rozwiązanie. Okazało się, że wszystkie pakiety były w porządku, za to brakowało mi w systemie pakietu xserver-xorg-input-evdev – pewnie został usunięty przy ostatniej aktualizacji, a ja tego nie zauważyłem. Po jego doinstalowaniu zarówno klawiatura jak i mysz działają.

Pochwaliłem się na IRC (kanał debian-next na OFTC) i wywołałem spore zdziwienie. Po pierwsze, wszystko powinno działać bez xorg.conf. Za to warto mieć zainstalowane xserver-xorg-input-libinput oraz xserver-xorg-input-all, które to pakiety instalują się domyśnie przy instalacji xserver-xorg. Zapewne kiedyś były zainstalowane lecz usunąłem je przy jakichś problemach z aktualizacją pakietów – uroki SIDa. I stąd całe zamieszanie.

Piszę o tym, bo mimo wszystko polecam Debiana unstable na dekstop, a tego typu problemy to wyjątek. Nie zmienia faktu, że łącznie zeszły mi ze trzy godziny na przywrócenie pełnej funkcjonalności systemu. Pozostało mi doinstalowanie brakujących pakietów i wypróbowanie działania bez xorg.conf, ale chwilowo nie mam weny. Pewnie wkrótce zaktualizuję wpis.

UPDATE: Po doinstalowaniu obu brakujących pakietów i skasowaniu xorg.conf wszystko działa. Czyli całe zamieszanie z powodu przekombinowania było.