GCP - AppEngine Privesc

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

Розгорнути додаток App Engine ```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

Можна вказати Service Account для використання, але за замовчуванням використовується App Engine default SA.

The URL of the application is something like https://<proj-name>.oa.r.appspot.com/ or https://<service_name>-dot-<proj-name>.oa.r.appspot.com

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

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

Оновити існуючий додаток 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=@$PROJECT_ID.iam.gserviceaccount.com

</details>

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

<details>
<summary>Оновити сервісний обліковий запис App Engine</summary>
```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 (не standard). Деякі з list і get дозволів можуть бути насправді не потрібні.

SSH в інстанс App Engine ```bash gcloud app instances ssh --service --version ```

appengine.applications.update, appengine.operations.get

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

Оновити сервісний обліковий запис додатку ```bash gcloud app update --service-account= ```

appengine.versions.getFileContents, appengine.versions.update

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

Write Access over the buckets

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

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

Для додаткової інформації та PoC перевірте відповідні відомості на цій сторінці:

GCP - Storage Privesc

Write Access over the Artifact Registry

Хоч App Engine створює docker images всередині Artifact Registry. Було перевірено, що навіть якщо ви зміните образ у цьому сервісі і видалите інстанс App Engine (тому розгортається новий), виконуваний код не змінюється.
Можливо, що шляхом виконання Race Condition attack, як у випадку з бакетами, можна перезаписати виконуваний код, але це не було протестовано.

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