GCP - AppEngine Privesc
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
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
权限。
您可以在 https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine 找到 Python 代码示例。
默认情况下,应用服务的名称将为 default
,并且同名的实例只能有一个。
要更改并创建第二个应用,请在 app.yaml
中,将根键的值更改为类似 service: my-second-app
的内容。
给它至少 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:
如果您已经攻陷了 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
拥有这些权限,可以在类型为flexible(非标准)的App Engine实例中通过ssh登录。一些**list
和get
权限可能并不真正需要**。
appengine.applications.update
, appengine.operations.get
appengine.applications.update
, appengine.operations.get
我认为这只是更改 Google 用于设置应用程序的背景服务账户,因此我认为你无法利用这一点来窃取服务账户。
appengine.versions.getFileContents
, appengine.versions.update
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实例(以便部署一个新的实例),执行的代码也不会改变。 可能通过执行与存储桶类似的竞争条件攻击,可能会覆盖执行的代码,但这尚未测试。
Last updated