GCP - Storage Privesc
Storage
Podstawowe informacje:
pageGCP - Storage Enumstorage.objects.get
storage.objects.get
To uprawnienie umożliwia pobieranie plików przechowywanych w Cloud Storage. Może to potencjalnie umożliwić eskalację uprawnień, ponieważ w niektórych przypadkach wrażliwe informacje są tam przechowywane. Ponadto, niektóre usługi GCP przechowują swoje informacje w kubełkach:
GCP Composer: Podczas tworzenia środowiska Composer kod wszystkich DAG-ów zostanie zapisany w kubełku. Te zadania mogą zawierać interesujące informacje w swoim kodzie.
GCR (Container Registry): Obrazy kontenerów są przechowywane w kubełkach, co oznacza, że jeśli możesz odczytać kubełki, będziesz mógł pobrać obrazy i szukać wycieków i/lub kodu źródłowego.
storage.objects.setIamPolicy
storage.objects.setIamPolicy
Możesz nadać sobie uprawnienia do wykorzystania dowolnego z wcześniejszych scenariuszy z tej sekcji.
storage.buckets.setIamPolicy
storage.buckets.setIamPolicy
Przykład modyfikacji uprawnień za pomocą tego uprawnienia znajdziesz na tej stronie:
pageGCP - Public Buckets Privilege Escalationstorage.hmacKeys.create
storage.hmacKeys.create
Funkcja "interoperacyjności" Cloud Storage, przeznaczona do międzychmurowych interakcji, takich jak z AWS S3, obejmuje tworzenie kluczy HMAC dla kont usług i użytkowników. Atakujący może wykorzystać to, generując klucz HMAC dla konta usługi z podwyższonymi uprawnieniami, co umożliwia eskalację uprawnień w Cloud Storage. Podczas gdy klucze HMAC powiązane z użytkownikiem można uzyskać tylko za pomocą konsoli internetowej, zarówno klucze dostępu, jak i tajne pozostają trwale dostępne, umożliwiając potencjalne tworzenie kopii zapasowych dostępu do przechowywania. Z kolei klucze HMAC powiązane z kontem usługi są dostępne za pośrednictwem interfejsu API, ale ich klucze dostępu i tajne nie są dostępne po utworzeniu, co dodaje warstwę złożoności dla ciągłego dostępu.
Inny skrypt wykorzystujący tę metodę można znaleźć tutaj.
storage.objects.create
, storage.objects.delete
= Uprawnienia do zapisu w Storage
storage.objects.create
, storage.objects.delete
= Uprawnienia do zapisu w StorageAby utworzyć nowy obiekt wewnątrz kubełka, potrzebujesz uprawnienia storage.objects.create
i, zgodnie z dokumentacją, potrzebujesz również uprawnienia storage.objects.delete
, aby zmodyfikować istniejący obiekt.
Bardzo częstym wykorzystaniem kubełków, w których można zapisywać w chmurze, jest przypadek, gdy kubełek zapisuje pliki serwera sieciowego, możesz być w stanie przechowywać nowy kod, który będzie używany przez aplikację internetową.
Composer
Composer to Apache Airflow zarządzany w GCP. Ma kilka interesujących funkcji:
Działa wewnątrz klastra GKE, więc SA używane przez klaster jest dostępne dla kodu działającego wewnątrz Composera.
Przechowuje kod w kubełku, dlatego każdy z uprawnieniami do zapisu w tym kubełku będzie mógł zmienić/dodać kod DGA (kod, który Apache Airflow będzie wykonywał). Jeśli masz uprawnienia do zapisu w kubełku, którego używa Composer do przechowywania kodu, możesz przywilejować się do SA działającego w klastrze GKE.
Cloud Functions
Kod Cloud Functions jest przechowywany w Storage, więc nadpisując go, można wykonać dowolny kod.
App Engine
Kod źródłowy App Engine jest przechowywany w kubełkach, nadpisując kod, można wykonać dowolny kod. TO NIE JEST MOŻLIWE
Wygląda na to, że warstwy kontenerów są przechowywane w kubełku, może zmieniając je?
GCR
Google Container Registry przechowuje obrazy wewnątrz kubełków, jeśli masz uprawnienia do zapisu w tych kubełkach, możesz być w stanie przejść lateralnie do miejsca, gdzie te kubełki są uruchamiane.
Kubełek używany przez GCR będzie miał adres URL podobny do
gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com
(Najwyższe subdomeny są określone tutaj).
Referencje
Last updated