AWS - Lambda Enum
Reading time: 8 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.
Lambda
Amazon Web Services (AWS) Lambda é descrito como um serviço de computação que permite a execução de código sem a necessidade de provisionamento ou gerenciamento de servidores. É caracterizado pela sua capacidade de gerenciar automaticamente a alocação de recursos necessários para a execução do código, garantindo recursos como alta disponibilidade, escalabilidade e segurança. Um aspecto significativo do Lambda é seu modelo de preços, onde as cobranças são baseadas exclusivamente no tempo de computação utilizado, eliminando a necessidade de investimentos iniciais ou obrigações de longo prazo.
Para chamar um lambda, é possível chamá-lo tão frequentemente quanto você quiser (com Cloudwatch), expor um endpoint de URL e chamá-lo, chamá-lo via API Gateway ou até mesmo com base em eventos como mudanças nos dados em um bucket S3 ou atualizações em uma tabela DynamoDB.
O código de um lambda é armazenado em /var/task
.
Pesos de Aliases do Lambda
Um Lambda pode ter várias versões.
E pode ter mais de 1 versão exposta via aliases. Os pesos de cada uma das versões expostas dentro de um alias decidirão qual alias recebe a invocação (pode ser 90%-10%, por exemplo).
Se o código de um dos aliases for vulnerável, você pode enviar requisições até que a versão vulnerável receba o exploit.
Políticas de Recursos
As políticas de recursos do Lambda permitem dar acesso a outros serviços/contas para invocar o lambda, por exemplo.
Por exemplo, esta é a política para permitir que qualquer um acesse um lambda exposto via URL:
Ou esta para permitir que um API Gateway o invoque:
Proxies de Banco de Dados do Lambda
Quando há centenas de requisições lambda concorrentes, se cada uma delas precisar conectar e fechar uma conexão com um banco de dados, simplesmente não vai funcionar (lambdas são sem estado, não podem manter conexões abertas).
Então, se suas funções Lambda interagem com RDS Proxy em vez de sua instância de banco de dados. Ele gerencia o pooling de conexões necessário para escalar muitas conexões simultâneas criadas por funções Lambda concorrentes. Isso permite que suas aplicações Lambda reutilizem conexões existentes, em vez de criar novas conexões para cada invocação de função.
Sistemas de Arquivos EFS do Lambda
Para preservar e até compartilhar dados, Lambdas podem acessar EFS e montá-los, para que o Lambda possa ler e escrever a partir dele.
Camadas do Lambda
Uma camada do Lambda é um arquivo .zip que pode conter código adicional ou outro conteúdo. Uma camada pode conter bibliotecas, um runtime personalizado, dados ou arquivos de configuração.
É possível incluir até cinco camadas por função. Quando você inclui uma camada em uma função, o conteúdo é extraído para o diretório /opt
no ambiente de execução.
Por padrão, as camadas que você cria são privadas para sua conta AWS. Você pode optar por compartilhar uma camada com outras contas ou tornar a camada pública. Se suas funções consumirem uma camada que uma conta diferente publicou, suas funções podem continuar a usar a versão da camada após ela ter sido excluída, ou após sua permissão para acessar a camada ser revogada. No entanto, você não pode criar uma nova função ou atualizar funções usando uma versão de camada excluída.
Funções implantadas como uma imagem de contêiner não usam camadas. Em vez disso, você empacota seu runtime preferido, bibliotecas e outras dependências na imagem do contêiner ao construir a imagem.
Extensões do Lambda
As extensões do Lambda aprimoram funções integrando-se a várias ferramentas de monitoramento, observabilidade, segurança e governança. Essas extensões, adicionadas via .zip archives usando camadas do Lambda ou incluídas em implantações de imagens de contêiner, operam em dois modos: interno e externo.
- Extensões internas se fundem com o processo de runtime, manipulando seu início usando variáveis de ambiente específicas de linguagem e scripts wrapper. Essa personalização se aplica a uma variedade de runtimes, incluindo Java Correto 8 e 11, Node.js 10 e 12, e .NET Core 3.1.
- Extensões externas são executadas como processos separados, mantendo a operação alinhada com o ciclo de vida da função Lambda. Elas são compatíveis com vários runtimes como Node.js 10 e 12, Python 3.7 e 3.8, Ruby 2.5 e 2.7, Java Corretto 8 e 11, .NET Core 3.1, e runtimes personalizados.
Enumeração
aws lambda get-account-settings
# List functions and get extra config info
aws lambda list-functions
aws lambda get-function --function-name <function_name>
aws lambda get-function-configuration --function-name <function_name>
aws lambda list-function-event-invoke-configs --function-name <function_name>
## Check for creds in env vars
aws lambda list-functions | jq '.Functions[].Environment'
## Download & check the source code
aws lambda get-function --function-name "<func_name>" --query 'Code.Location'
wget -O lambda-function.zip <url-from-previous-query>
# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name <function_name>
aws lambda get-function-url-config --function-name <function_name>
# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name <function_name>
# Versions and Aliases
aws lambda list-versions-by-function --function-name <func_name>
aws lambda list-aliases --function-name <func_name>
# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name <name>
aws lambda get-layer-version --layer-name <name> --version-number <ver>
aws lambda get-layer-version-by-arn --arn <name> #Get external ARNs
# List other metadata
aws lambda list-event-source-mappings
aws lambda list-code-signing-configs
aws lambda list-functions-by-code-signing-config --code-signing-config-arn <arn>
Invocar uma lambda
Manual
# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## Some functions will expect parameters, they will access them with something like:
## target_policys = event['policy_names']
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt
Via URL exposta
aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config --function-name <function_name> #Get lambda URL
Chamar função Lambda via URL
Agora é hora de descobrir possíveis funções lambda para executar:
aws --region us-west-2 --profile level6 lambda list-functions
Uma função lambda chamada "Level6" está disponível. Vamos descobrir como chamá-la:
aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6
Agora que você sabe o nome e o ID, você pode obter o Nome:
aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"
E finalmente chame a função acessando (note que o ID, Nome e nome da função aparecem na URL): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6
URL:
https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>
Outros Gatilhos
Existem muitas outras fontes que podem acionar um lambda
.png)
Privesc
Na página seguinte você pode verificar como abusar das permissões do Lambda para escalar privilégios:
Acesso Não Autenticado
AWS - Lambda Unauthenticated Access
Pós Exploração
AWS - Lambda Post Exploitation
Persistência
Referências
- https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer
- https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/
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.