AWS - Lambda Enum

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

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

Privesc

Na pĂĄgina seguinte vocĂȘ pode verificar como abusar das permissĂ”es do Lambda para escalar privilĂ©gios:

AWS - Lambda Privesc

Acesso NĂŁo Autenticado

AWS - Lambda Unauthenticated Access

Pós Exploração

AWS - Lambda Post Exploitation

PersistĂȘncia

AWS - Lambda Persistence

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