GCP - AppEngine Privesc

Support 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を使用してアプリをデプロイするために必要な権限です。おそらくgetlistの権限は回避**できるかもしれません。

Pythonのコード例はhttps://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengineで見つけることができます。

デフォルトでは、アプリサービスの名前は**defaultになり、同じ名前のインスタンスは1つだけ存在できます。 これを変更して2つ目のアプリを作成するには、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分待って、うまくいかない場合は別のデプロイを呼び出して、数分待ってください。

使用するサービスアカウントを指定することは可能ですが、デフォルトでは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=<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でログインすることが可能です(標準ではありません)。一部の**listおよびget権限は本当に必要ないかもしれません**。

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ロールを単に更新できるかどうかは不明ですが、バケット内のコードを変更することでできるはずだと思います)。

バケットに対する書き込みアクセス

前述のように、appengineのバージョンは、staging.<project-id>.appspot.comという形式のバケット内にデータを生成します。このバケットを事前に取得することはできません。なぜなら、GCPユーザーはappspot.comというドメイン名を使用してバケットを生成する権限がないからです。

しかし、このバケットに対する読み取りおよび書き込みアクセスがあれば、バケットを監視し、変更が行われるたびにできるだけ早くコードを修正することで、AppEngineバージョンに付随するSAの権限を昇格させることが可能です。この方法で、このコードから作成されるコンテナはバックドア付きのコードを実行します

詳細情報およびPoCについては、このページの関連情報を確認してください

GCP - Storage Privesc

アーティファクトレジストリに対する書き込みアクセス

App Engineはアーティファクトレジストリ内にdockerイメージを作成します。このサービス内でイメージを変更しても、App Engineインスタンスを削除(新しいものがデプロイされる)しても、実行されるコードは変更されません。 バケットと同様にレースコンディション攻撃を行うことで、実行されるコードを上書きできる可能性がありますが、これはテストされていません。

HackTricksをサポートする

Last updated