GCP - AppEngine Privesc

Support HackTricks

App Engine

Для отримання додаткової інформації про App Engine перегляньте:

GCP - App Engine Enum

appengine.applications.get, appengine.instances.get, appengine.instances.list, appengine.operations.get, appengine.operations.list, appengine.services.get, appengine.services.list, appengine.versions.create, appengine.versions.get, appengine.versions.list, cloudbuild.builds.get,iam.serviceAccounts.actAs, resourcemanager.projects.get, storage.objects.create, storage.objects.list

Це необхідні дозволи для розгортання додатку за допомогою gcloud cli. Можливо, get та list можна уникнути.

Ви можете знайти приклади коду на python за адресою https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine

За замовчуванням ім'я служби App буде default, і може бути лише 1 екземпляр з таким же ім'ям. Щоб змінити його та створити другий додаток, у app.yaml змініть значення кореневого ключа на щось на кшталт service: my-second-app

cd python-docs-samples/appengine/flexible/hello_world
gcloud app deploy #Upload and start application inside the folder

Дайте цьому принаймні 10-15 хвилин, якщо це не спрацює, зателефонуйте deploy another of times і почекайте кілька хвилин.

Можна вказати обліковий запис служби для використання, але за замовчуванням використовується стандартний SA App Engine.

URL програми виглядає приблизно так: https://<proj-name>.oa.r.appspot.com/ або https://<service_name>-dot-<proj-name>.oa.r.appspot.com

Оновлення еквівалентних дозволів

У вас можуть бути достатні дозволи для оновлення AppEngine, але не для створення нового. У такому випадку ось як ви можете оновити поточний App Engine:

# Find the code of the App Engine in the buckets
gsutil ls

# Download code
mkdir /tmp/appengine2
cd /tmp/appengine2
## In this case it was found in this custom bucket but you could also use the
## buckets generated when the App Engine is created
gsutil cp gs://appengine-lab-1-gcp-labs-4t04m0i6-3a97003354979ef6/labs_appengine_1_premissions_privesc.zip .
unzip labs_appengine_1_premissions_privesc.zip

## Now modify the code..

## If you don't have an app.yaml, create one like:
cat >> app.yaml <<EOF
runtime: python312

entrypoint: gunicorn -b :\$PORT main:app

env_variables:
A_VARIABLE: "value"
EOF

# Deploy the changes
gcloud app deploy

# Update the SA if you need it (and if you have actas permissions)
gcloud app update --service-account=<sa>@$PROJECT_ID.iam.gserviceaccount.com

Якщо ви вже скомпрометували AppEngine і у вас є дозвіл appengine.applications.update та actAs над обліковим записом служби, ви можете змінити обліковий запис служби, що використовується AppEngine, за допомогою:

gcloud app update --service-account=<sa>@$PROJECT_ID.iam.gserviceaccount.com

appengine.instances.enableDebug, appengine.instances.get, appengine.instances.list, appengine.operations.get, appengine.services.get, appengine.services.list, appengine.versions.get, appengine.versions.list, compute.projects.get

З цими дозволами можливо увійти через ssh в екземпляри App Engine типу flexible (не стандартний). Деякі з дозволів list і get можуть бути насправді непотрібні.

gcloud app instances ssh --service <app-name> --version <version-id> <ID>

appengine.applications.update, appengine.operations.get

Я думаю, що це просто змінює фоновий SA, який Google буде використовувати для налаштування додатків, тому я не думаю, що ви можете зловживати цим, щоб вкрасти обліковий запис служби.

gcloud app update --service-account=<sa_email>

appengine.versions.getFileContents, appengine.versions.update

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

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

Як вже згадувалося, версії appengine генерують деякі дані всередині бакету з форматом імені: staging.<project-id>.appspot.com. Зверніть увагу, що неможливо попередньо захопити цей бакет, оскільки користувачі GCP не мають права генерувати бакети, використовуючи доменне ім'я appspot.com.

Однак, з доступом на читання та запис до цього бакету, можливо підвищити привілеї до SA, прикріпленого до версії AppEngine, шляхом моніторингу бакету і в будь-який час, коли виконується зміна, якомога швидше змінити код. Таким чином, контейнер, який створюється з цього коду, виконає зламаний код.

Для отримання додаткової інформації та PoC перевірте відповідну інформацію з цієї сторінки:

GCP - Storage Privesc

Доступ на запис до Реєстру артефактів

Навіть якщо App Engine створює образи docker всередині Реєстру артефактів. Було протестовано, що навіть якщо ви зміните образ всередині цього сервісу і видалите екземпляр App Engine (щоб був розгорнутий новий), виконуваний код не змінюється. Можливо, що виконання атаки з умовою гонки, як з бакетами, може дозволити перезаписати виконуваний код, але це не було протестовано.

Support HackTricks

Last updated