GCP - AppEngine Privesc

Підтримайте 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

Це необхідні дозволи для розгортання App за допомогою gcloud cli. Можливо, дозволи get та list можна уникнути.

Ви можете знайти приклади коду на python за посиланням https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine

За замовчуванням, назва сервісу App буде default, і може бути лише 1 екземпляр з такою ж назвою. Щоб змінити це і створити другий App, у 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 і зачекайте кілька хвилин.

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

Доступ на запис до bucket

Навіть з доступом на запис до bucket, де знаходиться вихідний код, НЕ ВДАЛОСЯ виконати довільний код, змінивши вихідний код і manifest.json. Можливо, якщо ви моніторите bucket і виявите момент, коли створюється нова версія і завантажується вихідний код і manifest, можливо, їх можна змінити, щоб нова версія використовувала ті, що з бекдором??

Також виглядає, що шари контейнерів зберігаються в bucket, можливо, змінюючи їх?

Підтримайте HackTricks

Last updated