GCP - AppEngine Privesc
App Engine
有关 App Engine 的更多信息,请查看:
GCP - App Engine Enumappengine.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
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 所需的权限。也许可以避免使用 get
和 list
权限。
你可以在 https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine 找到 Python 代码示例。
默认情况下,App 服务的名称将是 default
,并且同名的实例只能有一个。
要更改它并创建第二个 App,在 app.yaml
中,将根键的值更改为类似 service: my-second-app
的内容。
给它至少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:
如果你已经攻破了一个 AppEngine 并且拥有**appengine.applications.update
权限和actAs**服务账户的权限,你可以通过以下方式修改 AppEngine 使用的服务账户:
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
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 实例。一些 list
和 get
权限 可能并不真正需要。
appengine.applications.update
, appengine.operations.get
appengine.applications.update
, appengine.operations.get
我认为这只是更改 Google 用于设置应用程序的后台 SA,因此我认为你不能滥用它来窃取服务账户。
appengine.versions.getFileContents
, appengine.versions.update
appengine.versions.getFileContents
, appengine.versions.update
不确定如何使用这些权限或它们是否有用(请注意,当您更改代码时会创建一个新版本,所以我不知道您是否可以仅更新代码或其中一个的IAM角色,但我猜您应该可以,也许更改存储桶内的代码?)。
对存储桶的写访问权限
即使对存储源代码所在的存储桶具有写访问权限,通过修改源代码和manifest.json
执行任意代码也是不可行的。
也许如果您监控存储桶并检测到创建新版本并上传源代码和清单的时刻,可能可以更改它们以便新版本使用后门代码?
看起来容器层也存储在存储桶中,也许可以更改这些?
Last updated