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๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ get ๋ฐ list ๊ถŒํ•œ์€ ์ œ์™ธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ ์ฝ”๋“œ ์˜ˆ์ œ๋Š” https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฑ ์„œ๋น„์Šค์˜ ์ด๋ฆ„์€ **default**๊ฐ€ ๋˜๋ฉฐ, ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ธ์Šคํ„ด์Šค๋Š” 1๊ฐœ๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ์•ฑ์„ ๋งŒ๋“ค๋ ค๋ฉด **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

์ด๊ฒƒ์€ ๊ตฌ๊ธ€์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค ๊ณ„์ •์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์•…์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๊ณ„์ •์„ ํ›”์น  ์ˆ˜๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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๋Š” ์ด ํŽ˜์ด์ง€์˜ ๊ด€๋ จ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜์„ธ์š”:

์•„ํ‹ฐํŒฉํŠธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ๊ถŒํ•œ

App Engine์ด ์•„ํ‹ฐํŒฉํŠธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋‚ด์—์„œ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋”๋ผ๋„, ์ด ์„œ๋น„์Šค ๋‚ด์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  App Engine ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ฑฐํ•ด๋„ (์ƒˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐฐํฌ๋จ) ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒ„ํ‚ท๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฒฝ์Ÿ ์กฐ๊ฑด ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์‹คํ–‰๋œ ์ฝ”๋“œ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ง€๋งŒ, ์ด๋Š” ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

HackTricks ์ง€์›ํ•˜๊ธฐ

Last updated