Linux Privilege Escalation
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Zacznijmy od zdobywania wiedzy o działającym systemie operacyjnym
Jeśli masz uprawnienia do zapisu w jakimkolwiek folderze wewnątrz zmiennej PATH
, możesz być w stanie przejąć niektóre biblioteki lub binaria:
Interesujące informacje, hasła lub klucze API w zmiennych środowiskowych?
Sprawdź wersję jądra i czy istnieje jakiś exploit, który można wykorzystać do eskalacji uprawnień.
Możesz znaleźć dobrą listę podatnych jąder i kilka już skompilowanych exploitów tutaj: https://github.com/lucyoa/kernel-exploits oraz exploitdb sploits. Inne strony, na których możesz znaleźć kilka skompilowanych exploitów: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack
Aby wyodrębnić wszystkie podatne wersje jąder z tej strony, możesz zrobić:
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 W ofierze, sprawdza tylko exploity dla jądra 2.x)
Zawsze wyszukuj wersję jądra w Google, może twoja wersja jądra jest wymieniona w jakimś exploicie jądra, a wtedy będziesz pewien, że ten exploit jest ważny.
Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8
Na podstawie podatnych wersji sudo, które pojawiają się w:
Możesz sprawdzić, czy wersja sudo jest podatna, używając tego grep.
Od @sickrov
Sprawdź smasher2 box of HTB dla przykładu jak ta luka może być wykorzystana
Jeśli jesteś wewnątrz kontenera docker, możesz spróbować się z niego wydostać:
Docker SecuritySprawdź co jest zamontowane i odmontowane, gdzie i dlaczego. Jeśli coś jest odmontowane, możesz spróbować to zamontować i sprawdzić prywatne informacje.
Wymień przydatne binaria
Sprawdź również, czy jakikolwiek kompilator jest zainstalowany. Jest to przydatne, jeśli musisz użyć jakiegoś exploit'a jądra, ponieważ zaleca się skompilowanie go na maszynie, na której zamierzasz go używać (lub na podobnej).
Sprawdź wersję zainstalowanych pakietów i usług. Może istnieje jakaś stara wersja Nagios (na przykład), która mogłaby być wykorzystana do eskalacji uprawnień… Zaleca się ręczne sprawdzenie wersji bardziej podejrzanego zainstalowanego oprogramowania.
Jeśli masz dostęp SSH do maszyny, możesz również użyć openVAS, aby sprawdzić, czy na maszynie zainstalowane są przestarzałe i podatne na ataki oprogramowanie.
Uwaga, że te polecenia pokażą wiele informacji, które będą głównie 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ą uruchamiane i sprawdź, czy którykolwiek proces ma więcej uprawnień niż powinien (może tomcat uruchamiany przez roota?)
Zawsze sprawdzaj możliwe debuggery electron/cef/chromium działające, możesz je wykorzystać do eskalacji uprawnień. Linpeas wykrywają je, sprawdzając parametr --inspect
w wierszu poleceń procesu.
Również sprawdź swoje uprawnienia do binariów procesów, może uda ci się nadpisać kogoś.
Możesz użyć narzędzi takich jak pspy do monitorowania procesów. Może to być bardzo przydatne do identyfikacji podatnych procesów, które są często uruchamiane lub gdy spełniony jest zestaw wymagań.
Niektóre usługi serwera zapisują poświadczenia w postaci czystego tekstu w pamięci. Normalnie będziesz potrzebować uprawnień roota, aby odczytać pamięć procesów, które należą 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 domyślnie nie pozwala na ptrace, co oznacza, że nie możesz zrzucać innych procesów, które należą do twojego nieuprzywilejowanego użytkownika.
Plik /proc/sys/kernel/yama/ptrace_scope kontroluje dostępność ptrace:
kernel.yama.ptrace_scope = 0: wszystkie procesy mogą być debugowane, o ile mają ten sam uid. To klasyczny sposób, w jaki działało ptracing.
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 uprawnienia CAP_SYS_PTRACE.
kernel.yama.ptrace_scope = 3: Żadne procesy nie mogą być śledzone za pomocą ptrace. Po ustawieniu, wymagany jest restart, aby ponownie włączyć ptracing.
Jeśli masz dostęp do pamięci usługi FTP (na przykład), możesz uzyskać stertę i przeszukać jej poświadczenia.
Dla danego identyfikatora procesu, maps pokazuje, jak pamięć jest mapowana w wirtualnej przestrzeni adresowej tego procesu; pokazuje również uprawnienia każdej mapowanej sekcji. Pseudo plik mem ujawnia pamięć procesów. Z pliku maps wiemy, które regiony pamięci są czytelne i ich przesunięcia. Używamy tych informacji, aby przeszukiwać plik mem i zrzucać wszystkie czytelne regiony do pliku.
/dev/mem
zapewnia dostęp do fizycznej pamięci systemu, a nie do pamięci wirtualnej. Wirtualna przestrzeń adresowa jądra może być dostępna za pomocą /dev/kmem.
Typowo, /dev/mem
jest tylko do odczytu przez root i grupę kmem.
ProcDump to linuksowa reinterpretacja klasycznego narzędzia ProcDump z zestawu narzędzi Sysinternals dla systemu Windows. Pobierz je w 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 root i zrzucić proces, który należy do Ciebie
Skrypt A.5 z https://www.delaat.net/rp/2016-2017/p97/report.pdf (wymagany jest root)
Jeśli znajdziesz, że proces uwierzytelniający jest uruchomiony:
Możesz zrzucić proces (zobacz wcześniejsze sekcje, aby znaleźć różne sposoby na zrzucenie pamięci procesu) i przeszukać pamięć w poszukiwaniu poświadczeń:
Narzędzie https://github.com/huntergregal/mimipenguin kradnie hasła w postaci czystego tekstu z pamięci oraz z niektórych znanych plików. Wymaga uprawnień roota, aby działać poprawnie.
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. Może uda ci się skorzystać ze skryptu wykonywanego przez roota (vuln z użyciem symboli wieloznacznych? można modyfikować pliki używane przez roota? użyj symlinków? utwórz konkretne pliki w katalogu, który używa root?).
Na przykład, w /etc/crontab możesz znaleźć PATH: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
(Zauważ, że użytkownik "user" ma uprawnienia do zapisu w /home/user)
Jeśli w tym crontabie użytkownik root spróbuje wykonać jakąś komendę lub skrypt bez ustawienia ścieżki. Na przykład: * * * * root overwrite.sh Wtedy możesz uzyskać powłokę roota, używając:
Jeśli skrypt wykonywany przez roota zawiera „*” w poleceniu, możesz to wykorzystać do wywołania nieoczekiwanych rzeczy (jak privesc). Przykład:
Jeśli znak wieloznaczny jest poprzedzony ścieżką jak /some/path/* , nie jest podatny (nawet ./* nie jest).
Przeczytaj następującą stronę, aby poznać więcej sztuczek z wykorzystaniem znaków wieloznacznych:
Wildcards Spare tricksJeśli możesz modyfikować skrypt cron wykonywany przez roota, możesz bardzo łatwo uzyskać powłokę:
Jeśli skrypt wykonywany przez root używa katalogu, do którego masz pełny dostęp, może być przydatne usunięcie tego folderu i utworzenie folderu symlink do innego, który obsługuje skrypt kontrolowany przez Ciebie.
Możesz monitorować procesy, aby wyszukiwać procesy, które są wykonywane co 1, 2 lub 5 minut. Może uda ci się to wykorzystać i podnieść uprawnienia.
Na przykład, aby monitorować co 0,1s przez 1 minutę, posortować według mniej wykonywanych poleceń i usunąć polecenia, które były wykonywane najczęściej, możesz zrobić:
Możesz również użyć pspy (to będzie monitorować i wyświetlać każdy proces, który się uruchamia).
Możliwe jest stworzenie 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ł twoją tylną furtkę, gdy usługa jest uruchamiana, ponownie uruchamiana lub zatrzymywana (może będziesz musiał poczekać, aż maszyna zostanie ponownie uruchomiona).
Na przykład stwórz swoją tylną furtkę wewnątrz pliku .service z ExecStart=/tmp/script.sh
Pamiętaj, że jeśli masz uprawnienia do zapisu nad binariami wykonywanymi przez usługi, możesz je zmienić na tylne furtki, aby gdy usługi zostaną ponownie uruchomione, tylne furtki będą wykonywane.
Możesz zobaczyć PATH używaną przez systemd za pomocą:
Jeśli odkryjesz, że możesz zapisywać w dowolnym z folderów ścieżki, możesz być w stanie eskalować uprawnienia. Musisz poszukać ścieżek względnych używanych w plikach konfiguracyjnych usług takich jak:
Następnie utwórz wykonywalny plik o tej samej nazwie co binarny plik ścieżki względnej w folderze PATH systemd, do którego masz prawo zapisu, a gdy usługa zostanie poproszona o wykonanie podatnej akcji (Start, Stop, Reload), twoja tylnia furtka zostanie wykonana (użytkownicy bez uprawnień zazwyczaj 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**
, które kontrolują pliki **.service**
lub zdarzenia. Timery mogą być używane jako alternatywa dla cron, ponieważ mają wbudowane wsparcie dla zdarzeń czasowych kalendarza i zdarzeń monotonicznych oraz mogą być uruchamiane asynchronicznie.
Możesz wylistować wszystkie timery za pomocą:
Jeśli możesz modyfikować timer, możesz sprawić, że wykona on niektóre instancje systemd.unit (takie jak .service
lub .target
)
W dokumentacji możesz przeczytać, czym jest jednostka:
Jednostka do aktywacji, gdy ten timer wygaśnie. Argument to nazwa jednostki, której przyrostek nie jest ".timer". Jeśli nie jest określony, ta wartość domyślnie odnosi się do usługi, która ma tę samą nazwę co jednostka timera, z wyjątkiem przyrostka. (Zobacz powyżej.) Zaleca się, aby nazwa jednostki, która jest aktywowana, i nazwa jednostki timera były identyczne, z wyjątkiem przyrostka.
Dlatego, aby nadużyć tego uprawnienia, musisz:
Znaleźć jakąś jednostkę systemd (taką jak .service
), która wykonuje zapisywalny plik binarny
Znaleźć jakąś jednostkę systemd, która wykonuje względną ścieżkę 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 wykonać:
Note the timer is activated by creating a symlink to it on /etc/systemd/system/<WantedBy_section>.wants/<name>.timer
Unix Domain Sockets (UDS) umożliwiają komunikację procesów na tych samych lub różnych maszynach w modelach klient-serwer. Wykorzystują standardowe pliki deskryptorów Unix do komunikacji między komputerami i są konfigurowane za pomocą plików .socket
.
Sockets can be configured using .socket
files.
Learn more about sockets with man systemd.socket
. Inside this file, several interesting parameters can be configured:
ListenStream
, ListenDatagram
, ListenSequentialPacket
, ListenFIFO
, ListenSpecial
, ListenNetlink
, ListenMessageQueue
, ListenUSBFunction
: Te opcje są różne, ale podsumowanie jest używane do określenia, gdzie będzie nasłuchiwać na gniazdo (ścieżka pliku gniazda AF_UNIX, IPv4/6 i/lub numer portu do nasłuchu itp.)
Accept
: Przyjmuje argument boolean. Jeśli true, instancja usługi jest uruchamiana dla każdego przychodzącego połączenia i tylko gniazdo połączenia jest do niej przekazywane. Jeśli false, wszystkie gniazda nasłuchujące są przekazywane do uruchomionej jednostki usługi, a tylko jedna jednostka usługi jest uruchamiana dla wszystkich połączeń. Ta wartość jest ignorowana dla gniazd datagramowych i FIFO, gdzie jedna jednostka usługi bezwarunkowo obsługuje cały przychodzący ruch. Domyślnie false. Z powodó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 tym, jak gniazda/FIFO są tworzone i związane, odpowiednio. Pierwszy token linii poleceń musi być absolutną nazwą pliku, a następnie muszą być podane argumenty dla procesu.
ExecStopPre
, ExecStopPost
: Dodatkowe polecenia, które są wykonywane przed lub po tym, jak gniazda/FIFO są zamykane i usuwane, odpowiednio.
Service
: Określa nazwę jednostki usługi, którą należy aktywować przy przychodzącym ruchu. Ustawienie to jest dozwolone tylko dla gniazd z Accept=no. Domyślnie jest to usługa, która nosi tę samą nazwę co gniazdo (z zastąpionym sufiksem). W większości przypadków nie powinno być konieczne korzystanie z tej opcji.
If you find a writable .socket
file you can add at the beginning of the [Socket]
section something like: ExecStartPre=/home/kali/sys/backdoor
and the backdoor will be executed before the socket is created. Therefore, you will probably need to wait until the machine is rebooted.
&#xNAN;Note that the system must be using that socket file configuration or the backdoor won't be executed
If you identify any writable socket (now we are talking about Unix Sockets and not about the config .socket
files), then you can communicate with that socket and maybe exploit a vulnerability.
Przykład eksploatacji:
Socket Command InjectionZauważ, że mogą istnieć gniazda nasłuchujące na żądania 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 komunikować się z nim i może uda ci się wykorzystać jakąś lukę.
Gniazdo Docker, często znajdujące się w /var/run/docker.sock
, jest krytycznym plikiem, który powinien być zabezpieczony. Domyślnie jest zapisywalne przez użytkownika root
i członków grupy docker
. Posiadanie dostępu do zapisu w tym gnieździe może prowadzić do eskalacji uprawnień. Oto podział, jak można to zrobić oraz alternatywne metody, jeśli interfejs wiersza poleceń Docker nie jest dostępny.
Jeśli masz dostęp do zapisu w gnieździe Docker, możesz eskalować uprawnienia, używając następujących poleceń:
Te polecenia pozwalają na uruchomienie kontenera z dostępem na poziomie roota do systemu plików hosta.
W przypadkach, gdy interfejs wiersza poleceń Dockera nie jest dostępny, gniazdo Dockera można nadal manipulować za pomocą API Dockera i poleceń curl
.
Lista obrazów 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
, aby nawiązać połączenie z kontenerem, umożliwiając wykonanie poleceń w jego wnętrzu.
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ś w grupie docker
, masz więcej sposobów na eskalację uprawnień. Jeśli API dockera nasłuchuje na porcie, możesz również być w stanie je skompromitować.
Sprawdź więcej sposobów na wydostanie się z dockera lub nadużycie go w celu eskalacji uprawnień w:
Docker SecurityJeśli odkryjesz, że możesz używać polecenia ctr
, przeczytaj następującą stronę, ponieważ możesz być w stanie nadużyć go w celu eskalacji uprawnień:
Jeśli odkryjesz, że możesz używać polecenia runc
, przeczytaj następującą stronę, ponieważ możesz być w stanie nadużyć go w celu eskalacji uprawnień:
D-Bus to zaawansowany system komunikacji międzyprocesowej (IPC), który umożliwia aplikacjom efektywne interakcje i wymianę danych. Zaprojektowany z myślą o nowoczesnym systemie Linux, oferuje solidną ramę dla różnych form komunikacji aplikacji.
System jest wszechstronny, wspierając podstawowe IPC, które poprawia wymianę danych między procesami, przypominając ulepszone gniazda domeny UNIX. Ponadto, wspiera nadawanie zdarzeń lub sygnałów, ułatwiając płynne integrowanie komponentów systemu. Na przykład, sygnał od demona Bluetooth o nadchodzącym połączeniu może spowodować, że odtwarzacz muzyki wyciszy dźwięk, poprawiając doświadczenia użytkownika. Dodatkowo, D-Bus wspiera system obiektów zdalnych, upraszczając żądania usług i wywołania metod między aplikacjami, co usprawnia procesy, które były tradycyjnie skomplikowane.
D-Bus działa na modelu zezwolenia/odmowy, zarządzając uprawnieniami wiadomości (wywołania metod, emisje sygnałów itp.) na podstawie kumulatywnego efektu dopasowanych reguł polityki. Polityki te 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 root do posiadania, wysyłania i odbierania wiadomości z fi.w1.wpa_supplicant1
.
Polityki bez określonego użytkownika lub grupy mają zastosowanie uniwersalne, podczas gdy polityki kontekstowe "domyślne" mają zastosowanie do wszystkich, które nie są objęte innymi specyficznymi politykami.
Dowiedz się, jak enumerować i wykorzystywać komunikację D-Bus tutaj:
D-Bus Enumeration & Command Injection Privilege EscalationZawsze warto enumerować sieć i ustalić pozycję maszyny.
Zawsze sprawdzaj usługi sieciowe działające na maszynie, z którymi nie mogłeś się wcześniej skontaktować:
Sprawdź, czy możesz przechwytywać ruch. Jeśli tak, możesz być w stanie zdobyć jakieś poświadczenia.
Sprawdź kim jesteś, jakie uprawnienia posiadasz, którzy użytkownicy są w systemach, którzy mogą zalogować się i którzy mają 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 może 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 przeszkadza ci robienie dużego hałasu i binaria su
oraz timeout
są obecne na komputerze, możesz spróbować przeprowadzić brute-force użytkownika używając su-bruteforce.
Linpeas z parametrem -a
również próbuje przeprowadzić brute-force użytkowników.
Jeśli odkryjesz, że możesz zapisywać w niektórym folderze $PATH, możesz być w stanie podnieść uprawnienia poprzez utworzenie tylnego wejścia w zapisywalnym folderze o nazwie jakiejś komendy, która będzie wykonywana przez innego użytkownika (najlepiej root) i która nie jest ładowana z folderu, który znajduje się przed twoim zapisywalnym folderem w $PATH.
Możesz mieć pozwolenie na wykonanie niektórej komendy używając sudo lub mogą mieć bit suid. Sprawdź to używając:
Niektóre nieoczekiwane polecenia pozwalają na odczyt i/lub zapis plików lub nawet wykonanie polecenia. Na przykład:
Konfiguracja Sudo może pozwolić użytkownikowi na wykonanie niektórych poleceń z uprawnieniami innego użytkownika bez znajomości hasła.
W tym przykładzie użytkownik demo
może uruchomić vim
jako root
, teraz uzyskanie powłoki jest trywialne poprzez dodanie klucza ssh do katalogu root lub przez wywołanie sh
.
Ta dyrektywa pozwala użytkownikowi ustawić zmienną środowiskową podczas wykonywania czegoś:
Ten przykład, oparty na maszynie HTB Admirer, był vulnerable na PYTHONPATH hijacking, aby załadować dowolną bibliotekę 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żyto wildcard (*), jest to jeszcze łatwiejsze:
Środki zaradcze: https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/
Jeśli uprawnienia sudo są przyznane do pojedynczej komendy bez określenia ścieżki: hacker10 ALL= (root) less możesz to wykorzystać, zmieniając zmienną PATH
Ta technika może być również używana, jeśli suid binarny wykonuje inne polecenie bez określenia ścieżki do niego (zawsze sprawdzaj za pomocą strings zawartość dziwnego binarnego pliku SUID).
Przykłady ładunków do wykonania.
Jeśli suid binarny wykonuje inne polecenie, określając ścieżkę, wtedy możesz spróbować wyeksportować funkcję o nazwie odpowiadającej poleceniu, które wywołuje plik suid.
Na przykład, jeśli binarny plik suid wywołuje /usr/sbin/service apache2 start, musisz spróbować stworzyć funkcję i ją wyeksportować:
Then, when you call the suid binary, this function will be executed
The LD_PRELOAD environment variable is used to specify one or more shared libraries (.so files) to be loaded by the loader before all others, including the standard C library (libc.so
). This process is known as preloading a library.
However, to maintain system security and prevent this feature from being exploited, particularly with suid/sgid executables, the system enforces certain conditions:
The loader disregards LD_PRELOAD for executables where the real user ID (ruid) does not match the effective user ID (euid).
For executables with suid/sgid, only libraries in standard paths that are also suid/sgid are preloaded.
Privilege escalation can occur if you have the ability to execute commands with sudo
and the output of sudo -l
includes the statement env_keep+=LD_PRELOAD. This configuration allows the LD_PRELOAD environment variable to persist and be recognized even when commands are run with sudo
, potentially leading to the execution of arbitrary code with elevated privileges.
Zapisz jako /tmp/pe.c
Następnie skompiluj to używając:
Na koniec, escalate privileges uruchamiając
Podobne privesc może być nadużywane, jeśli atakujący kontroluje zmienną środowiskową LD_LIBRARY_PATH, ponieważ kontroluje ścieżkę, w której będą wyszukiwane biblioteki.
Gdy napotkasz binarkę z uprawnieniami SUID, która wydaje się nietypowa, dobrym zwyczajem jest sprawdzenie, czy poprawnie ładuje pliki .so. Można to sprawdzić, uruchamiając następujące polecenie:
Na przykład, napotkanie błędu takiego jak "open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (Brak takiego pliku lub katalogu)" sugeruje potencjał do wykorzystania.
Aby to wykorzystać, należy stworzyć plik C, powiedzmy "/path/to/.config/libcalc.c", zawierający następujący kod:
Ten kod, po skompilowaniu i wykonaniu, ma na celu podniesienie uprawnień poprzez manipulację uprawnieniami plików i uruchomienie powłoki z podniesionymi uprawnieniami.
Skompiluj powyższy plik C do pliku obiektu współdzielonego (.so) za pomocą:
Ostatecznie uruchomienie dotkniętego binarnego pliku SUID powinno wywołać exploit, co może prowadzić do kompromitacji systemu.
Teraz, gdy znaleźliśmy binarkę SUID ładującą bibliotekę z folderu, w którym możemy pisać, stwórzmy bibliotekę w tym folderze o odpowiedniej nazwie:
Jeśli otrzymasz błąd taki jak
to oznacza, że biblioteka, którą wygenerowałeś, musi mieć funkcję o nazwie a_function_name
.
GTFOBins to starannie wyselekcjonowana lista binarnych plików Unix, które mogą być wykorzystywane przez atakującego do obejścia lokalnych ograniczeń bezpieczeństwa. GTFOArgs jest tym samym, ale w przypadkach, gdy możesz tylko wstrzykiwać argumenty w poleceniu.
Projekt zbiera legalne funkcje binarnych plików Unix, które mogą być nadużywane do wydostawania się z ograniczonych powłok, eskalacji lub utrzymywania podwyższonych uprawnień, transferu plików, uruchamiania powłok bind i reverse oraz ułatwiania innych zadań poeksploatacyjnych.
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 użyć narzędzia FallOfSudo, aby sprawdzić, czy znajdzie 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 przejmując token sesji.
Wymagania do eskalacji uprawnień:
Już masz powłokę jako użytkownik "sampleuser"
"sampleuser" użył sudo
do wykonania czegoś w ostatnich 15 minutach (domyślnie to czas trwania tokena sudo, który pozwala nam używać sudo
bez wprowadzania hasła)
cat /proc/sys/kernel/yama/ptrace_scope
wynosi 0
gdb
jest dostępny (możesz być w stanie go przesłać)
(Możesz tymczasowo włączyć ptrace_scope
za pomocą echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
lub trwale modyfikując /etc/sysctl.d/10-ptrace.conf
i ustawiając kernel.yama.ptrace_scope = 0
)
Jeśli wszystkie te wymagania są spełnione, możesz eskalować uprawnienia używając: https://github.com/nongiach/sudo_inject
Pierwszy exploit (exploit.sh
) utworzy binarny plik activate_sudo_token
w /tmp. Możesz go użyć do aktywacji tokena sudo w swojej sesji (nie otrzymasz automatycznie powłoki root, wykonaj sudo su
):
Drugi exploit (exploit_v2.sh
) utworzy powłokę sh w /tmp należącą do roota z ustawionym setuid
Trzeci eksploit (exploit_v3.sh
) utworzy plik sudoers, który sprawi, że tokeny sudo będą wieczne i pozwoli wszystkim użytkownikom na korzystanie z sudo
Jeśli masz uprawnienia do zapisu w folderze lub w którymkolwiek z utworzonych plików w tym folderze, możesz użyć binarnego 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 potrzeby znajomości hasła, wykonując:
Plik /etc/sudoers
oraz pliki w /etc/sudoers.d
konfigurują, kto może używać sudo
i w jaki sposób. Te pliki domyślnie mogą być odczytywane tylko przez użytkownika root i grupę root.
Jeśli możesz odczytać ten plik, możesz być w stanie uzyskać interesujące informacje, a jeśli możesz zapisać jakikolwiek plik, będziesz mógł eskalować uprawnienia.
Jeśli potrafisz pisać, możesz nadużyć tego uprawnienia.
Inny sposób na nadużycie tych uprawnień:
Istnieją pewne alternatywy dla binarnego pliku sudo
, takie jak doas
dla OpenBSD, pamiętaj, aby sprawdzić jego konfigurację w /etc/doas.conf
Jeśli wiesz, że użytkownik zazwyczaj łączy się z maszyną i używa sudo
do eskalacji uprawnień, a ty uzyskałeś powłokę w kontekście tego użytkownika, możesz utworzyć nowy plik wykonywalny sudo, który wykona 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 gdy użytkownik wykona sudo, twój plik wykonywalny sudo został uruchomiony.
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
Lub uruchamiając coś takiego:
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
To oznacza, że pliki konfiguracyjne z /etc/ld.so.conf.d/*.conf
będą odczytywane. Te pliki konfiguracyjne wskazują na inne foldery, w których biblioteki będą wyszukiwane. Na przykład, zawartość /etc/ld.so.conf.d/libc.conf
to /usr/local/lib
. To oznacza, że system będzie szukał bibliotek w /usr/local/lib
.
Jeśli z jakiegoś powodu użytkownik ma uprawnienia do zapisu w którejkolwiek z wskazanych ścieżek: /etc/ld.so.conf
, /etc/ld.so.conf.d/
, dowolny plik w /etc/ld.so.conf.d/
lub dowolny folder w pliku konfiguracyjnym w /etc/ld.so.conf.d/*.conf
, może być w stanie podnieść uprawnienia.
Zobacz jak wykorzystać tę błędną konfigurację na następnej stronie:
Kopiując bibliotekę do /var/tmp/flag15/
, będzie ona używana przez program w tym miejscu, zgodnie z określoną zmienną 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
Linux capabilities provide a podzbiór dostępnych uprawnień roota dla procesu. To skutecznie dzieli uprawnienia roota na mniejsze i wyraźne jednostki. Każda z tych jednostek może być następnie niezależnie przyznawana procesom. W ten sposób pełny zestaw uprawnień jest zmniejszany, co zmniejsza ryzyko wykorzystania. Read the following page to learn more about capabilities and how to abuse them:
Linux CapabilitiesIn a directory, the bit for "execute" implies that the user affected can "cd" into the folder. The "read" bit implies the user can list the files, and the "write" bit implies the user can delete and create new files.
Access Control Lists (ACLs) represent the secondary layer of discretionary permissions, capable of overriding the traditional ugo/rwx permissions. These permissions enhance control over file or directory access by allowing or denying rights to specific users who are not the owners or part of the group. This level of granularity ensures more precise access management. Further details can be found here.
Give user "kali" read and write permissions over a file:
Pobierz pliki z określonymi ACL z systemu:
W starych wersjach możesz przejąć niektóre sesje powłoki innego użytkownika (root). W najnowszych wersjach będziesz mógł połączyć się tylko z sesjami ekranu swojego własnego użytkownika. Jednak możesz znaleźć interesujące informacje wewnątrz sesji.
Lista sesji ekranu
Dołącz do sesji
To był problem z starymi wersjami tmux. Nie mogłem przejąć sesji tmux (v2.1) utworzonej przez roota jako użytkownik bez uprawnień.
Lista sesji tmux
Dołącz do sesji
Sprawdź Valentine box z HTB jako przykład.
Wszystkie klucze SSL i SSH generowane na systemach opartych na Debianie (Ubuntu, Kubuntu itp.) między wrześniem 2006 a 13 maja 2008 mogą być dotknięte tym błędem. Błąd ten występuje podczas tworzenia nowego klucza ssh w tych systemach, ponieważ możliwe były tylko 32 768 wariantów. Oznacza to, że wszystkie możliwości można obliczyć i mając publiczny klucz ssh, można wyszukać odpowiadający 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. Domyślnie jest no
.
PubkeyAuthentication: Określa, czy uwierzytelnianie za pomocą klucza publicznego jest dozwolone. Domyślnie jest yes
.
PermitEmptyPasswords: Gdy uwierzytelnianie hasłem jest dozwolone, określa, czy serwer zezwala na logowanie do kont z pustymi ciągami haseł. Domyślnie jest no
.
Określa, czy root może logować się za pomocą ssh, domyślnie jest no
. Możliwe wartości:
yes
: root może logować się za pomocą hasła i klucza prywatnego
without-password
lub prohibit-password
: root może logować się tylko za pomocą klucza prywatnego
forced-commands-only
: Root może logować się tylko za pomocą klucza prywatnego i jeśli opcje poleceń są określone
no
: nie
Określa pliki, które zawierają klucze publiczne, które mogą być używane do uwierzytelniania użytkowników. Może zawierać tokeny takie jak %h
, które zostaną zastąpione katalogiem domowym. Możesz wskazać ścieżki absolutne (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ą prywatnego klucza użytkownika "testusername", ssh porówna klucz publiczny twojego klucza z tymi znajdującymi się w /home/testusername/.ssh/authorized_keys
i /home/testusername/access
Przekazywanie agenta SSH pozwala na używanie lokalnych kluczy SSH zamiast pozostawiania kluczy (bez haseł!) na serwerze. Dzięki temu będziesz mógł przeskoczyć przez ssh do hosta i stamtąd przeskoczyć do innego hosta używając klucza znajdującego się w twoim początkowym hoście.
Musisz ustawić tę opcję w $HOME/.ssh.config
w ten sposób:
Zauważ, że jeśli Host
to *
, za każdym razem, gdy użytkownik przeskakuje na inną maszynę, ten host będzie mógł uzyskać dostęp do kluczy (co stanowi problem bezpieczeństwa).
Plik /etc/ssh_config
może nadpisać te opcje i zezwolić lub zabronić tej konfiguracji.
Plik /etc/sshd_config
może zezwolić lub zabronić przekazywania ssh-agent za pomocą słowa kluczowego AllowAgentForwarding
(domyślnie zezwala).
Jeśli stwierdzisz, że Forward Agent jest skonfigurowany w środowisku, przeczytaj następującą stronę, ponieważ możesz być w stanie to wykorzystać do eskalacji uprawnień:
SSH Forward Agent exploitationPlik /etc/profile
oraz pliki w /etc/profile.d/
to skrypty, które są 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 może istnieć ich kopia zapasowa. Dlatego zaleca się znalezienie ich wszystkich i sprawdzenie, czy możesz je odczytać, aby zobaczyć czy znajdują się w nich hashe:
W niektórych przypadkach możesz znaleźć hashes haseł w pliku /etc/passwd
(lub równoważnym).
Najpierw wygeneruj hasło za pomocą jednej z następujących komend.
Następnie dodaj użytkownika hacker
i dodaj wygenerowane hasło.
E.g: 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ć następujących linii, aby dodać fikcyjnego użytkownika bez hasła. OSTRZEŻENIE: możesz pogorszyć obecne bezpieczeństwo maszyny.
NOTE: Na platformach BSD /etc/passwd
znajduje się w /etc/pwd.db
i /etc/master.passwd
, a także /etc/shadow
jest przemianowane na /etc/spwd.db
.
Powinieneś sprawdzić, czy możesz zapisać w niektórych wrażliwych plikach. Na przykład, czy możesz zapisać w jakimś pliku konfiguracyjnym usługi?
Na przykład, jeśli maszyna działa na serwerze tomcat i możesz zmodyfikować plik konfiguracyjny usługi Tomcat w /etc/systemd/, wtedy możesz zmodyfikować linie:
Twoja tylna furtka zostanie uruchomiona przy następnym uruchomieniu 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 przeszukuje kilka możliwych plików, które mogą zawierać hasła. Innym interesującym narzędziem, które możesz użyć do tego celu, jest: LaZagne, które jest aplikacją open source służącą do odzyskiwania wielu haseł przechowywanych na lokalnym komputerze dla Windows, Linux i Mac.
Jeśli możesz czytać dzienniki, możesz być w stanie znaleźć interesujące/poufne informacje w ich wnętrzu. Im bardziej dziwny jest dziennik, tym bardziej interesujący będzie (prawdopodobnie). Ponadto, niektóre "źle" skonfigurowane (z tylnią furtką?) dzienniki audytu mogą pozwolić ci na rejestrowanie haseł w dziennikach audytu, jak wyjaśniono w tym poście: https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/.
Aby czytać logi, grupa adm będzie naprawdę pomocna.
Powinieneś również sprawdzić pliki zawierające słowo "password" w nazwie lub wewnątrz treści, a także sprawdzić IP i e-maile w logach, lub wyrażenia regularne dla hashy. Nie zamierzam tutaj wymieniać, jak to wszystko zrobić, ale jeśli jesteś zainteresowany, możesz sprawdzić ostatnie kontrole, które wykonuje linpeas.
Jeśli wiesz, skąd skrypt pythonowy będzie wykonywany i możesz pisać w tym folderze lub możesz modyfikować biblioteki python, możesz zmodyfikować bibliotekę OS i wprowadzić do niej backdoora (jeśli możesz pisać tam, gdzie skrypt pythonowy będzie wykonywany, skopiuj i wklej bibliotekę os.py).
Aby wprowadzić backdoora do biblioteki, po prostu dodaj na końcu biblioteki os.py następującą linię (zmień IP i PORT):
Luka w logrotate
pozwala użytkownikom z uprawnieniami do zapisu w pliku dziennika lub jego katalogach nadrzędnych potencjalnie uzyskać podwyższone uprawnienia. Dzieje się tak, ponieważ logrotate
, często działający jako root, może być manipulowany w celu wykonania dowolnych plików, szczególnie w katalogach takich jak /etc/bash_completion.d/. Ważne jest, aby sprawdzić uprawnienia nie tylko w /var/log, ale także w każdym katalogu, w którym stosuje się rotację logów.
Ta luka dotyczy wersji logrotate
3.18.0
i starszych
Szczegółowe informacje na temat luki można znaleźć na tej stronie: https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition.
Możesz wykorzystać tę lukę za pomocą logrotten.
Ta luka jest bardzo podobna do CVE-2016-1247 (logi nginx), więc za każdym razem, gdy stwierdzisz, że możesz zmieniać logi, sprawdź, kto zarządza tymi logami i sprawdź, czy możesz uzyskać podwyższone uprawnienia, zastępując logi dowiązaniami symbolicznymi.
Referencja luki: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f
Jeśli, z jakiegokolwiek 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 pwned.
Skrypty sieciowe, takie jak ifcg-eth0, są używane do połączeń sieciowych. Wyglądają dokładnie jak pliki .INI. Jednak są ~sourced~ w systemie Linux przez Network Manager (dispatcher.d).
W moim przypadku, atrybut NAME=
w tych skryptach sieciowych nie jest obsługiwany poprawnie. Jeśli masz białą/pustą przestrzeń w nazwie, system próbuje wykonać część po białej/pustej przestrzeni. Oznacza to, że wszystko po pierwszej pustej przestrzeni jest wykonywane jako root.
Na przykład: /etc/sysconfig/network-scripts/ifcfg-1337
Katalog /etc/init.d
jest domem dla skryptów System V init (SysVinit), klasycznego systemu zarządzania usługami w Linuksie. Zawiera skrypty do start
, stop
, restart
, a czasami reload
usług. Mogą być one wykonywane bezpośrednio lub przez dowiązania symboliczne znajdujące się w /etc/rc?.d/
. Alternatywną ścieżką w systemach Redhat jest /etc/rc.d/init.d
.
Z drugiej strony, /etc/init
jest związany z Upstart, nowszym zarządzaniem usługami wprowadzonym przez Ubuntu, wykorzystującym pliki konfiguracyjne do zadań zarządzania usługami. Pomimo przejścia na Upstart, skrypty SysVinit są nadal wykorzystywane obok konfiguracji Upstart z powodu warstwy zgodności w Upstart.
systemd pojawia się jako nowoczesny menedżer inicjalizacji i usług, oferujący zaawansowane funkcje, takie jak uruchamianie demonów na żądanie, zarządzanie automontowaniem i migawki stanu systemu. Organizuje pliki w /usr/lib/systemd/
dla pakietów dystrybucyjnych i /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: Enumerate kernel vulns ins linux and 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
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)