GCP - Storage Enum

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!

HackTricks를 지원하는 다른 방법:

스토리지

Google Cloud Platform (GCP) 스토리지는 구조화되지 않은 데이터를 위한 고도로 내구성 및 가용성을 제공하는 클라우드 기반 스토리지 솔루션입니다. 성능, 가용성 및 비용을 기반으로 하는 다양한 스토리지 클래스를 제공하며, 표준, Nearline, Coldline 및 Archive를 포함합니다. GCP 스토리지는 라이프사이클 정책, 버전 관리 및 액세스 제어와 같은 고급 기능을 제공하여 데이터를 효과적으로 관리하고 보호합니다.

버킷은 **지역, 2개 지역 또는 멀티 지역 (기본값)**에 저장될 수 있습니다.

스토리지 유형

  • 표준 스토리지: 이는 빈번하게 액세스되는 데이터에 대한 고성능, 저지연 액세스를 제공하는 기본 스토리지 옵션입니다. 웹 사이트 콘텐츠 제공, 미디어 스트리밍 및 데이터 분석 파이프라인 호스팅을 포함한 다양한 용도에 적합합니다.

  • Nearline 스토리지: 이 스토리지 클래스는 표준 스토리지보다 낮은 저장 비용약간 더 높은 액세스 비용을 제공합니다. 최소 저장 기간이 30일인 드물게 액세스되는 데이터에 최적화되어 있으며, 백업 및 아카이브 목적으로 이상적입니다.

  • Coldline 스토리지: 이 스토리지 클래스는 드물게 액세스되는 데이터의 장기 저장에 최적화되어 있으며, 최소 저장 기간이 90일입니다. Nearline 스토리지보다 낮은 저장 비용을 제공하지만 높은 액세스 비용을 가집니다.

  • Archive 스토리지: 이 스토리지 클래스는 매우 드물게 액세스되는 차가운 데이터를 위해 설계되었으며, 최소 저장 기간은 365일입니다. 모든 GCP 스토리지 옵션 중 가장 낮은 저장 비용을 제공하지만 가장 높은 액세스 비용을 가집니다. 규정상 또는 규정적인 이유로 저장해야 하는 데이터의 장기 보존에 적합합니다.

  • 자동 분류: 데이터에 대한 액세스 양을 모르는 경우 자동 분류를 선택할 수 있으며, GCP는 비용을 최소화하기 위해 자동으로 스토리지 유형을 변경합니다.

액세스 제어

기본적으로 액세스를 IAM을 통해 제어하는 것이 권장되지만 ACL 사용을 활성화할 수도 있습니다. IAM만 사용하도록 선택하고 90일이 지나면 버킷에 대해 ACL을 활성화할 수 없습니다.

버전 관리

버전 관리를 활성화할 수 있으며, 이는 버킷 내 파일의 이전 버전을 저장합니다. 유지할 버전 수를 구성하고 심지어 비현재 버전(이전 버전)이 유지될 기간을 설정할 수 있습니다. 권장 사항은 표준 유형의 경우 7일입니다.

비현재 버전의 메타데이터가 유지됩니다. 또한 비현재 버전의 ACL도 유지되므로 이전 버전은 현재 버전과 다른 ACL을 가질 수 있습니다.

자세한 내용은 문서를 참조하세요.

보존 정책

버킷 내의 객체 삭제를 금지할 기간을 지정합니다(최소한 규정 준수에 매우 유용). 버전 관리 또는 보존 정책 중 하나만 활성화될 수 있습니다.

암호화

기본적으로 객체는 Google 관리 키를 사용하여 암호화되지만 KMS 키를 사용할 수도 있습니다.

공개 액세스

외부 사용자(GCP에 로그인한 사용자 또는 아닌 사용자)가 버킷 콘텐츠에 액세스할 수 있습니다. 버킷이 생성될 때 기본적으로 버킷을 공개로 노출하는 옵션을 비활성화하지만 충분한 권한이 있으면 변경할 수 있습니다.

버킷에 액세스하는 URL의 형식은 **https://storage.googleapis.com/<bucket-name> 또는 https://<bucket_name>.storage.googleapis.com**입니다(둘 다 유효합니다).

HMAC 키

HMAC 키는 자격 증명 유형이며 Cloud Storage의 서비스 계정 또는 사용자 계정과 연결될 수 있습니다. HMAC 키를 사용하여 Cloud Storage에 요청을 포함하는 _서명_을 생성합니다. 서명은 특정 요청이 사용자 또는 서비스 계정에 의해 승인된 것을 보여줍니다.

