AuthZ& AuthN - Docker Access Authorization Plugin
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Model autoryzacji Docker jest wszystko albo nic. Każdy użytkownik z uprawnieniami do uzyskania dostępu do demona Docker może wykonać dowolne polecenie klienta Docker. To samo dotyczy wywołań korzystających z API silnika Docker do kontaktu z demonem. Jeśli potrzebujesz większej kontroli dostępu, możesz stworzyć wtyczki autoryzacji i dodać je do konfiguracji demona Docker. Korzystając z wtyczki autoryzacji, administrator Docker może konfigurować szczegółowe polityki dostępu do zarządzania dostępem do demona Docker.
Wtyczki autoryzacji Docker to zewnętrzne wtyczki, które możesz wykorzystać do zezwalania/odmawiania działań żądanych do demona Docker w zależności od użytkownika, który je żąda, oraz żądanej akcji.
Poniższe informacje pochodzą z dokumentacji
Gdy żądanie HTTP jest wysyłane do demona Docker przez CLI lub za pośrednictwem API silnika, podsystem uwierzytelniania przekazuje żądanie do zainstalowanej wtyczki uwierzytelniania. Żądanie zawiera użytkownika (wywołującego) i kontekst polecenia. Wtyczka jest odpowiedzialna za podjęcie decyzji, czy zezwolić czy odmówić żądanie.
Poniższe diagramy sekwencyjne przedstawiają przepływ autoryzacji zezwalającej i odmawiającej:
Każde żądanie wysyłane do wtyczki zawiera uwierzytelnionego użytkownika, nagłówki HTTP oraz ciało żądania/odpowiedzi. Tylko nazwa użytkownika i metoda uwierzytelniania są przekazywane do wtyczki. Co najważniejsze, żadne dane uwierzytelniające użytkownika ani tokeny nie są przekazywane. Na koniec, nie wszystkie ciała żądań/odpowiedzi są wysyłane do wtyczki autoryzacji. Tylko te ciała żądań/odpowiedzi, w których Content-Type
to text/*
lub application/json
, są wysyłane.
Dla poleceń, które mogą potencjalnie przejąć połączenie HTTP (HTTP Upgrade
), takich jak exec
, wtyczka autoryzacji jest wywoływana tylko dla początkowych żądań HTTP. Gdy wtyczka zatwierdzi polecenie, autoryzacja nie jest stosowana do reszty przepływu. W szczególności, dane strumieniowe nie są przekazywane do wtyczek autoryzacji. Dla poleceń, które zwracają odpowiedzi HTTP w kawałkach, takich jak logs
i events
, tylko żądanie HTTP jest wysyłane do wtyczek autoryzacji.
Podczas przetwarzania żądań/odpowiedzi, niektóre przepływy autoryzacji mogą wymagać dodatkowych zapytań do demona Docker. Aby zakończyć takie przepływy, wtyczki mogą wywoływać API demona podobnie jak zwykły użytkownik. Aby umożliwić te dodatkowe zapytania, wtyczka musi zapewnić środki dla administratora do skonfigurowania odpowiednich polityk uwierzytelniania i bezpieczeństwa.
Jesteś odpowiedzialny za rejestrowanie swojej wtyczki jako część uruchamiania demona Docker. Możesz zainstalować wiele wtyczek i połączyć je w łańcuch. Ten łańcuch może być uporządkowany. Każde żądanie do demona przechodzi w kolejności przez łańcuch. Tylko gdy wszystkie wtyczki przyznają dostęp do zasobu, dostęp jest przyznawany.
Wtyczka authz pozwala na stworzenie prostego pliku JSON, który wtyczka będzie odczytywać, aby autoryzować żądania. Dzięki temu masz możliwość bardzo łatwego kontrolowania, które punkty końcowe API mogą osiągnąć każdego użytkownika.
To jest przykład, który pozwoli Alicji i Bobowi na tworzenie nowych kontenerów: {"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}
Na stronie route_parser.go możesz znaleźć relację między żądanym URL a akcją. Na stronie types.go możesz znaleźć relację między nazwą akcji a akcją.
Możesz znaleźć łatwą do zrozumienia wtyczkę z szczegółowymi informacjami na temat instalacji i debugowania tutaj: https://github.com/carlospolop-forks/authobot
Przeczytaj README
i kod plugin.go
, aby zrozumieć, jak to działa.
Główne rzeczy do sprawdzenia to które punkty końcowe są dozwolone i które wartości HostConfig są dozwolone.
Aby przeprowadzić tę enumerację, możesz użyć narzędzia https://github.com/carlospolop/docker_auth_profiler.
run --privileged
W tym przypadku administrator systemu zabronił użytkownikom montowania wolumenów i uruchamiania kontenerów z flagą --privileged
lub nadawania jakichkolwiek dodatkowych uprawnień kontenerowi:
Jednak użytkownik może utworzyć powłokę wewnątrz działającego kontenera i nadać jej dodatkowe uprawnienia:
Teraz użytkownik może uciec z kontenera, używając dowolnej z wcześniej omówionych technik i eskalować uprawnienia wewnątrz hosta.
W tym przypadku administrator systemu zabronił użytkownikom uruchamiania kontenerów z flagą --privileged
lub nadawania jakiejkolwiek dodatkowej zdolności kontenerowi, a jedynie zezwolił na montowanie folderu /tmp
:
Zauważ, że być może nie możesz zamontować folderu /tmp
, ale możesz zamontować inny zapisywalny folder. Możesz znaleźć zapisywalne katalogi używając: find / -writable -type d 2>/dev/null
Zauważ, że nie wszystkie katalogi w maszynie linuxowej będą wspierać bit suid! Aby sprawdzić, które katalogi wspierają bit suid, uruchom mount | grep -v "nosuid"
Na przykład zazwyczaj /dev/shm
, /run
, /proc
, /sys/fs/cgroup
i /var/lib/lxcfs
nie wspierają bitu suid.
Zauważ również, że jeśli możesz zamontować /etc
lub jakikolwiek inny folder zawierający pliki konfiguracyjne, możesz je zmienić z kontenera docker jako root, aby wykorzystać je w hoście i eskalować uprawnienia (może modyfikując /etc/shadow
)
Odpowiedzialnością sysadmina konfigurowania tej wtyczki byłoby kontrolowanie, które akcje i z jakimi uprawnieniami każdy użytkownik może wykonywać. Dlatego, jeśli administrator przyjmie podejście czarnej listy z punktami końcowymi i atrybutami, może zapomnieć o niektórych z nich, co mogłoby pozwolić atakującemu na eskalację uprawnień.
Możesz sprawdzić API dockera w https://docs.docker.com/engine/api/v1.40/#
Możliwe, że gdy sysadmin konfigurował zaporę docker, zapomniał o niektórym ważnym parametrze API takim jak "Binds". W poniższym przykładzie możliwe jest wykorzystanie tej błędnej konfiguracji do stworzenia i uruchomienia kontenera, który montuje folder root (/) hosta:
Zauważ, że w tym przykładzie używamy parametru Binds
jako klucza na poziomie root w JSON, ale w API pojawia się pod kluczem HostConfig
Postępuj zgodnie z tymi samymi instrukcjami jak w przypadku Binds w root, wykonując to żądanie do API Dockera:
Postępuj zgodnie z tymi samymi instrukcjami co w przypadku Binds in root, wykonując to żądanie do API Dockera:
Postępuj zgodnie z tymi samymi instrukcjami co w Binds in root, wykonując to żądanie do API Dockera:
Możliwe, że gdy administrator systemu skonfigurował zaporę docker, zapomniał o niektórym ważnym atrybucie parametru API takim jak "Capabilities" wewnątrz "HostConfig". W poniższym przykładzie można wykorzystać tę błędną konfigurację do stworzenia i uruchomienia kontenera z uprawnieniem SYS_MODULE:
HostConfig
jest kluczem, który zazwyczaj zawiera interesujące uprawnienia do ucieczki z kontenera. Jednak, jak wcześniej omówiliśmy, zauważ, że użycie Binds poza nim również działa i może pozwolić na obejście ograniczeń.
Jeśli sysadmin zapomniał zabronić możliwości wyłączenia wtyczki, możesz to wykorzystać, aby całkowicie ją wyłączyć!
Pamiętaj, aby ponownie włączyć wtyczkę po eskalacji, inaczej ponowne uruchomienie usługi docker nie zadziała!
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)