GCP - AppEngine Privesc
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를 사용해 App을 배포하는 데 필요한 권한입니다. 아마 get 및 list 권한은 생략할 수 있을지도 모릅니다.
You can find python code examples in https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine
By default, the name of the App service is going to be default, and there can be only 1 instance with the same name.
두 번째 App을 만들려면, **app.yaml**에서 루트 키의 값을 **service: my-second-app**처럼 변경하세요.
App Engine 애플리케이션 배포
```bash cd python-docs-samples/appengine/flexible/hello_world gcloud app deploy #Upload and start application inside the folder ```적어도 10~15분은 기다리세요. 작동하지 않으면 deploy another of times를 호출하고 몇 분 더 기다리세요.
Note
사용될 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을 다음과 같이 업데이트할 수 있습니다:
기존 App Engine 애플리케이션 업데이트
```bash # Find the code of the App Engine in the buckets gsutil lsDownload 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=
</details>
AppEngine을 이미 탈취했고 `appengine.applications.update` 권한과 서비스 계정에 대해 **actAs** 권한을 가지고 있다면 AppEngine에서 사용하는 서비스 계정을 다음과 같이 수정할 수 있습니다:
<details>
<summary>App Engine 서비스 계정 업데이트</summary>
```bash
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로 로그인할 수 있으며, 대상 인스턴스는 flexible 유형(standard는 아님)입니다. 일부 list 및 get 권한은 실제로 필요하지 않을 수 있습니다.
App Engine 인스턴스에 SSH 접속
```bash gcloud app instances ssh --serviceappengine.applications.update, appengine.operations.get
이는 google이 애플리케이션을 설정할 때 사용할 백그라운드 SA를 변경하는 것일 뿐이라고 생각합니다. 그래서 이를 악용해 service account를 탈취할 수는 없을 것 같습니다.
애플리케이션 service account 업데이트
```bash gcloud app update --service-account=appengine.versions.getFileContents, appengine.versions.update
이 권한들을 어떻게 사용해야 하는지, 또는 유용한지 확실하지 않습니다 (코드를 변경하면 새 버전이 생성되므로 단순히 코드나 해당 버전의 IAM 역할만 업데이트할 수 있는지 모르겠습니다. 하지만 가능할 것 같고, 어쩌면 버킷 내부의 코드를 변경하는 방식일 수도 있습니다??).
Write Access over the buckets
앞서 언급했듯이 appengine 버전들은 staging.<project-id>.appspot.com 형식의 버킷에 일부 데이터를 생성합니다. 이 버킷을 미리 pre-takeover하는 것은 불가능한데, GCP 사용자들은 appspot.com 도메인을 사용하여 버킷을 생성할 권한이 없기 때문입니다.
하지만 이 버킷에 대해 읽기 및 쓰기 권한이 있다면, 버킷을 모니터링하면서 변경이 발생할 때마다 가능한 한 빨리 코드를 수정하여 AppEngine 버전에 연결된 SA로 권한 상승이 가능합니다. 이렇게 하면 이 코드에서 생성된 컨테이너가 execute the backdoored code.
자세한 정보와 PoC 관련 내용은 이 페이지에서 확인하세요:
Write Access over the Artifact Registry
App Engine이 Artifact Registry 안에 docker 이미지를 생성하더라도, 테스트 결과 이 서비스 내부의 이미지를 수정하더라도 App Engine 인스턴스를 제거(새 인스턴스가 배포되는 경우)해도 실행되는 코드는 변경되지 않는다는 것이 확인되었습니다.
버킷과 마찬가지로 Race Condition 공격을 수행하면 실행되는 코드를 덮어쓸 수 있을 가능성이 있지만, 이는 테스트되지 않았습니다.
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을 제출하여 해킹 트릭을 공유하세요.
HackTricks Cloud

