GCP - AppEngine 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

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

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

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

note

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

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

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

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

bash
# 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, за допомогою:

bash
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 можуть бути не дійсно потрібні.

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

appengine.applications.update, appengine.operations.get

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

bash
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 (щоб був розгорнутий новий), виконуваний код не змінюється.
Можливо, що виконуючи атаку на умови гонки, як з бакетами, може бути можливим перезаписати виконуваний код, але це не було протестовано.

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