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 지원하기

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를 사용해 App을 배포하는 데 필요한 권한입니다. 아마 getlist 권한은 생략할 수 있을지도 모릅니다.

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 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=@$PROJECT_ID.iam.gserviceaccount.com

</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는 아님)입니다. 일부 listget 권한은 실제로 필요하지 않을 수 있습니다.

App Engine 인스턴스에 SSH 접속 ```bash gcloud app instances ssh --service --version ```

appengine.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 관련 내용은 이 페이지에서 확인하세요:

GCP - Storage Privesc

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 지원하기