Linux Privilege Escalation
Last updated
Last updated
Dowiedz się i praktykuj Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Dowiedz się i praktykuj Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Zacznijmy zdobywać wiedzę na temat działającego systemu operacyjnego.
Jeśli masz uprawnienia do zapisu w dowolnym folderze w zmiennej PATH
, możesz próbować przejąć kontrolę nad niektórymi bibliotekami lub binarkami:
Czy w zmiennych środowiskowych znajdują się interesujące informacje, hasła lub klucze API?
Sprawdź wersję jądra i czy istnieje jakieś wykorzystanie, które można wykorzystać do eskalacji uprawnień
Możesz znaleźć dobrą listę podatnych jąder oraz już skompilowane exploit'y tutaj: https://github.com/lucyoa/kernel-exploits oraz exploitdb sploits. Inne strony, gdzie można znaleźć skompilowane exploit'y: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
Aby wyodrębnić wszystkie podatne wersje jądra z tej strony internetowej, można użyć:
Narzędzia, które mogą pomóc w wyszukiwaniu exploitów jądra to:
linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py (wykonaj NA ofierze, sprawdza tylko exploity dla jądra 2.x)
Zawsze sprawdź wersję jądra w Google, być może Twoja wersja jądra jest wymieniona w jakimś exploicie jądra, wtedy będziesz pewien, że ten exploit jest ważny.
Eskalacja uprawnień w systemie Linux - Jądro Linux <= 3.19.0-73.8
Na podstawie podatnych wersji sudo, które występują w:
Możesz sprawdzić, czy wersja sudo jest podatna, używając tego polecenia grep.
Od @sickrov
Sprawdź smasher2 box of HTB jako przykład, jak ta podatność mogłaby zostać wykorzystana
Jeśli jesteś wewnątrz kontenera Docker, możesz spróbować z niego uciec:
Docker SecuritySprawdź, co jest zamontowane i odmontowane, gdzie i dlaczego. Jeśli coś jest odmontowane, możesz spróbować je zamontować i sprawdzić prywatne informacje.
Wylicz użyteczne pliki binarne
Sprawdź również, czy zainstalowano jakikolwiek kompilator. Jest to przydatne, jeśli musisz użyć jakiegoś exploitu jądra, ponieważ zaleca się kompilowanie go na maszynie, na której zamierzasz go użyć (lub na podobnej).
Sprawdź wersję zainstalowanych pakietów i usług. Być może istnieje stara wersja Nagiosa (na przykład), która mogłaby zostać wykorzystana do eskalacji uprawnień... Zaleca się ręczne sprawdzenie wersji najbardziej podejrzanego zainstalowanego oprogramowania.
Jeśli masz dostęp SSH do maszyny, możesz również użyć openVAS do sprawdzenia, czy zainstalowane wewnątrz maszyny oprogramowanie jest przestarzałe i podatne na ataki.
Zauważ, że te polecenia pokażą wiele informacji, które będą w większości bezużyteczne, dlatego zaleca się użycie aplikacji takich jak OpenVAS lub podobnych, które sprawdzą, czy któraś z zainstalowanych wersji oprogramowania jest podatna na znane exploity
Sprawdź, jakie procesy są uruchomione i sprawdź, czy którykolwiek proces ma więcej uprawnień niż powinien (może to być na przykład tomcat uruchamiany przez roota?)
Zawsze sprawdzaj, czy są uruchomione debuggery electron/cef/chromium, możesz je wykorzystać do eskalacji uprawnień. Linpeas wykrywa je, sprawdzając parametr --inspect
w wierszu poleceń procesu.
Sprawdź również swoje uprawnienia do binarnych procesów, być może możesz je nadpisać.
Możesz użyć narzędzi takich jak pspy do monitorowania procesów. Może to być bardzo przydatne do identyfikacji podatnych procesów wykonywanych często lub gdy spełnione są określone wymagania.
Niektóre usługi serwera zapisują poświadczenia w postaci tekstu jawnego w pamięci. Zazwyczaj będziesz potrzebować uprawnień roota do odczytania pamięci procesów należących do innych użytkowników, dlatego jest to zazwyczaj bardziej przydatne, gdy już jesteś rootem i chcesz odkryć więcej poświadczeń. Jednak pamiętaj, że jako zwykły użytkownik możesz odczytać pamięć procesów, które posiadasz.
Zauważ, że obecnie większość maszyn nie zezwala domyślnie na ptrace, co oznacza, że nie możesz dumpować innych procesów należących do twojego użytkownika bez uprawnień.
Plik /proc/sys/kernel/yama/ptrace_scope kontroluje dostępność ptrace:
kernel.yama.ptrace_scope = 0: wszystkie procesy mogą być debugowane, o ile mają takie same uid. To klasyczny sposób działania ptrace.
kernel.yama.ptrace_scope = 1: tylko proces nadrzędny może być debugowany.
kernel.yama.ptrace_scope = 2: Tylko administrator może używać ptrace, ponieważ wymaga to CAP_SYS_PTRACE capability.
kernel.yama.ptrace_scope = 3: Żaden proces nie może być śledzony za pomocą ptrace. Po ustawieniu wymagany jest restart, aby ponownie włączyć śledzenie.
Jeśli masz dostęp do pamięci usługi FTP (na przykład), możesz uzyskać dostęp do sterty i przeszukać w niej poświadczenia.
Dla określonego identyfikatora procesu mapy pokazują, jak pamięć jest odwzorowana w przestrzeni adresowej tego procesu; pokazuje również uprawnienia każdego odwzorowanego obszaru. Plik pseudopamięci mem ujawnia samą pamięć procesów. Z pliku maps wiemy, które obszary pamięci są odczytywalne i ich przesunięcia. Wykorzystujemy tę informację, aby przeszukać plik mem i zrzucić wszystkie odczytywalne obszary do pliku.
/dev/mem
zapewnia dostęp do fizycznej pamięci systemu, a nie do pamięci wirtualnej. Przestrzeń adresowa wirtualna jądra może być dostępna za pomocą /dev/kmem.
Zazwyczaj /dev/mem
jest tylko do odczytu przez użytkownika root i grupę kmem.
ProcDump to linuxowa reinterpretacja klasycznego narzędzia ProcDump z pakietu narzędzi Sysinternals dla systemu Windows. Pobierz go z https://github.com/Sysinternals/ProcDump-for-Linux
Aby zrzucić pamięć procesu, możesz użyć:
https://github.com/hajzer/bash-memory-dump (root) - _Możesz ręcznie usunąć wymagania dotyczące uprawnień roota i zrzucić proces należący do Ciebie
Skrypt A.5 z https://www.delaat.net/rp/2016-2017/p97/report.pdf (wymagane są uprawnienia roota)
Jeśli zauważysz, że proces autentykatora jest uruchomiony:
Możesz wyświetlić zawartość procesu (zobacz poprzednie sekcje, aby znaleźć różne sposoby na wyświetlenie pamięci procesu) i wyszukać poświadczenia w pamięci:
Narzędzie https://github.com/huntergregal/mimipenguin ukradnie hasła w postaci tekstu jawnego z pamięci oraz z niektórych znanych plików. Do poprawnego działania wymaga uprawnień roota.
Funkcja | Nazwa procesu |
---|---|
Hasło GDM (Kali Desktop, Debian Desktop) | gdm-password |
Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
LightDM (Ubuntu Desktop) | lightdm |
VSFTPd (Aktywne połączenia FTP) | vsftpd |
Apache2 (Aktywne sesje HTTP Basic Auth) | apache2 |
OpenSSH (Aktywne sesje SSH - Użycie Sudo) | sshd: |
Sprawdź, czy jakiekolwiek zaplanowane zadanie jest podatne. Być może możesz skorzystać z skryptu wykonywanego przez użytkownika root (podatność na symbol wieloznaczny? czy można modyfikować pliki, których używa root? użyć dowiązań symbolicznych? utworzyć określone pliki w katalogu, którego używa root?).
Na przykład, wewnątrz /etc/crontab można znaleźć ścieżkę: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(Zauważ, jak użytkownik "user" ma uprawnienia do zapisu w /home/user)
Jeśli w tej crontab root próbuje wykonać pewne polecenie lub skrypt bez ustawiania ścieżki. Na przykład: * * * * root overwrite.sh W takim przypadku, można uzyskać powłokę roota używając:
Jeśli skrypt jest wykonywany przez roota i zawiera „*” wewnątrz polecenia, można to wykorzystać do wykonania nieoczekiwanych działań (np. eskalacji uprawnień). Przykład:
Jeśli symbol wieloznaczny poprzedza ścieżkę, na przykład /some/path/*, to nie jest podatne na atak (nawet ./* też nie jest).
Przeczytaj następną stronę, aby poznać więcej sztuczek związanych z wykorzystaniem symboli wieloznacznych:
Wildcards Spare tricksJeśli możesz modyfikować skrypt Cron uruchamiany przez roota, możesz bardzo łatwo uzyskać dostęp do powłoki:
Jeśli skrypt uruchomiony przez roota używa katalogu, do którego masz pełny dostęp, być może przydatne będzie usunięcie tego folderu i utworzenie symlinku do innego, służącego skryptowi kontrolowanemu przez ciebie.
Możesz monitorować procesy, aby szukać tych, które są wykonywane co 1, 2 lub 5 minut. Być może możesz skorzystać z tego i eskalować uprawnienia.
Na przykład, aby monitorować co 0,1s przez 1 minutę, sortować według mniej wykonywanych poleceń i usuwać polecenia, które zostały wykonane najczęściej, możesz zrobić:
Możesz również użyć pspy (to narzędzie monitoruje i wyświetla każdy proces, który się uruchamia).
Możliwe jest utworzenie zadania cron, dodając znak powrotu karetki po komentarzu (bez znaku nowej linii), a zadanie cron będzie działać. Przykład (zauważ znak powrotu karetki):
Sprawdź, czy możesz zapisać jakikolwiek plik .service
, jeśli tak, możesz go zmodyfikować, aby wykonywał twój tylny wejście po uruchomieniu, ponownym uruchomieniu lub zatrzymaniu usługi (być może będziesz musiał poczekać, aż maszyna zostanie ponownie uruchomiona).
Na przykład, stwórz swoje tylne wejście wewnątrz pliku .service za pomocą ExecStart=/tmp/script.sh
Pamiętaj, że jeśli masz uprawnienia do zapisu do binariów wykonywanych przez usługi, możesz je zmienić na tylne wejścia, więc gdy usługi zostaną ponownie uruchomione, tylne wejścia zostaną wykonane.
Możesz zobaczyć używaną ścieżkę systemd za pomocą:
Jeśli odkryjesz, że możesz zapisywać w którymkolwiek z folderów ścieżki, możesz mieć możliwość eskalacji uprawnień. Musisz szukać plików konfiguracyjnych usług, w których używane są ścieżki względne.
Następnie utwórz wykonywalny plik o takiej samej nazwie jak względna ścieżka binarna w folderze PATH systemd, do którego masz uprawnienia do zapisu, a gdy usługa zostanie poproszona o wykonanie podatnej akcji (Start, Stop, Reload), zostanie wykonane twoje tylne drzwi (zwykle użytkownicy nieuprzywilejowani nie mogą uruchamiać/zatrzymywać usług, ale sprawdź, czy możesz użyć sudo -l
).
Dowiedz się więcej o usługach za pomocą man systemd.service
.
Timery to pliki jednostek systemd, których nazwa kończy się na **.timer**
, kontrolujące pliki lub zdarzenia **.service**
. Timery mogą być używane jako alternatywa dla cron, ponieważ posiadają wbudowane wsparcie dla zdarzeń kalendarzowych i zdarzeń czasu monotonicznego oraz mogą być uruchamiane asynchronicznie.
Możesz wyświetlić wszystkie timery za pomocą:
Jeśli możesz zmodyfikować timer, możesz sprawić, że będzie wykonywał istniejące jednostki systemd (takie jak .service
lub .target
)
W dokumentacji można przeczytać, co to jest jednostka:
Jednostka do aktywacji po upływie tego timera. Argumentem jest nazwa jednostki, której sufiks nie jest ".timer". Jeśli nie jest określone, ta wartość domyślnie ustawia się na usługę, która ma taką samą nazwę jak jednostka timera, z wyjątkiem sufiksu. (Patrz powyżej.) Zaleca się, aby nazwa jednostki aktywowanej i nazwa jednostki timera były nazwane identycznie, z wyjątkiem sufiksu.
W związku z tym, aby wykorzystać to uprawnienie, musiałbyś:
Znaleźć jakąś jednostkę systemd (np. .service
), która wykonuje zapisywalny plik binarny
Znaleźć jakąś jednostkę systemd, która wykonuje ścieżkę względną i masz uprawnienia do zapisu w ścieżce systemd (aby podszyć się pod ten plik wykonywalny)
Dowiedz się więcej o timerach za pomocą man systemd.timer
.
Aby włączyć timer, potrzebujesz uprawnień roota i wykonaj:
Zauważ, że timer jest aktywowany poprzez utworzenie symlinku do niego w /etc/systemd/system/<WantedBy_section>.wants/<name>.timer
Unix Domain Sockets (UDS) umożliwiają komunikację procesów w ramach tych samych lub różnych maszyn w modelach klient-serwer. Wykorzystują standardowe pliki deskryptorów Unix do komunikacji międzykomputerowej i są konfigurowane za pomocą plików .socket
.
Gniazda można skonfigurować za pomocą plików .socket
.
Dowiedz się więcej o gniazdach za pomocą man systemd.socket
. Wewnątrz tego pliku można skonfigurować kilka interesujących parametrów:
ListenStream
, ListenDatagram
, ListenSequentialPacket
, ListenFIFO
, ListenSpecial
, ListenNetlink
, ListenMessageQueue
, ListenUSBFunction
: Te opcje są różne, ale podsumowanie jest używane do wskazania, gdzie będzie nasłuchiwać gniazdo (ścieżka pliku gniazda AF_UNIX, adres IPv4/6 i/lub numer portu do nasłuchiwania, itp.)
Accept
: Przyjmuje argument logiczny. Jeśli jest true, dla każdego przychodzącego połączenia uruchamiana jest instancja usługi i tylko gniazdo połączenia jest do niej przekazywane. Jeśli jest false, wszystkie nasłuchujące gniazda same są przekazywane do uruchomionej jednostki usługi, i tylko jedna jednostka usługi jest uruchamiana dla wszystkich połączeń. Ta wartość jest ignorowana dla gniazd datagramowych i FIFO, gdzie pojedyncza jednostka usługi bezwarunkowo obsługuje cały ruch przychodzący. Domyślnie false. Ze względów wydajnościowych zaleca się pisanie nowych demonów tylko w sposób odpowiedni dla Accept=no
.
ExecStartPre
, ExecStartPost
: Przyjmuje jedną lub więcej linii poleceń, które są wykonywane przed lub po utworzeniu i powiązaniu nasłuchujących gniazd/FIFO. Pierwszy token linii poleceń musi być bezwzględną nazwą pliku, a następnie argumenty dla procesu.
ExecStopPre
, ExecStopPost
: Dodatkowe polecenia, które są wykonywane przed lub po zamknięciu i usunięciu nasłuchujących gniazd/FIFO.
Service
: Określa nazwę jednostki usługi do aktywacji na ruchu przychodzącym. To ustawienie jest dozwolone tylko dla gniazd z Accept=no. Domyślnie jest to usługa, która nosi tę samą nazwę co gniazdo (z zamienionym sufiksem). W większości przypadków nie powinno być konieczne korzystanie z tej opcji.
Jeśli znajdziesz zapisywalny plik .socket
, możesz dodać na początku sekcji [Socket]
coś w rodzaju: ExecStartPre=/home/kali/sys/backdoor
, a backdoor zostanie wykonany przed utworzeniem gniazda. W związku z tym prawdopodobnie będziesz musiał poczekać, aż maszyna zostanie ponownie uruchomiona.
Zauważ, że system musi korzystać z tej konfiguracji pliku gniazda, w przeciwnym razie backdoor nie zostanie wykonany
Jeśli zidentyfikujesz jakiekolwiek zapisywalne gniazdo (teraz mówimy o gniazdach Unix, a nie o plikach konfiguracyjnych .socket
), to możesz komunikować się z tym gniazdem i być może wykorzystać lukę w zabezpieczeniach.
Przykład eksploatacji:
Socket Command InjectionZauważ, że mogą istnieć gniazda nasłuchujące żądań HTTP (Nie mówię o plikach .socket, ale o plikach działających jako gniazda Unix). Możesz to sprawdzić za pomocą:
Jeśli gniazdo odpowiada żądaniem HTTP, możesz z nim komunikować się i być może wykorzystać jakieś podatności.
Gniazdo Dockera, często znajdujące się pod ścieżką /var/run/docker.sock
, to istotny plik, który powinien być zabezpieczony. Domyślnie jest zapisywalny przez użytkownika root
i członków grupy docker
. Posiadanie uprawnień do zapisu tego gniazda może prowadzić do eskalacji uprawnień. Oto analiza, jak to można zrobić, oraz alternatywne metody, jeśli interfejs wiersza poleceń Dockera nie jest dostępny.
Jeśli masz uprawnienia do zapisu w gnieździe Dockera, możesz eskalować uprawnienia, korzystając z następujących poleceń:
Te polecenia pozwalają uruchomić kontener z dostępem na poziomie roota do systemu plików hosta.
W przypadkach, gdy interfejs wiersza poleceń Dockera nie jest dostępny, gniazdo Dockera nadal można manipulować za pomocą interfejsu API Dockera i poleceń curl
.
Wyświetl obrazy Dockera: Pobierz listę dostępnych obrazów.
Utwórz kontener: Wyślij żądanie utworzenia kontenera, który montuje katalog główny systemu hosta.
Uruchom nowo utworzony kontener:
Podłącz się do kontenera: Użyj socat
do nawiązania połączenia z kontenerem, umożliwiając wykonanie poleceń w nim.
Po skonfigurowaniu połączenia socat
możesz wykonywać polecenia bezpośrednio w kontenerze z dostępem na poziomie roota do systemu plików hosta.
Zauważ, że jeśli masz uprawnienia do zapisu w gnieździe Dockera, ponieważ jesteś wewnątrz grupy docker
, masz więcej sposobów na eskalację uprawnień. Jeśli interfejs API Dockera nasłuchuje na porcie możesz również go skompromitować.
Sprawdź więcej sposobów na wyjście z Dockera lub nadużycie go do eskalacji uprawnień w:
Docker SecurityJeśli możesz użyć polecenia ctr
, przeczytaj następną stronę, ponieważ możesz go wykorzystać do eskalacji uprawnień:
Jeśli możesz użyć polecenia runc
, przeczytaj następną stronę, ponieważ możesz go wykorzystać do eskalacji uprawnień:
D-Bus to zaawansowany system komunikacji międzyprocesowej (IPC), który umożliwia aplikacjom efektywną interakcję i udostępnianie danych. Zaprojektowany z myślą o nowoczesnym systemie Linux, oferuje solidną strukturę dla różnych form komunikacji aplikacji.
System jest wszechstronny, obsługując podstawową IPC, która ułatwia wymianę danych między procesami, przypominając ulepszone gniazda domeny UNIX. Ponadto wspiera nadawanie sygnałów lub zdarzeń, sprzyjając bezproblemowej integracji między komponentami systemu. Na przykład sygnał od demona Bluetooth o nadchodzącym połączeniu może skłonić odtwarzacz muzyki do wyciszenia, poprawiając wrażenia użytkownika. Ponadto D-Bus obsługuje system zdalnych obiektów, upraszczając żądania usług i wywołania metod między aplikacjami, usprawniając procesy, które tradycyjnie były skomplikowane.
D-Bus działa w oparciu o model zezwól/odmów, zarządzając uprawnieniami wiadomości (wywołania metod, emisje sygnałów itp.) na podstawie łącznego efektu zgodnych z zasadami polityk. Te polityki określają interakcje z magistralą, potencjalnie umożliwiając eskalację uprawnień poprzez wykorzystanie tych uprawnień.
Przykład takiej polityki w /etc/dbus-1/system.d/wpa_supplicant.conf
jest podany, szczegółowo opisując uprawnienia dla użytkownika roota do posiadania, wysyłania i odbierania wiadomości od fi.w1.wpa_supplicant1
.
Polityki bez określonego użytkownika lub grupy mają zastosowanie uniwersalne, podczas gdy polityki kontekstu "domyślnego" mają zastosowanie do wszystkich, którzy nie są objęci innymi konkretnymi politykami.
Dowiedz się, jak wyliczyć i wykorzystać komunikację D-Bus tutaj:
D-Bus Enumeration & Command Injection Privilege EscalationZawsze interesujące jest wyliczenie sieci i ustalenie pozycji maszyny.
Zawsze sprawdzaj usługi sieciowe działające na maszynie, z którymi wcześniej nie byłeś w stanie wchodzić w interakcje przed uzyskaniem do niej dostępu:
Sprawdź, czy możesz podsłuchiwać ruch sieciowy. Jeśli tak, możesz być w stanie przechwycić pewne dane uwierzytelniające.
Sprawdź kto jesteś, jakie uprawnienia posiadasz, którzy użytkownicy są w systemach, którzy mogą się zalogować oraz którzy posiadają uprawnienia root:
Niektóre wersje Linuxa były dotknięte błędem, który pozwala użytkownikom z UID > INT_MAX na eskalację uprawnień. Więcej informacji: tutaj, tutaj i tutaj.
Wykorzystaj to używając: systemd-run -t /bin/bash
Sprawdź, czy jesteś członkiem jakiejś grupy, która mogłaby przyznać Ci uprawnienia roota:
Interesting Groups - Linux PrivescSprawdź, czy w schowku znajduje się coś interesującego (jeśli to możliwe)
Jeśli znasz jakiekolwiek hasło środowiska, spróbuj zalogować się jako każdy użytkownik używając hasła.
Jeśli nie masz nic przeciwko generowaniu dużej ilości hałasu i binarne pliki su
oraz timeout
są obecne na komputerze, możesz spróbować przeprowadzić atak siłowy na użytkownika za pomocą su-bruteforce.
Linpeas z parametrem -a
również próbuje przeprowadzić atak siłowy na użytkowników.
Jeśli odkryjesz, że możesz pisać wewnątrz pewnego folderu z $PATH, możesz próbować eskalować uprawnienia, tworząc tylnie drzwi w zapisywalnym folderze o nazwie jakiejś komendy, która zostanie wykonana przez innego użytkownika (najlepiej roota) i która nie jest wczytywana z folderu znajdującego się wcześniej niż twój zapisywalny folder w $PATH.
Możesz mieć uprawnienia do wykonania pewnej komendy za pomocą sudo lub mogą mieć ustawiony bit suid. Sprawdź to używając:
Niektóre nieoczekiwane polecenia pozwalają na odczytanie i/lub zapisanie plików, a nawet wykonanie polecenia. Na przykład:
Konfiguracja Sudo może pozwolić użytkownikowi na wykonanie pewnej komendy z uprawnieniami innego użytkownika bez znajomości hasła.
W tym przykładzie użytkownik demo
może uruchomić vim
jako root
, teraz jest banalnie łatwo uzyskać dostęp do powłoki, dodając klucz ssh do katalogu root lub wywołując sh
.
Ta dyrektywa pozwala użytkownikowi ustawić zmienną środowiskową podczas wykonywania czegoś:
To przykład, oparty na maszynie HTB Admirer, był podatny na przechwycenie PYTHONPATH w celu załadowania dowolnej biblioteki pythona podczas wykonywania skryptu jako root:
Skok do odczytu innych plików lub użyj symlinków. Na przykład w pliku sudoers: hacker10 ALL= (root) /bin/less /var/log/*
Jeśli używany jest znak wieloznaczny (*), jest to jeszcze łatwiejsze:
Przeciwdziałania: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/
Jeśli uprawnienia sudo są nadane dla pojedynczego polecenia bez określania ścieżki: hacker10 ALL= (root) less, można to wykorzystać zmieniając zmienną PATH.
Ta technika może być również użyta, jeśli binarny suid wykonuje inne polecenie bez określania ścieżki do niego (zawsze sprawdzaj zawartość dziwnego binarnego pliku SUID za pomocą strings).
Przykłady ładunków do wykonania.
Jeśli binarny suid wykonuje inne polecenie, określając ścieżkę, wtedy można spróbować wyeksportować funkcję o nazwie takiej jak polecenie, które wywołuje plik suid.
Na przykład, jeśli binarny suid wywołuje /usr/sbin/service apache2 start, musisz spróbować utworzyć funkcję i ją wyeksportować:
Zmienna środowiskowa LD_PRELOAD służy do określenia jednej lub więcej bibliotek współdzielonych (.so), które mają być załadowane przez ładowacz przed wszystkimi innymi, w tym standardową bibliotekę C (libc.so
). Ten proces jest znany jako wczytywanie biblioteki.
Jednakże, aby utrzymać bezpieczeństwo systemu i zapobiec wykorzystaniu tej funkcji, zwłaszcza w przypadku plików wykonywalnych suid/sgid, system narzuca pewne warunki:
Ładowacz ignoruje LD_PRELOAD dla plików wykonywalnych, w których rzeczywiste ID użytkownika (ruid) nie pasuje do efektywnego ID użytkownika (euid).
Dla plików wykonywalnych z ustawionymi bitami suid/sgid, wczytywane są tylko biblioteki znajdujące się w standardowych ścieżkach, które również mają ustawione bity suid/sgid.
Eskalacja uprawnień może wystąpić, jeśli masz możliwość wykonywania poleceń za pomocą sudo
, a wynik sudo -l
zawiera instrukcję env_keep+=LD_PRELOAD. Ta konfiguracja pozwala zmiennej środowiskowej LD_PRELOAD pozostać i być rozpoznaną nawet podczas uruchamiania poleceń za pomocą sudo
, co potencjalnie prowadzi do wykonania dowolnego kodu z podwyższonymi uprawnieniami.
Zapisz jako /tmp/pe.c
Następnie skompiluj to używając:
W końcu, zwiększ uprawnienia uruchamiając
Podobne eskalacje uprawnień mogą być wykorzystane, jeśli atakujący kontroluje zmienną środowiskową LD_LIBRARY_PATH, ponieważ kontroluje ścieżkę, w której będą wyszukiwane biblioteki.
Gdy napotkasz binarny plik z uprawnieniami SUID, które wydają się nietypowe, dobrą praktyką jest sprawdzenie, czy poprawnie wczytuje pliki .so. Można to sprawdzić, wykonując poniższą komendę:
Na przykład napotkanie błędu typu "open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)" sugeruje potencjał do wykorzystania.
Aby to wykorzystać, należy przejść do utworzenia pliku C, powiedzmy "/path/to/.config/libcalc.c", zawierającego następujący kod:
Ten kod, po skompilowaniu i wykonaniu, ma na celu podniesienie uprawnień poprzez manipulowanie uprawnieniami plików i uruchomienie powłoki z podniesionymi uprawnieniami.
Skompiluj powyższy plik C do pliku obiektowego współdzielonego (.so) za pomocą polecenia:
Wreszcie, uruchomienie dotkniętego binarnego pliku SUID powinno wywołać eksploit, umożliwiając potencjalne skompromitowanie systemu.
Teraz, gdy znaleźliśmy binarny plik SUID ładujący bibliotekę z folderu, w którym możemy pisać, utwórzmy bibliotekę w tym folderze o odpowiedniej nazwie:
Jeśli otrzymasz błąd taki jak
To oznacza, że wygenerowana przez Ciebie biblioteka musi zawierać funkcję o nazwie a_function_name
.
GTFOBins to starannie wyselekcjonowany spis binarnych plików Unix, które mogą zostać wykorzystane przez atakującego do obejścia lokalnych ograniczeń bezpieczeństwa. GTFOArgs działa na podobnej zasadzie, ale dotyczy przypadków, w których można tylko wstrzykiwać argumenty do polecenia.
Projekt zbiera legalne funkcje binarnych plików Unix, które mogą zostać nadużyte do wyjścia z ograniczonych powłok, eskalacji lub utrzymania podwyższonych uprawnień, transferu plików, uruchamiania powłok typu bind i reverse, oraz ułatwiania innych zadań związanych z eksploatacją po przejęciu systemu.
gdb -nx -ex '!sh' -ex quit sudo mysql -e '! /bin/sh' strace -o /dev/null /bin/sh sudo awk 'BEGIN {system("/bin/sh")}'
Jeśli masz dostęp do sudo -l
, możesz skorzystać z narzędzia FallOfSudo, aby sprawdzić, czy znajduje sposób na wykorzystanie jakiejkolwiek reguły sudo.
W przypadkach, gdy masz dostęp do sudo
, ale nie znasz hasła, możesz eskalować uprawnienia, czekając na wykonanie polecenia sudo, a następnie przejęcie tokena sesji.
Wymagania do eskalacji uprawnień:
Masz już dostęp do powłoki jako użytkownik "sampleuser"
"sampleuser" użył sudo
do wykonania czegoś w ostatnich 15 minutach (domyślnie jest to czas trwania tokenu sudo, który pozwala nam używać sudo
bez konieczności podawania hasła)
cat /proc/sys/kernel/yama/ptrace_scope
wynosi 0
gdb
jest dostępny (możesz go przesłać)
(Możesz tymczasowo włączyć ptrace_scope
poleceniem echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
lub na stałe, modyfikując /etc/sysctl.d/10-ptrace.conf
i ustawiając kernel.yama.ptrace_scope = 0
)
Jeśli spełnione są wszystkie te wymagania, możesz eskalować uprawnienia za pomocą: https://github.com/nongiach/sudo_inject
Pierwsze narzędzie eksploitacji (exploit.sh
) utworzy binarny plik activate_sudo_token
w /tmp. Możesz go użyć do aktywacji tokenu sudo w swojej sesji (nie otrzymasz automatycznie powłoki roota, wykonaj sudo su
):
Drugie wykorzystanie (exploit_v2.sh
) utworzy powłokę sh w /tmp należącą do roota z ustawionym setuid
Trzeci exploit (exploit_v3.sh
) utworzy plik sudoers, który sprawi, że tokeny sudo będą wieczne i umożliwi wszystkim użytkownikom korzystanie z sudo.
Jeśli masz uprawnienia do zapisu w folderze lub do któregokolwiek z utworzonych plików wewnątrz folderu, możesz użyć binarnego pliku write_sudo_token, aby utworzyć token sudo dla użytkownika i PID. Na przykład, jeśli możesz nadpisać plik /var/run/sudo/ts/sampleuser i masz powłokę jako ten użytkownik z PID 1234, możesz uzyskać uprawnienia sudo bez konieczności znajomości hasła, wykonując:
Plik /etc/sudoers
oraz pliki wewnątrz /etc/sudoers.d
konfigurują, kto może używać sudo
oraz w jaki sposób. Te pliki domyślnie mogą być czytane tylko przez użytkownika root i grupę root.
Jeśli jesteś w stanie czytać ten plik, możesz uzyskać pewne interesujące informacje, a jeśli możesz pisać do jakiegokolwiek pliku, będziesz w stanie eskalować uprawnienia.
Jeśli potrafisz pisać, możesz nadużyć tego uprawnienia
Inny sposób nadużycia tych uprawnień:
Istnieją pewne alternatywy dla binarnej aplikacji sudo
, takie jak doas
dla OpenBSD, pamiętaj, aby sprawdzić jego konfigurację w lokalizacji /etc/doas.conf
Jeśli wiesz, że użytkownik zazwyczaj łączy się z maszyną i używa sudo
do eskalacji uprawnień, a ty masz dostęp do powłoki w kontekście tego użytkownika, możesz utworzyć nowy plik wykonywalny sudo, który będzie wykonywał twój kod jako root, a następnie polecenie użytkownika. Następnie zmodyfikuj $PATH kontekstu użytkownika (na przykład dodając nową ścieżkę w .bash_profile), aby po wykonaniu sudo przez użytkownika, został wykonany twój plik wykonywalny sudo.
Zauważ, że jeśli użytkownik używa innej powłoki (nie bash), będziesz musiał zmodyfikować inne pliki, aby dodać nową ścieżkę. Na przykład sudo-piggyback modyfikuje ~/.bashrc
, ~/.zshrc
, ~/.bash_profile
. Możesz znaleźć inny przykład w bashdoor.py
Albo uruchom coś w stylu:
Plik /etc/ld.so.conf
wskazuje skąd pochodzą załadowane pliki konfiguracyjne. Zazwyczaj plik ten zawiera następującą ścieżkę: include /etc/ld.so.conf.d/*.conf
Oznacza to, że pliki konfiguracyjne z /etc/ld.so.conf.d/*.conf
zostaną odczytane. Te pliki konfiguracyjne wskazują na inne foldery, w których będą szukane biblioteki. Na przykład zawartość pliku /etc/ld.so.conf.d/libc.conf
to /usr/local/lib
. Oznacza to, że system będzie szukał bibliotek wewnątrz /usr/local/lib
.
Jeśli z jakiegoś powodu użytkownik ma uprawnienia do zapisu w którymkolwiek z podanych ścieżek: /etc/ld.so.conf
, /etc/ld.so.conf.d/
, jakikolwiek plik wewnątrz /etc/ld.so.conf.d/
lub jakikolwiek folder wewnątrz pliku konfiguracyjnego w /etc/ld.so.conf.d/*.conf
, może być w stanie eskalować uprawnienia.
Zobacz jak wykorzystać tę błędną konfigurację na następnej stronie:
Poprzez skopiowanie biblioteki do /var/tmp/flag15/
zostanie ona użyta przez program w tym miejscu, jak określono w zmiennej RPATH
.
Następnie utwórz złośliwą bibliotekę w /var/tmp
za pomocą gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6
Zdolności systemu Linux zapewniają podzbiór dostępnych uprawnień roota dla procesu. W efekcie to rozbija uprawnienia roota na mniejsze i odrębne jednostki. Każda z tych jednostek może być niezależnie przyznana procesom. W ten sposób pełen zestaw uprawnień jest zmniejszony, co zmniejsza ryzyko eksploatacji. Przeczytaj następującą stronę, aby dowiedzieć się więcej o zdolnościach i jak je nadużywać:
Linux CapabilitiesW katalogu bit "execute" oznacza, że dotknięty użytkownik może "cd" do folderu. Bit "read" oznacza, że użytkownik może wyświetlić pliki, a bit "write" oznacza, że użytkownik może usunąć i tworzyć nowe pliki.
Listy kontroli dostępu (ACL) reprezentują drugą warstwę dyskrecyjnych uprawnień, zdolnych do nadpisywania tradycyjnych uprawnień ugo/rwx. Te uprawnienia zwiększają kontrolę nad dostępem do pliku lub katalogu, pozwalając na przyznawanie lub odmawianie praw określonym użytkownikom, którzy nie są właścicielami ani członkami grupy. Ten poziom dokładności zapewnia bardziej precyzyjne zarządzanie dostępem. Więcej szczegółów można znaleźć tutaj.
Daj użytkownikowi "kali" uprawnienia do odczytu i zapisu pliku:
Pobierz pliki z określonymi ACL-ami z systemu:
W starych wersjach możesz przejąć kontrolę nad sesją powłoki innego użytkownika (root). W najnowszych wersjach będziesz mógł połączyć się tylko z sesjami ekranowymi twojego własnego użytkownika. Niemniej jednak, możesz znaleźć interesujące informacje wewnątrz sesji.
Lista sesji ekranowych
Dołącz do sesji
Był to problem z starymi wersjami tmux. Nie mogłem przejąć sesji tmux (v2.1) utworzonej przez roota jako użytkownik nieuprzywilejowany.
Lista sesji tmux
Dołącz do sesji
Sprawdź Valentine box z HTB jako przykład.
Wszystkie klucze SSL i SSH wygenerowane na systemach opartych na Debianie (Ubuntu, Kubuntu, itp.) między wrześniem 2006 a 13 maja 2008 mogą być dotknięte tym błędem. Ten błąd występuje podczas tworzenia nowego klucza ssh w tych systemach operacyjnych, ponieważ było możliwych tylko 32 768 wariacji. Oznacza to, że wszystkie możliwości można obliczyć i posiadając klucz publiczny ssh, można wyszukać odpowiadający mu klucz prywatny. Możesz znaleźć obliczone możliwości tutaj: https://github.com/g0tmi1k/debian-ssh
PasswordAuthentication: Określa, czy uwierzytelnianie hasłem jest dozwolone. Wartość domyślna to no
.
PubkeyAuthentication: Określa, czy uwierzytelnianie za pomocą klucza publicznego jest dozwolone. Wartość domyślna to yes
.
PermitEmptyPasswords: Gdy uwierzytelnianie hasłem jest dozwolone, określa, czy serwer zezwala na logowanie do kont z pustymi ciągami hasła. Wartość domyślna to no
.
Określa, czy root może zalogować się za pomocą ssh, domyślnie jest no
. Możliwe wartości:
yes
: root może zalogować się za pomocą hasła i klucza prywatnego
without-password
lub prohibit-password
: root może zalogować się tylko za pomocą klucza prywatnego
forced-commands-only
: Root może zalogować się tylko za pomocą klucza prywatnego i jeśli są określone opcje poleceń
no
: nie
Określa pliki zawierające klucze publiczne, które mogą być używane do uwierzytelniania użytkownika. Może zawierać tokeny takie jak %h
, które zostaną zastąpione przez katalog domowy. Możesz wskazać ścieżki bezwzględne (zaczynające się od /
) lub ścieżki względne od katalogu domowego użytkownika. Na przykład:
Ta konfiguracja wskaże, że jeśli spróbujesz zalogować się za pomocą klucza prywatnego użytkownika "nazwa_testowego_użytkownika", ssh porówna klucz publiczny Twojego klucza z tymi znajdującymi się w /home/nazwa_testowego_użytkownika/.ssh/authorized_keys
i /home/nazwa_testowego_użytkownika/access
Przekazywanie agenta SSH pozwala Ci używać lokalnych kluczy SSH zamiast pozostawiać klucze (bez haseł!) na Twoim serwerze. Dzięki temu będziesz mógł przeskoczyć za pomocą ssh do hosta i stamtąd przeskoczyć do innego hosta korzystając z klucza znajdującego się na Twoim początkowym hoście.
Musisz ustawić tę opcję w pliku $HOME/.ssh.config
w ten sposób:
Zauważ, że jeśli Host
to *
, za każdym razem gdy użytkownik przejdzie na inną maszynę, ta maszyna będzie miała dostęp do kluczy (co stanowi problem związany z bezpieczeństwem).
Plik /etc/ssh_config
może nadpisać te opcje i zezwolić lub zabronić tej konfiguracji.
Plik /etc/sshd_config
może zezwolić lub zabronić przekazywanie ssh-agenta za pomocą słowa kluczowego AllowAgentForwarding
(domyślnie jest zezwolone).
Jeśli zauważysz, że Forward Agent jest skonfigurowany w środowisku, przeczytaj następującą stronę, ponieważ możesz go wykorzystać do eskalacji uprawnień:
SSH Forward Agent exploitationPlik /etc/profile
oraz pliki w /etc/profile.d/
to skrypty wykonywane, gdy użytkownik uruchamia nową powłokę. Dlatego jeśli możesz zapisać lub zmodyfikować którykolwiek z nich, możesz eskalować uprawnienia.
Jeśli znajdziesz jakikolwiek dziwny skrypt profilu, powinieneś sprawdzić go pod kątem wrażliwych danych.
W zależności od systemu operacyjnego pliki /etc/passwd
i /etc/shadow
mogą mieć inną nazwę lub istnieć kopie zapasowe. Dlatego zaleca się znalezienie wszystkich i sprawdzenie, czy możesz je odczytać, aby zobaczyć, czy zawierają hashe wewnątrz plików:
W niektórych sytuacjach można znaleźć hashe haseł wewnątrz pliku /etc/passwd
(lub równoważnego)
Najpierw wygeneruj hasło za pomocą jednej z poniższych poleceń.
Następnie dodaj użytkownika hacker
i wprowadź wygenerowane hasło.
Na przykład: hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash
Możesz teraz użyć polecenia su
z hacker:hacker
Alternatywnie, możesz użyć poniższych linii, aby dodać użytkownika z pustym hasłem. OSTRZEŻENIE: może to obniżyć obecną ochronę maszyny.
UWAGA: Na platformach BSD plik /etc/passwd
znajduje się pod ścieżką /etc/pwd.db
i /etc/master.passwd
, a plik /etc/shadow
został przemianowany na /etc/spwd.db
.
Należy sprawdzić, czy można zapisywać w pewnych wrażliwych plikach. Na przykład, czy można zapisać w pewnym pliku konfiguracyjnym usługi?
Na przykład, jeśli maszyna uruchamia serwer tomcat i możesz modyfikować plik konfiguracyjny usługi Tomcat wewnątrz /etc/systemd/, to możesz zmodyfikować linie:
Twoje tylne drzwi zostaną uruchomione następnym razem, gdy zostanie uruchomiony tomcat.
Następujące foldery mogą zawierać kopie zapasowe lub interesujące informacje: /tmp, /var/tmp, /var/backups, /var/mail, /var/spool/mail, /etc/exports, /root (Prawdopodobnie nie będziesz w stanie odczytać ostatniego, ale spróbuj)
Przeczytaj kod linPEAS, który wyszukuje kilka możliwych plików, które mogą zawierać hasła. Inne interesujące narzędzie, które możesz użyć do tego celu, to: LaZagne, które jest aplikacją open source służącą do odzyskiwania wielu haseł przechowywanych na komputerze lokalnym w systemach Windows, Linux i Mac.
Jeśli potrafisz czytać dzienniki, możesz znaleźć w nich interesujące/poufne informacje. Im dziwniejszy jest dziennik, tym bardziej interesujący będzie (prawdopodobnie). Ponadto, niektóre "źle" skonfigurowane (z backdoorem?) dzienniki audytu mogą pozwolić Ci zapisywać hasła w dziennikach audytu, jak wyjaśniono w tym poście: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/.
Aby czytać dzienniki grupy adm będą naprawdę pomocne.
Należy również sprawdzić pliki zawierające słowo "password" w nazwie lub w treści, a także sprawdzić adresy IP i maile w logach, lub wyrażenia regularne dla hashy. Nie zamierzam tutaj wymieniać, jak to zrobić, ale jeśli jesteś zainteresowany, możesz sprawdzić ostatnie sprawdzenia, które wykonuje linpeas.
Jeśli wiesz skąd będzie uruchamiany skrypt w języku Python i możesz pisać wewnątrz tego folderu lub modyfikować biblioteki Pythona, możesz zmodyfikować bibliotekę systemową i umieścić w niej backdoor (jeśli możesz pisać tam, gdzie będzie uruchamiany skrypt w Pythonie, skopiuj i wklej bibliotekę os.py).
Aby umieścić backdoor w bibliotece, wystarczy dodać na końcu biblioteki os.py następującą linię (zmień IP i PORT):
Podatność w logrotate
pozwala użytkownikom z uprawnieniami do zapisu do pliku dziennika lub jego katalogów nadrzędnych potencjalnie uzyskać podwyższone uprawnienia. Dzieje się tak, ponieważ logrotate
, często uruchamiany jako root, może być manipulowany w celu wykonania dowolnych plików, zwłaszcza w katalogach takich jak /etc/bash_completion.d/. Ważne jest sprawdzenie uprawnień nie tylko w /var/log, ale także w dowolnym katalogu, w którym stosowane jest obracanie logów.
Ta podatność dotyczy wersji logrotate
3.18.0
i starszych
Szczegółowe informacje na temat podatności można znaleźć na tej stronie: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.
Możesz wykorzystać tę podatność za pomocą logrotten.
Ta podatność jest bardzo podobna do CVE-2016-1247 (dzienniki nginx), więc gdy tylko zauważysz, że możesz zmieniać dzienniki, sprawdź, kto nimi zarządza, i sprawdź, czy możesz uzyskać wyższe uprawnienia, podmieniając dzienniki na dowiązania symboliczne.
Odwołanie do podatności: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
Jeśli z jakiegoś powodu użytkownik jest w stanie zapisać skrypt ifcf-<cokolwiek>
do /etc/sysconfig/network-scripts lub może dostosować istniejący, to twój system jest skompromitowany.
Skrypty sieciowe, np. ifcg-eth0, są używane do połączeń sieciowych. Wyglądają dokładnie jak pliki .INI. Jednakże są one ~załączane~ na Linuxie przez Menedżera Sieci (dispatcher.d).
W moim przypadku atrybut NAME=
w tych skryptach sieciowych nie jest obsługiwany poprawnie. Jeśli masz białą/przerwę w nazwie, system próbuje wykonać część po białej/przerwie. Oznacza to, że wszystko po pierwszej białej/przerwie jest wykonywane jako root.
Na przykład: /etc/sysconfig/network-scripts/ifcfg-1337
Katalog /etc/init.d
jest domem dla skryptów Systemu V init (SysVinit), klasycznego systemu zarządzania usługami w systemie Linux. Zawiera skrypty do startowania
, zatrzymywania
, restartowania
oraz czasami przeładowywania
usług. Mogą być wykonywane bezpośrednio lub poprzez linki symboliczne znajdujące się w /etc/rc?.d/
. Alternatywną ścieżką w systemach Redhat jest /etc/rc.d/init.d
.
Z kolei /etc/init
jest związane z Upstart, nowszym systemem zarządzania usługami wprowadzonym przez Ubuntu, używającym plików konfiguracyjnych do zadań zarządzania usługami. Pomimo przejścia na Upstart, skrypty SysVinit są wciąż wykorzystywane obok konfiguracji Upstart ze względu na warstwę kompatybilności w Upstart.
systemd pojawia się jako nowoczesny inicjalizator i menedżer usług, oferujący zaawansowane funkcje takie jak uruchamianie demona na żądanie, zarządzanie automatycznym montowaniem oraz tworzenie migawek stanu systemu. Organizuje pliki w /usr/lib/systemd/
dla pakietów dystrybucyjnych oraz /etc/systemd/system/
dla modyfikacji administratora, usprawniając proces administracji systemem.
LinEnum: https://github.com/rebootuser/LinEnum(-t option) Enumy: https://github.com/luke-goddard/enumy Unix Privesc Check: http://pentestmonkey.net/tools/audit/unix-privesc-check Linux Priv Checker: www.securitysift.com/download/linuxprivchecker.py BeeRoot: https://github.com/AlessandroZ/BeRoot/tree/master/Linux Kernelpop: Wyliczanie podatności jądra w systemach Linux i MAC https://github.com/spencerdodd/kernelpop Mestaploit: multi/recon/local_exploit_suggester Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester EvilAbigail (dostęp fizyczny): https://github.com/GDSSecurity/EvilAbigail Kompilacja więcej skryptów: https://github.com/1N3/PrivEsc
Naucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Naucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)