GCP - AppEngine Privesc

学习和练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) 学习和练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

支持 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 部署 App 所需的权限。也许可以避免使用 getlist 权限。

你可以在 https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine 找到 Python 代码示例。

默认情况下,App 服务的名称将是 default,并且同名的实例只能有一个。 要更改它并创建第二个 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并等待几分钟。

可以指定要使用的Service Account,但默认情况下使用App Engine默认的SA。

应用程序的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 [SERVICE_ACCOUNT]
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 登录 类型为 flexible(非 standard)的 App Engine 实例。一些 listget 权限 可能并不真正需要

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

appengine.applications.update, appengine.operations.get

我认为这只是更改 Google 用于设置应用程序的后台 SA,因此我认为你不能滥用它来窃取服务账户。

gcloud app update --service-account=<sa_email>

appengine.versions.getFileContents, appengine.versions.update

不确定如何使用这些权限或它们是否有用(请注意,当您更改代码时会创建一个新版本,所以我不知道您是否可以仅更新代码或其中一个的IAM角色,但我猜您应该可以,也许更改存储桶内的代码?)。

对存储桶的写访问权限

即使对存储源代码所在的存储桶具有写访问权限,通过修改源代码和manifest.json执行任意代码也是不可行的。 也许如果您监控存储桶并检测到创建新版本并上传源代码和清单的时刻,可能可以更改它们以便新版本使用后门代码?

看起来容器层也存储在存储桶中,也许可以更改这些?

学习和练习AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) 学习和练习GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

Last updated