HMAC 키에는 _액세스 ID_와 _비밀_이라는 두 가지 주요 요소가 있습니다.

  • 액세스 ID: 특정 서비스 또는 사용자 계정에 연결된 알파벳 및 숫자 문자열입니다. 서비스 계정에 연결되면 문자열 길이는 61자이며, 사용자 계정에 연결되면 문자열 길이는 24자입니다. 다음은 액세스 ID의 예시입니다:

GOOGTS7C7FUP3AIRVJTE2BCDKINBTES3HC2GY5CBFJDCQ2SYHV6A6XXVTJFSA

  • 비밀: 특정 액세스 ID에 연결된 40자리 Base-64 인코딩된 문자열입니다. 비밀은 당신과 Cloud Storage만 알고 있는 사전 공유 키입니다. 인증 프로세스의 일부로 서명을 생성하는 데 비밀을 사용합니다. 다음은 비밀의 예시입니다:

bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ

액세스 ID와 비밀은 HMAC 키를 고유하게 식별하지만, 비밀은 서명을 생성하는 데 사용되기 때문에 훨씬 민감한 정보입니다.

# List all storage buckets in project
gsutil ls

# Get each bucket configuration (protections, CLs, times, configs...)
gsutil ls -L

# List contents of a specific bucket
gsutil ls gs://bucket-name/
gsutil ls -r gs://bucket-name/ # Recursive
gsutil ls -a gs://bucket-name/ # Get ALL versions of objects

# Cat the context of a file without copying it locally
gsutil cat 'gs://bucket-name/folder/object'
gsutil cat 'gs://bucket-name/folder/object#<num>' # cat specific version

# Copy an object from the bucket to your local storage for review
gsutil cp gs://bucket-name/folder/object ~/

# List using a raw OAuth token
## Useful because "CLOUDSDK_AUTH_ACCESS_TOKEN" and "gcloud config set auth/access_token_file" doesn't work with gsutil
curl -H "Authorization: Bearer $TOKEN" "https://storage.googleapis.com/storage/v1/b/<storage-name>/o"
# Download file content from bucket
curl -H "Authorization: Bearer $TOKEN" "https://storage.googleapis.com/storage/v1/b/supportstorage-58249/o/flag.txt?alt=media" --output -

# Enumerate HMAC keys
gsutil hmac list

만약 버킷을 나열할 때 권한 거부 오류가 발생하면 여전히 콘텐츠에 액세스할 수 있을 수 있습니다. 그래서 이제 버킷의 이름 규칙을 알았으므로 가능한 이름 목록을 생성하고 액세스를 시도해 볼 수 있습니다:

for i in $(cat wordlist.txt); do gsutil ls -r gs://"$i"; done
권한 `storage.objects.list` 및 `storage.objects.get`을 사용하면 버킷에서 모든 폴더와 파일을 나열하여 다운로드할 수 있어야 합니다. 다음 Python 스크립트로 이를 달성할 수 있습니다:
import requests
import xml.etree.ElementTree as ET

def list_bucket_objects(bucket_name, prefix='', marker=None):
url = f"https://storage.googleapis.com/{bucket_name}?prefix={prefix}"
if marker:
url += f"&marker={marker}"
response = requests.get(url)
xml_data = response.content
root = ET.fromstring(xml_data)
ns = {'ns': 'http://doc.s3.amazonaws.com/2006-03-01'}
for contents in root.findall('.//ns:Contents', namespaces=ns):
key = contents.find('ns:Key', namespaces=ns).text
print(key)
next_marker = root.find('ns:NextMarker', namespaces=ns)
if next_marker is not None:
next_marker_value = next_marker.text
list_bucket_objects(bucket_name, prefix, next_marker_value)

list_bucket_objects('<storage-name>')

권한 상승

다음 페이지에서 저장소 권한을 남용하여 권한 상승하는 방법을 확인할 수 있습니다:

pageGCP - Storage Privesc

인증되지 않은 열거

pageGCP - Storage Unauthenticated Enum

사후 침투

pageGCP - Storage Post Exploitation

지속성

pageGCP - Storage Persistence
htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅까지 AWS 해킹 배우기

HackTricks를 지원하는 다른 방법:

最終更新