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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
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
Розгорнути додаток 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 lsDownload 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=
</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 --serviceappengine.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 перевірте відповідні відомості на цій сторінці:
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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
HackTricks Cloud

