Linux Capabilities
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Mając na celu promowanie wiedzy technicznej, ten kongres stanowi wrzące miejsce spotkań dla profesjonalistów technologii i cyberbezpieczeństwa we wszystkich dziedzinach.\
Linux Capabilities
Linux capabilities dzielą uprawnienia roota na mniejsze, odrębne jednostki, pozwalając procesom na posiadanie podzbioru uprawnień. Dzięki temu minimalizuje się ryzyko, nie przyznając niepotrzebnie pełnych uprawnień roota.
Problem:
Zwykli użytkownicy mają ograniczone uprawnienia, co wpływa na zadania takie jak otwieranie gniazd sieciowych, które wymagają dostępu roota.
Zbiory uprawnień:
Dziedziczone (CapInh):
Cel: Określa uprawnienia przekazywane przez proces nadrzędny.
Funkcjonalność: Gdy tworzony jest nowy proces, dziedziczy on uprawnienia z tego zbioru po swoim rodzicu. Przydatne do utrzymania określonych uprawnień w procesach potomnych.
Ograniczenia: Proces nie może uzyskać uprawnień, których jego rodzic nie posiadał.
Efektywne (CapEff):
Cel: Reprezentuje aktualnie wykorzystywane przez proces uprawnienia.
Funkcjonalność: Jest to zbiór uprawnień, których jądro sprawdza, aby udzielić zgody na różne operacje. Dla plików, ten zbiór może być flagą wskazującą, czy uprawnienia dozwolone pliku mają być uważane za efektywne.
Znaczenie: Zbiór efektywny jest kluczowy dla natychmiastowych sprawdzeń uprawnień, działając jako aktywny zbiór uprawnień, który może być używany przez proces.
Dozwolone (CapPrm):
Cel: Określa maksymalny zbiór uprawnień, jakie proces może posiadać.
Funkcjonalność: Proces może podnieść uprawnienie ze zbioru dozwolonego do zbioru efektywnego, dając mu możliwość korzystania z tego uprawnienia. Może również odrzucić uprawnienia ze zbioru dozwolonego.
Granica: Działa jako górne ograniczenie dla uprawnień, jakie proces może mieć, zapewniając, że proces nie przekracza określonego zakresu uprawnień.
Ograniczające (CapBnd):
Cel: Ustala górną granicę uprawnień, jakie proces może zdobyć w trakcie swojego cyklu życia.
Funkcjonalność: Nawet jeśli proces ma określone uprawnienie w swoim zbiorze dziedzicznym lub dozwolonym, nie może zdobyć tego uprawnienia, chyba że jest również w zbiorze ograniczającym.
Przykład użycia: Ten zbiór jest szczególnie przydatny do ograniczania potencjału eskalacji uprawnień procesu, dodając dodatkową warstwę zabezpieczeń.
Środowiskowe (CapAmb):
Cel: Pozwala na utrzymanie określonych uprawnień podczas wywołania systemowego
execve
, które zwykle powoduje pełne zresetowanie uprawnień procesu.Funkcjonalność: Zapewnia, że programy nie-SUID, które nie mają powiązanych uprawnień plików, mogą zachować określone uprawnienia.
Ograniczenia: Uprawnienia w tym zbiorze podlegają ograniczeniom zbiorów dziedzicznego i dozwolonego, zapewniając, że nie przekraczają one dozwolonych uprawnień procesu.
Aby uzyskać dalsze informacje, sprawdź:
Uprawnienia procesów i plików binarnych
Uprawnienia procesów
Aby zobaczyć uprawnienia dla danego procesu, użyj pliku status w katalogu /proc. Ponieważ dostarcza on więcej szczegółów, ograniczmy go tylko do informacji dotyczących uprawnień systemu Linux. Zauważ, że dla wszystkich działających procesów informacje o uprawnieniach są przechowywane na poziomie wątku, a dla plików binarnych w systemie plików są one przechowywane w rozszerzonych atrybutach.
Możesz znaleźć zdefiniowane uprawnienia w pliku /usr/include/linux/capability.h
Możesz znaleźć uprawnienia bieżącego procesu w cat /proc/self/status
lub wykonując capsh --print
, a uprawnienia innych użytkowników w /proc/<pid>/status
Ten polecenie powinno zwrócić 5 linii na większości systemów.
CapInh = Dziedziczone uprawnienia
CapPrm = Dozwolone uprawnienia
CapEff = Efektywne uprawnienia
CapBnd = Zestaw graniczny
CapAmb = Zestaw uprawnień środowiskowych
Te liczby szesnastkowe nie mają sensu. Za pomocą narzędzia capsh możemy je odkodować na nazwę uprawnień.
Sprawdźmy teraz uprawnienia używane przez ping
:
Chociaż to działa, istnieje inny i prostszy sposób. Aby zobaczyć uprawnienia działającego procesu, wystarczy użyć narzędzia getpcaps po którym podajemy jego identyfikator procesu (PID). Można również podać listę identyfikatorów procesów.
Sprawdźmy tutaj uprawnienia tcpdump
po nadaniu wystarczających uprawnień binarnemu (cap_net_admin
i cap_net_raw
) do podsłuchiwania sieci (tcpdump działa w procesie 9562):
Jak widać, podane uprawnienia odpowiadają wynikom dwóch sposobów uzyskiwania uprawnień dla pliku binarnego. Narzędzie getpcaps korzysta z wywołania systemowego capget(), aby zapytać o dostępne uprawnienia dla określonego wątku. Wywołanie systemowe to wymaga tylko podania identyfikatora PID, aby uzyskać więcej informacji.
Uprawnienia plików binarnych
Pliki binarne mogą mieć uprawnienia, które mogą być używane podczas wykonywania. Na przykład, bardzo często można znaleźć plik binarny ping
z uprawnieniem cap_net_raw
:
Możesz wyszukiwać binarne z uprawnieniami za pomocą:
Zrzucanie uprawnień za pomocą capsh
Jeśli zrzucimy uprawnienia CAP_NET_RAW dla ping, to narzędzie ping przestanie działać.
Oprócz samego wyniku capsh, również samo polecenie tcpdump powinno wywołać błąd.
/bin/bash: /usr/sbin/tcpdump: Operacja niedozwolona
Błąd jednoznacznie pokazuje, że polecenie ping nie ma uprawnień do otwarcia gniazda ICMP. Teraz wiemy na pewno, że to działa zgodnie z oczekiwaniami.
Usuwanie uprawnień
Możesz usunąć uprawnienia binarnego pliku za pomocą
Uprawnienia użytkownika
Wygląda na to, że można przypisać uprawnienia również do użytkowników. Oznacza to prawdopodobnie, że każdy proces uruchomiony przez użytkownika będzie mógł korzystać z jego uprawnień.
Na podstawie tego, tego i tego kilka plików musi zostać skonfigurowanych, aby nadać użytkownikowi określone uprawnienia, ale plik odpowiedzialny za przypisanie uprawnień do każdego użytkownika to /etc/security/capability.conf
.
Przykład pliku:
Zdolności środowiskowe
Kompilując poniższy program, można uruchomić powłokę bash w środowisku, które udostępnia zdolności.
Wewnątrz bash uruchomionego przez skompilowany plik binarny środowiskowy można zauważyć nowe uprawnienia (zwykły użytkownik nie będzie miał żadnych uprawnień w sekcji "aktualnej").
Możesz dodać tylko uprawnienia, które są obecne zarówno w zestawie dozwolonych, jak i dziedzicznych.
Binarki świadome uprawnień / Binarki nieświadome uprawnień
Binarki świadome uprawnień nie będą korzystać z nowych uprawnień przekazanych przez środowisko, natomiast binarki nieświadome uprawnień będą z nich korzystać, ponieważ nie odrzucą ich. Oznacza to, że binarki nieświadome uprawnień są podatne w specjalnym środowisku, które przyznaje uprawnienia binarnym.
Uprawnienia usługi
Domyślnie usługa uruchomiona jako root będzie miała przypisane wszystkie uprawnienia, a w niektórych przypadkach może to być niebezpieczne. Dlatego plik konfiguracyjny usługi pozwala na określenie uprawnień, które chcesz, aby miała, oraz użytkownika, który powinien wykonywać usługę, aby uniknąć uruchamiania usługi z niepotrzebnymi uprawnieniami:
Uprawnienia w kontenerach Docker
Domyślnie Docker przypisuje kilka uprawnień do kontenerów. Bardzo łatwo sprawdzić, jakie są te uprawnienia, wykonując polecenie:
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Mając na celu promowanie wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów technologii i cyberbezpieczeństwa we wszystkich dziedzinach.
Eskalacja uprawnień/Ucieczka z kontenera
Można wykorzystać zdolności, gdy chcesz ograniczyć własne procesy po wykonaniu uprzywilejowanych operacji (np. po skonfigurowaniu chroot i powiązaniu z gniazdem). Jednak mogą być one wykorzystane przez przekazywanie im złośliwych poleceń lub argumentów, które są następnie uruchamiane jako root.
Możesz wymusić zdolności na programach za pomocą setcap
i sprawdzić je za pomocą getcap
:
+ep
oznacza, że dodajesz zdolność ("-" usuwa ją) jako Efektywną i Dozwoloną.
Aby zidentyfikować programy w systemie lub folderze posiadające zdolności:
Przykład wykorzystania
W poniższym przykładzie stwierdzono, że binarny plik /usr/bin/python2.6
jest podatny na eskalację uprawnień:
Zdolności potrzebne przez tcpdump
, aby umożliwić dowolnemu użytkownikowi podsłuchiwanie pakietów:
After setting the capabilities, any user will be able to run tcpdump
and sniff packets without requiring root privileges.
Zdolności potrzebne przez tcpdump
, aby umożliwić dowolnemu użytkownikowi podsłuchiwanie pakietów:
Po ustawieniu zdolności, dowolny użytkownik będzie mógł uruchomić tcpdump
i podsłuchiwać pakiety bez konieczności posiadania uprawnień roota.
Specjalny przypadek "pustych" uprawnień
Z dokumentacji: Należy zauważyć, że można przypisać puste zbiory uprawnień do pliku programu, co oznacza, że można utworzyć program z ustawionym identyfikatorem użytkownika root, który zmienia efektywny i zapisany identyfikator użytkownika do 0, ale nie nadaje żadnych uprawnień temu procesowi. Innymi słowy, jeśli masz plik binarny, który:
nie jest własnością roota,
nie ma ustawionych bitów
SUID
/SGID
,ma pusty zbiór uprawnień (np.
getcap myelf
zwracamyelf =ep
),
to ten plik binarny zostanie uruchomiony jako root.
CAP_SYS_ADMIN
CAP_SYS_ADMIN
to bardzo potężne uprawnienie w systemie Linux, często porównywane do poziomu roota ze względu na swoje rozległe uprawnienia administracyjne, takie jak montowanie urządzeń czy manipulowanie funkcjami jądra. Chociaż jest niezbędne dla kontenerów symulujących całe systemy, CAP_SYS_ADMIN
stanowi znaczne wyzwanie dla bezpieczeństwa, zwłaszcza w środowiskach konteneryzowanych, ze względu na możliwość eskalacji uprawnień i kompromitacji systemu. Dlatego jego użycie wymaga rygorystycznej oceny bezpieczeństwa i ostrożnego zarządzania, z silnym naciskiem na odrzucenie tego uprawnienia w kontenerach specyficznych dla aplikacji, aby przestrzegać zasady najmniejszych uprawnień i zminimalizować powierzchnię ataku.
Przykład z plikiem binarnym
Za pomocą pythona można zamontować zmodyfikowany plik passwd na oryginalnym pliku passwd:
I na koniec zamontuj zmodyfikowany plik passwd
w lokalizacji /etc/passwd
:
I będziesz w stanie su
jako root używając hasła "password".
Przykład z środowiskiem (Docker breakout)
Możesz sprawdzić włączone uprawnienia wewnątrz kontenera Docker za pomocą:
W poprzednim wyniku można zobaczyć, że możliwość SYS_ADMIN jest włączona.
Montowanie
To pozwala kontenerowi Docker na montowanie dysku hosta i swobodny dostęp do niego:
Pełny dostęp
W poprzedniej metodzie udało nam się uzyskać dostęp do dysku hosta Docker. Jeśli zauważysz, że host uruchamia serwer ssh, możesz utworzyć użytkownika wewnątrz dysku hosta Docker i uzyskać do niego dostęp za pomocą SSH:
CAP_SYS_PTRACE
To oznacza, że możesz uciec z kontenera, wstrzykując shellcode do pewnego procesu działającego wewnątrz hosta. Aby uzyskać dostęp do procesów działających wewnątrz hosta, kontener musi być uruchomiony przynajmniej z opcją --pid=host
.
CAP_SYS_PTRACE
umożliwia korzystanie z funkcji debugowania i śledzenia wywołań systemowych dostarczanych przez ptrace(2)
oraz wywołań dołączania pamięci międzyprocesowej, takich jak process_vm_readv(2)
i process_vm_writev(2)
. Chociaż jest to potężne narzędzie do celów diagnostycznych i monitorowania, jeśli CAP_SYS_PTRACE
jest włączone bez restrykcyjnych środków, takich jak filtr seccomp dla ptrace(2)
, może to znacznie osłabić bezpieczeństwo systemu. W szczególności, może być wykorzystane do obejścia innych ograniczeń bezpieczeństwa, zwłaszcza tych narzuconych przez seccomp, jak pokazują dowody koncepcyjne (PoC) takie jak ten.
Przykład z użyciem pliku binarnego (python)
Przykład z użyciem binarnego pliku (gdb)
gdb
z uprawnieniami ptrace
:
Utwórz shellcode za pomocą narzędzia msfvenom do wstrzykiwania go w pamięć za pomocą gdb.
Teraz możesz użyć wygenerowanego shellcode'u do wstrzykiwania go w pamięć w celu uzyskania dostępu do powłoki systemowej.
Debuguj proces roota za pomocą gdb i skopiuj-wklej wcześniej wygenerowane linie gdb:
Przykład z środowiskiem (Docker breakout) - kolejne nadużycie gdb
Jeśli GDB jest zainstalowany (lub można go zainstalować za pomocą apk add gdb
lub apt install gdb
na przykład), można debugować proces z hosta i sprawić, aby wywołał funkcję system
. (Ta technika wymaga również uprawnienia SYS_ADMIN
).
Nie będziesz w stanie zobaczyć wyniku wykonanej komendy, ale zostanie ona wykonana przez ten proces (aby uzyskać powłokę rev).
Jeśli otrzymasz błąd "No symbol "system" in current context.", sprawdź poprzedni przykład ładowania shellcode do programu za pomocą gdb.
Przykład z użyciem środowiska (przełamanie Docker) - Wstrzyknięcie kodu Shell
Możesz sprawdzić włączone uprawnienia wewnątrz kontenera Docker, używając:
Lista procesów działających na hostingu ps -eaf
Pobierz architekturę
uname -m
Znajdź shellcode dla tej architektury (https://www.exploit-db.com/exploits/41128)
Znajdź program, który wstrzyknie shellcode do pamięci procesu (https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)
Zmodyfikuj shellcode wewnątrz programu i skompiluj go
gcc inject.c -o inject
Wstrzyknij go i złap swoją powłokę:
./inject 299; nc 172.17.0.1 5600
CAP_SYS_MODULE
CAP_SYS_MODULE
umożliwia procesowi ładowanie i usuwanie modułów jądra (systemowe wywołania init_module(2)
, finit_module(2)
i delete_module(2)
), oferując bezpośredni dostęp do podstawowych operacji jądra. Ta zdolność niesie ze sobą poważne ryzyko bezpieczeństwa, ponieważ umożliwia eskalację uprawnień i całkowite skompromitowanie systemu, umożliwiając modyfikacje jądra i omijanie wszystkich mechanizmów bezpieczeństwa Linuxa, w tym modułów bezpieczeństwa Linuxa i izolacji kontenerów. Oznacza to, że możesz wstawiać/usuwać moduły jądra w/ze jądra maszyny hostującej.
Przykład z użyciem binarnego pliku
W poniższym przykładzie binarny plik python
ma tę zdolność.
Domyślnie polecenie modprobe
sprawdza listę zależności i pliki mapy w katalogu /lib/modules/$(uname -r)
.
Aby wykorzystać to, stwórzmy fałszywy folder lib/modules:
Następnie skompiluj moduł jądra, poniżej znajdziesz 2 przykłady, a następnie skopiuj go do tego folderu:
Wreszcie, wykonaj potrzebny kod Pythona, aby załadować ten moduł jądra:
Przykład 2 z plikiem binarnym
W poniższym przykładzie plik binarny kmod
ma tę zdolność.
Co oznacza, że można użyć polecenia insmod
do wstawienia modułu jądra. Przyjrzyj się poniższemu przykładowi, aby uzyskać odwróconą powłokę wykorzystując tę uprzywilejowaną możliwość.
Przykład z użyciem środowiska (przełamanie Docker)
Możesz sprawdzić włączone uprawnienia wewnątrz kontenera Docker, używając:
W poprzednim wyniku można zobaczyć, że możliwość SYS_MODULE jest włączona.
Utwórz moduł jądra, który będzie wykonywał odwróconą powłokę i Makefile, aby go skompilować:
Pusty znak przed każdym słowem make w pliku Makefile musi być tabulatorem, a nie spacją!
Wykonaj polecenie make
, aby go skompilować.
Wreszcie, uruchom nc
wewnątrz powłoki i załaduj moduł z innej powłoki, aby przechwycić powłokę w procesie nc:
Kod tej techniki został skopiowany z laboratorium "Wykorzystywanie uprawnień SYS_MODULE" ze strony https://www.pentesteracademy.com/
Inny przykład tej techniki można znaleźć pod adresem https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host
CAP_DAC_READ_SEARCH
CAP_DAC_READ_SEARCH umożliwia procesowi ominięcie uprawnień do odczytu plików oraz odczytu i wykonania katalogów. Jego głównym zastosowaniem jest wyszukiwanie plików lub odczyt. Jednakże, umożliwia również procesowi użycie funkcji open_by_handle_at(2)
, która może uzyskać dostęp do dowolnego pliku, włącznie z tymi spoza przestrzeni montowania procesu. Uchwyt używany w open_by_handle_at(2)
powinien być nieprzezroczystym identyfikatorem uzyskanym za pomocą name_to_handle_at(2)
, ale może zawierać wrażliwe informacje, takie jak numery i-węzłów, które są podatne na manipulację. Potencjał wykorzystania tej zdolności, zwłaszcza w kontekście kontenerów Docker, został zademonstrowany przez Sebastiana Krahmera za pomocą exploitu shocker, jak analizuje się tutaj. Oznacza to, że można ominąć sprawdzanie uprawnień do odczytu plików oraz sprawdzanie uprawnień do odczytu/wykonania katalogów.
Przykład z użyciem binariów
Binarny plik będzie mógł odczytać dowolny plik. Jeśli plik, na przykład tar, ma tę zdolność, będzie mógł odczytać plik shadow:
Przykład z binary2
W tym przypadku załóżmy, że binarny plik python
ma tę zdolność. Aby wyświetlić listę plików roota, możesz wykonać:
Aby odczytać plik, można wykonać:
Przykład w środowisku (Docker breakout)
Możesz sprawdzić włączone uprawnienia wewnątrz kontenera Docker za pomocą:
W poprzednim wyniku można zobaczyć, że włączona jest zdolność DAC_READ_SEARCH. W rezultacie kontener może debugować procesy.
Możesz dowiedzieć się, jak działa następujące wykorzystanie pod adresem https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3, ale w skrócie CAP_DAC_READ_SEARCH nie tylko pozwala nam na przeglądanie systemu plików bez sprawdzania uprawnień, ale także wyraźnie usuwa wszelkie sprawdzanie open_by_handle_at(2) i może pozwolić naszemu procesowi na odczytywanie wrażliwych plików otwartych przez inne procesy.
Oryginalne wykorzystanie, które wykorzystuje te uprawnienia do odczytywania plików z hosta, można znaleźć tutaj: http://stealth.openwall.net/xSports/shocker.c, poniżej znajduje się zmodyfikowana wersja, która pozwala wskazać plik, który chcesz odczytać jako pierwszy argument i zrzucić go do pliku.
W celu wykorzystania podatności, należy znaleźć wskaźnik do czegoś zamontowanego na hoście. Oryginalna podatność używała pliku /.dockerinit, a ta zmodyfikowana wersja używa /etc/hostname. Jeśli podatność nie działa, być może trzeba ustawić inny plik. Aby znaleźć plik zamontowany na hoście, wystarczy wykonać polecenie mount:
Kod tej techniki został skopiowany z laboratorium "Wykorzystywanie zdolności DAC_READ_SEARCH" z https://www.pentesteracademy.com/
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Mając misję promowania wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów technologii i cyberbezpieczeństwa we wszystkich dziedzinach.
CAP_DAC_OVERRIDE
Oznacza to, że można ominąć sprawdzanie uprawnień do zapisu dla dowolnego pliku, więc można zapisać dowolny plik.
Istnieje wiele plików, które można nadpisać, aby podnieść uprawnienia, możesz czerpać pomysły stąd.
Przykład z użyciem binarnego pliku
W tym przykładzie vim ma tę zdolność, więc można modyfikować dowolny plik, tak jak passwd, sudoers lub shadow:
Przykład z binarnym plikiem 2
W tym przykładzie binarny plik python
będzie miał tę zdolność. Możesz użyć pythona do nadpisania dowolnego pliku:
Przykład z użyciem środowiska + CAP_DAC_READ_SEARCH (przełamanie Docker)
Możesz sprawdzić włączone uprawnienia wewnątrz kontenera Docker za pomocą:
Po pierwsze, przeczytaj poprzednią sekcję, która wykorzystuje uprawnienie DAC_READ_SEARCH do odczytywania dowolnych plików na hoście i skompiluj exploit. Następnie, skompiluj poniższą wersję exploitu shocker, która umożliwi zapisywanie dowolnych plików w systemie plików hosta:
Aby uciec z kontenera Docker, można pobrać pliki /etc/shadow
i /etc/passwd
z hosta, dodać do nich nowego użytkownika i użyć shocker_write
do ich nadpisania. Następnie można uzyskać dostęp za pomocą ssh.
Kod tej techniki został skopiowany z laboratorium "Wykorzystywanie zdolności DAC_OVERRIDE" z https://www.pentesteracademy.com
CAP_CHOWN
Oznacza to, że można zmienić właściciela dowolnego pliku.
Przykład z użyciem binariów
Załóżmy, że binarny plik python
ma tę zdolność, można zmienić właściciela pliku shadow, zmienić hasło roota i podnieść uprawnienia:
Lub z użyciem binarnego pliku ruby
posiadającego tę zdolność:
CAP_FOWNER
Oznacza to, że można zmienić uprawnienia dowolnego pliku.
Przykład z użyciem pliku binarnego
Jeśli Python ma tę zdolność, można zmienić uprawnienia pliku shadow, zmienić hasło roota i podnieść uprawnienia:
CAP_SETUID
Oznacza to, że można ustawić efektywne ID użytkownika utworzonego procesu.
Przykład z użyciem pliku binarnego
Jeśli python ma tę zdolność, można ją łatwo wykorzystać do eskalacji uprawnień do konta root:
Inny sposób:
CAP_SETGID
To oznacza, że można ustawić efektywne ID grupy utworzonego procesu.
Istnieje wiele plików, które można nadpisać, aby podnieść uprawnienia, możesz zaczerpnąć pomysły stąd.
Przykład z użyciem pliku binarnego
W tym przypadku powinieneś szukać interesujących plików, które grupa może odczytać, ponieważ możesz podszywać się pod dowolną grupę:
Gdy już znajdziesz plik, który można wykorzystać (poprzez odczyt lub zapis) do eskalacji uprawnień, możesz uzyskać powłokę, podszywając się pod interesującą grupę za pomocą:
W tym przypadku grupa shadow została podrobiona, dzięki czemu można odczytać plik /etc/shadow
:
Jeśli zainstalowano docker, można udawać grupę docker i wykorzystać to do komunikacji z gniazdem docker i eskalacji uprawnień.
CAP_SETFCAP
Oznacza to, że można ustawiać uprawnienia dla plików i procesów
Przykład z użyciem pliku binarnego
Jeśli python ma tę zdolność, można łatwo z niej skorzystać, aby eskalować uprawnienia do roota:
Zauważ, że jeśli ustawisz nową zdolność dla pliku binarnego za pomocą CAP_SETFCAP, stracisz tę zdolność.
Gdy już posiadasz zdolność SETUID, możesz przejść do jej sekcji, aby zobaczyć, jak podnieść uprawnienia.
Przykład z wykorzystaniem środowiska (przełamanie Docker)
Domyślnie zdolność CAP_SETFCAP jest przyznawana procesowi wewnątrz kontenera w Dockerze. Możesz to sprawdzić wykonując coś takiego:
Ta zdolność pozwala przydzielić dowolną inną zdolność binarnym plikom wykonywalnym, więc możemy rozważyć ucieczkę z kontenera, wykorzystując jedno z innych naruszeń zdolności wymienionych na tej stronie. Jednak jeśli spróbujesz na przykład przydzielić zdolności CAP_SYS_ADMIN i CAP_SYS_PTRACE do pliku wykonywalnego gdb, zauważysz, że możesz je przydzielić, ale plik nie będzie w stanie się wykonać po tym:
Z dokumentacji: Dozwolone: Jest to ograniczający nadzbiór dla efektywnych uprawnień, które wątek może przyjąć. Jest to również ograniczający nadzbiór dla uprawnień, które mogą być dodane do zestawu dziedzicznego przez wątek, który nie ma uprawnienia CAP_SETPCAP w swoim zestawie efektywnym. Wygląda na to, że uprawnienia Dozwolone ograniczają te, które mogą być używane. Jednak Docker domyślnie udziela również uprawnienia CAP_SETPCAP, więc być może będziesz w stanie ustawić nowe uprawnienia wewnątrz zestawu dziedzicznego. Jednak w dokumentacji tego uprawnienia: CAP_SETPCAP: […] dodaje dowolne uprawnienie z zestawu ograniczającego wątku wywołującego do jego zestawu dziedzicznego. Wygląda na to, że możemy dodawać do zestawu dziedzicznego tylko uprawnienia z zestawu ograniczającego. Oznacza to, że nie możemy umieścić nowych uprawnień, takich jak CAP_SYS_ADMIN lub CAP_SYS_PTRACE, w zestawie dziedzicznym w celu eskalacji uprawnień.
CAP_SYS_RAWIO
CAP_SYS_RAWIO zapewnia wiele wrażliwych operacji, w tym dostęp do /dev/mem
, /dev/kmem
lub /proc/kcore
, modyfikację mmap_min_addr
, dostęp do wywołań systemowych ioperm(2)
i iopl(2)
, oraz różne polecenia dyskowe. Poprzez to uprawnienie jest również włączane FIBMAP ioctl(2)
, co w przeszłości powodowało problemy (link). Zgodnie z dokumentacją, uprawnienie to pozwala również na wykonywanie opisowych operacji specyficznych dla urządzeń na innych urządzeniach.
Może to być przydatne do eskalacji uprawnień i wydostania się z Dockera.
CAP_KILL
Oznacza to, że można zabić dowolny proces.
Przykład z użyciem binariów
Załóżmy, że binarny plik python
ma to uprawnienie. Jeśli moglibyśmy również zmodyfikować pewną konfigurację usługi lub gniazda (lub dowolny plik konfiguracyjny związany z usługą), moglibyśmy tam umieścić pułapkę, a następnie zabić proces związany z tą usługą i poczekać, aż nowy plik konfiguracyjny zostanie wykonany z naszą pułapką.
Przywileje związane z kill
Jeśli masz uprawnienia do kill i uruchomiony jest program node jako root (lub jako inny użytkownik), prawdopodobnie możesz wysłać mu sygnał SIGUSR1, co spowoduje otwarcie debugera node, do którego będziesz mógł się podłączyć.
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Mając na celu promowanie wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów technologii i cyberbezpieczeństwa we wszystkich dziedzinach.
CAP_NET_BIND_SERVICE
Oznacza to, że możliwe jest nasłuchiwanie na dowolnym porcie (nawet na uprzywilejowanych). Nie można bezpośrednio podnieść uprawnień za pomocą tej zdolności.
Przykład z użyciem binariów
Jeśli python
ma tę zdolność, będzie mógł nasłuchiwać na dowolnym porcie i nawet łączyć się z dowolnym innym portem (niektóre usługi wymagają połączeń z określonych portów o uprzywilejowanych uprawnieniach)
CAP_NET_RAW
CAP_NET_RAW umożliwia procesom tworzenie gniazd RAW i PACKET, umożliwiając generowanie i wysyłanie dowolnych pakietów sieciowych. Może to prowadzić do ryzyka bezpieczeństwa w środowiskach kontenerowych, takich jak podszywanie się pod pakiety, wstrzykiwanie ruchu i omijanie kontroli dostępu do sieci. Złośliwi aktorzy mogą wykorzystać to do zakłócenia routingu kontenera lub naruszenia bezpieczeństwa sieci hosta, zwłaszcza bez odpowiedniej ochrony zapory sieciowej. Dodatkowo, CAP_NET_RAW jest niezbędne dla uprzywilejowanych kontenerów w celu obsługi operacji takich jak ping za pomocą żądań ICMP RAW.
Oznacza to, że możliwe jest podsłuchiwanie ruchu. Nie można bezpośrednio eskalować uprawnień za pomocą tej zdolności.
Przykład z użyciem binariów
Jeśli binarny plik tcpdump
ma tę zdolność, będzie można go użyć do przechwytywania informacji sieciowych.
Zauważ, że jeśli środowisko udostępnia tę zdolność, można również użyć tcpdump
do podsłuchiwania ruchu.
Przykład z binarnym 2
Poniższy przykład to kod python2
, który może być przydatny do przechwytywania ruchu interfejsu "lo" (localhost). Kod pochodzi z laboratorium "Podstawy: CAP-NET_BIND + NET_RAW" z https://attackdefense.pentesteracademy.com/
CAP_NET_ADMIN + CAP_NET_RAW
CAP_NET_ADMIN umożliwia posiadaczowi zmianę konfiguracji sieciowej, w tym ustawienia zapory sieciowej, tabele routingu, uprawnienia gniazd i ustawienia interfejsu sieciowego w ramach dostępnych przestrzeni nazw sieciowych. Umożliwia również włączanie trybu promiskuitywnego na interfejsach sieciowych, co pozwala na podsłuchiwanie pakietów między przestrzeniami nazw.
Przykład z użyciem pliku binarnego
Załóżmy, że plik binarny python ma te uprawnienia.
CAP_LINUX_IMMUTABLE
Oznacza to, że można modyfikować atrybuty inode. Nie można bezpośrednio eskalować uprawnień za pomocą tej zdolności.
Przykład z użyciem pliku binarnego
Jeśli odkryjesz, że plik jest niezmienny, a python ma tę zdolność, możesz usunąć atrybut niezmienności i umożliwić modyfikację pliku:
Należy zauważyć, że zazwyczaj atrybut niezmienności jest ustawiany i usuwany za pomocą:
CAP_SYS_CHROOT
CAP_SYS_CHROOT umożliwia wykonanie wywołania systemowego chroot(2)
, co potencjalnie może umożliwić ucieczkę z środowisk chroot(2)
za pomocą znanych podatności:
CAP_SYS_BOOT
CAP_SYS_BOOT nie tylko umożliwia wykonanie wywołania systemowego reboot(2)
dla restartu systemu, w tym konkretnych poleceń takich jak LINUX_REBOOT_CMD_RESTART2
dostosowanych do określonych platform sprzętowych, ale także umożliwia użycie kexec_load(2)
i od wersji Linux 3.17 kexec_file_load(2)
do ładowania nowych lub podpisanych jąder awaryjnych odpowiednio.
CAP_SYSLOG
CAP_SYSLOG został oddzielony od szerszego CAP_SYS_ADMIN w Linuxie 2.6.37, specjalnie umożliwiając użycie wywołania syslog(2)
. Ta zdolność umożliwia wyświetlanie adresów jądra za pośrednictwem /proc
i podobnych interfejsów, gdy ustawienie kptr_restrict
wynosi 1, co kontroluje eksponowanie adresów jądra. Od wersji Linux 2.6.39 domyślnie dla kptr_restrict
jest wartość 0, co oznacza, że adresy jądra są eksponowane, chociaż wiele dystrybucji ustawia to na 1 (ukrywa adresy z wyjątkiem uid 0) lub 2 (zawsze ukrywa adresy) ze względów bezpieczeństwa.
Dodatkowo, CAP_SYSLOG umożliwia dostęp do wyjścia dmesg
, gdy dmesg_restrict
jest ustawione na 1. Pomimo tych zmian, CAP_SYS_ADMIN nadal zachowuje zdolność do wykonywania operacji syslog
ze względu na historyczne precedensy.
CAP_MKNOD
CAP_MKNOD rozszerza funkcjonalność wywołania systemowego mknod
poza tworzenie zwykłych plików, FIFO (nazwane potoki) lub gniazd domen UNIX. W szczególności umożliwia tworzenie plików specjalnych, które obejmują:
S_IFCHR: Pliki specjalne znakowe, które są urządzeniami takimi jak terminale.
S_IFBLK: Pliki specjalne blokowe, które są urządzeniami takimi jak dyski.
Ta zdolność jest niezbędna dla procesów, które wymagają możliwości tworzenia plików urządzeń, ułatwiając bezpośrednią interakcję z sprzętem za pośrednictwem urządzeń znakowych lub blokowych.
Jest to domyślna zdolność dla kontenerów Docker (https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19).
Ta zdolność umożliwia eskalację uprawnień (poprzez odczyt pełnego dysku) na hoście, w następujących warunkach:
Mieć początkowy dostęp do hosta (bez uprawnień).
Mieć początkowy dostęp do kontenera (Uprawniony (EUID 0) i efektywna zdolność
CAP_MKNOD
).Host i kontener powinny dzielić tę samą przestrzeń nazw użytkownika.
Kroki do utworzenia i dostępu do urządzenia blokowego w kontenerze:
Na hoście jako standardowy użytkownik:
Określ swoje bieżące ID użytkownika za pomocą
id
, np.uid=1000(standardowyuzytkownik)
.Zidentyfikuj docelowe urządzenie, na przykład
/dev/sdb
.
Wewnątrz kontenera jako
root
:
Z powrotem na hoście:
To podejście umożliwia standardowemu użytkownikowi dostęp i potencjalne odczytywanie danych z /dev/sdb
poprzez kontener, wykorzystując wspólne przestrzenie nazw użytkownika i uprawnienia ustawione na urządzeniu.
CAP_SETPCAP
CAP_SETPCAP umożliwia procesowi zmianę zestawów uprawnień innego procesu, umożliwiając dodawanie lub usuwanie uprawnień z zestawów efektywnych, dziedzicznych i dozwolonych. Jednak proces może modyfikować tylko uprawnienia, które posiada w swoim zestawie dozwolonych, co zapewnia, że nie może podnieść uprawnień innego procesu ponad swoje własne. Ostatnie aktualizacje jądra wprowadziły bardziej restrykcyjne zasady, ograniczając CAP_SETPCAP
do jedynie zmniejszania uprawnień w swoim własnym lub w zestawach dozwolonych swoich potomków, mając na celu zmniejszenie ryzyka związanego z bezpieczeństwem. Aby korzystać z niego, należy mieć CAP_SETPCAP
w zestawie efektywnym i docelowe uprawnienia w zestawie dozwolonym, korzystając z capset()
do modyfikacji. To podsumowuje podstawową funkcję i ograniczenia CAP_SETPCAP
, podkreślając jego rolę w zarządzaniu uprawnieniami i poprawie bezpieczeństwa.
CAP_SETPCAP
to zdolność systemu Linux, która umożliwia procesowi modyfikowanie zestawów uprawnień innego procesu. Pozwala na dodawanie lub usuwanie uprawnień z zestawów efektywnych, dziedzicznych i dozwolonych innych procesów. Jednak istnieją pewne ograniczenia dotyczące korzystania z tej zdolności.
Proces posiadający CAP_SETPCAP
może jedynie przyznawać lub usuwać uprawnienia, które znajdują się w jego własnym zestawie dozwolonych uprawnień. Innymi słowy, proces nie może przyznać uprawnienia innemu procesowi, jeśli sam nie posiada tego uprawnienia. Ograniczenie to uniemożliwia procesowi podniesienie uprawnień innego procesu ponad swój własny poziom uprawnień.
Ponadto, w najnowszych wersjach jądra, zdolność CAP_SETPCAP
została dodatkowo ograniczona. Nie pozwala już procesowi dowolnie modyfikować zestawów uprawnień innych procesów. Zamiast tego, pozwala jedynie procesowi obniżyć uprawnienia w swoim własnym zestawie dozwolonych uprawnień lub zestawie dozwolonych uprawnień swoich potomków. Ta zmiana została wprowadzona w celu zmniejszenia potencjalnych ryzyk związanych z uprawnieniami.
Aby efektywnie korzystać z CAP_SETPCAP
, musisz mieć zdolność w swoim zestawie efektywnym i docelowe uprawnienia w swoim zestawie dozwolonym. Następnie możesz użyć wywołania systemowego capset()
do modyfikowania zestawów uprawnień innych procesów.
Podsumowując, CAP_SETPCAP
umożliwia procesowi modyfikowanie zestawów uprawnień innych procesów, ale nie może przyznawać uprawnień, których sam nie posiada. Ponadto, ze względów bezpieczeństwa, jego funkcjonalność została ograniczona w najnowszych wersjach jądra, pozwalając jedynie na zmniejszanie uprawnień w swoim własnym zestawie dozwolonych uprawnień lub zestawach dozwolonych uprawnień swoich potomków.
Odwołania
Większość tych przykładów została zaczerpnięta z niektórych laboratoriów https://attackdefense.pentesteracademy.com/, więc jeśli chcesz ćwiczyć techniki podwyższania uprawnień, polecam te laboratoria.
Inne odwołania:
RootedCON to najważniejsze wydarzenie związane z cyberbezpieczeństwem w Hiszpanii i jedno z najważniejszych w Europie. Mając na celu promowanie wiedzy technicznej, ten kongres jest gorącym punktem spotkań dla profesjonalistów technologii i cyberbezpieczeństwa we wszystkich dziedzinach.
Last updated