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