GCP - AppEngine Privesc
Reading time: 5 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
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
**가 되며, 동일한 이름을 가진 인스턴스는 하나만 존재할 수 있습니다.
두 번째 앱을 만들고 이름을 변경하려면 **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분 정도 기다리세요. 작동하지 않으면 다른 배포를 호출하고 몇 분 기다리세요.
note
사용할 서비스 계정을 지정하는 것이 가능합니다. 그러나 기본적으로 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
이 권한을 사용하면 유연한 유형의 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 인스턴스를 제거해도 (새 인스턴스가 배포됨) 실행되는 코드는 변경되지 않는다는 것이 테스트되었습니다.
버킷과 같은 경쟁 조건 공격을 수행하면 실행되는 코드를 덮어쓸 수 있을 가능성이 있지만, 이는 테스트되지 않았습니다.
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.