GCP - AppEngine Privesc

Support HackTricks

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

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

默认情况下,应用服务的名称将为 default,并且同名的实例只能有一个。 要更改并创建第二个应用,请在 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.updateactAs 以使用服务帐户,您可以通过以下方式修改 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

拥有这些权限,可以在类型为flexible(非标准)的App Engine实例中通过ssh登录。一些**listget权限可能并不真正需要**。

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

appengine.applications.update, appengine.operations.get

我认为这只是更改 Google 用于设置应用程序的背景服务账户,因此我认为你无法利用这一点来窃取服务账户。

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

appengine.versions.getFileContents, appengine.versions.update

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

对存储桶的写入访问权限

如前所述,appengine版本在格式为staging.<project-id>.appspot.com的存储桶内生成一些数据。请注意,由于GCP用户没有权限使用域名appspot.com生成存储桶,因此无法预先接管此存储桶。

然而,通过对该存储桶的读写访问权限,可以通过监控存储桶并在每次进行更改时尽快修改代码,从而提升与AppEngine版本关联的SA的权限。这样,从此代码创建的容器将执行后门代码

有关更多信息和PoC,请查看此页面的相关信息

对Artifact Registry的写入访问权限

尽管App Engine在Artifact Registry中创建docker镜像。经过测试,即使您在此服务中修改镜像并删除App Engine实例(以便部署一个新的实例),执行的代码也不会改变。 可能通过执行与存储桶类似的竞争条件攻击,可能会覆盖执行的代码,但这尚未测试。

支持HackTricks

Last updated