# GCP - Cloud Functions Enum

{{#include ../../../banners/hacktricks-training.md}}

## Cloud Functions <a href="#reviewing-cloud-functions" id="reviewing-cloud-functions"></a>

[Google Cloud Functions](https://cloud.google.com/functions/) は、ホストオペレーティングシステムの管理を必要とせずに、**イベントに応じて実行される**コードをホストするように設計されています。さらに、これらの関数は、コードが利用できる環境変数の保存をサポートしています。

### Storage

Cloud Functionsの**コードはGCP Storageに保存されます**。したがって、GCPの**バケットに対する読み取りアクセス権を持つ**誰でも**Cloud Functionsのコードを読み取ることができます**。\
コードは次のようなバケットに保存されます：

- `gcf-sources-<number>-<region>/<function-name>-<uuid>/version-<n>/function-source.zip`
- `gcf-v2-sources-<number>-<region>/<function-name>function-source.zip`

例えば：\
`gcf-sources-645468741258-us-central1/function-1-003dcbdf-32e1-430f-a5ff-785a6e238c76/version-4/function-source.zip`

> [!WARNING]
> Cloud Functionを保存している**バケットに対する読み取り権限を持つ**ユーザーは、**実行されたコードを読み取ることができます**。

### Artifact Registry

クラウド関数が実行されたDockerコンテナがプロジェクト内のArtifact Registryリポジトリに保存されるように構成されている場合、リポジトリに対する読み取りアクセス権を持つ者は、イメージをダウンロードしてソースコードを確認できます。詳細については、次を確認してください：

{{#ref}}
gcp-artifact-registry-enum.md
{{#endref}}

### SA

指定されていない場合、デフォルトで**App Engine Default Service Account**がプロジェクトに対する**Editor権限**を持ってCloud Functionに添付されます。

### Triggers, URL & Authentication

Cloud Functionが作成されると、**トリガー**を指定する必要があります。一般的なものの一つは**HTTPS**で、これにより**関数をウェブブラウジングでトリガーできるURLが作成されます**。\
他のトリガーにはpub/sub、Storage、Filestoreなどがあります...

URL形式は**`https://<region>-<project-gcp-name>.cloudfunctions.net/<func_name>`**です。

HTTPSトリガーが使用されると、**呼び出し元がFunctionを呼び出すためにIAM認証を持つ必要があるか、**誰でも**呼び出すことができるかが示されます：

<figure><img src="../../../images/image (19).png" alt=""><figcaption></figcaption></figure>

### Inside the Cloud Function

コードは**`/workspace`**フォルダー内にダウンロードされ、Cloud Function内のファイルと同じファイル名で保存され、ユーザー`www-data`で実行されます。\
ディスクは**読み取り専用としてマウントされていません**。

### Enumeration
```bash
# List functions
gcloud functions list
gcloud functions describe <func_name> # Check triggers to see how is this function invoked
gcloud functions get-iam-policy <func_name>

# Get logs of previous runs. By default, limits to 10 lines
gcloud functions logs read <func_name> --limit [NUMBER]

# Call a function
curl https://<region>-<project>.cloudfunctions.net/<func_name>
gcloud functions call <func_name> --data='{"message": "Hello World!"}'

# If you know the name of projects you could try to BF cloud functions names

# Get events that could be used to trigger a cloud function
gcloud functions event-types list

# Access function with authentication
curl -X POST https://<region>-<project>.cloudfunctions.net/<func_name> \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{}'
```
### 権限昇格

次のページでは、**クラウド関数の権限を悪用して権限を昇格させる方法**を確認できます：

{{#ref}}
../gcp-privilege-escalation/gcp-cloudfunctions-privesc.md
{{#endref}}

### 認証されていないアクセス

{{#ref}}
../gcp-unauthenticated-enum-and-access/gcp-cloud-functions-unauthenticated-enum.md
{{#endref}}

### ポストエクスプロイト

{{#ref}}
../gcp-post-exploitation/gcp-cloud-functions-post-exploitation.md
{{#endref}}

### 永続性

{{#ref}}
../gcp-persistence/gcp-cloud-functions-persistence.md
{{#endref}}

## 参考文献

- [https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/#reviewing-stackdriver-logging](https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/#reviewing-stackdriver-logging)

{{#include ../../../banners/hacktricks-training.md}}
