GCP - AppEngine Privesc

Support HackTricks

App Engine

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

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 перевірте відповідну інформацію з цієї сторінки:

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

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

Support HackTricks

Last updated