AWS - Lambda Privesc
lambda
Mais informações sobre o lambda em:
pageAWS - Lambda Enumiam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)
iam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)Usuários com as permissões iam:PassRole
, lambda:CreateFunction
e lambda:InvokeFunction
podem escalar seus privilégios.
Eles podem criar uma nova função Lambda e atribuir a ela uma função IAM existente, concedendo à função as permissões associadas a essa função. O usuário pode então escrever e fazer upload de código para esta função Lambda (com um rev shell, por exemplo).
Uma vez que a função esteja configurada, o usuário pode acionar sua execução e as ações pretendidas invocando a função Lambda através da API da AWS. Essa abordagem permite efetivamente ao usuário realizar tarefas indiretamente por meio da função Lambda, operando com o nível de acesso concedido à função IAM associada a ela.\
Um atacante poderia abusar disso para obter um rev shell e roubar o token:
Você também pode abusar das permissões do papel lambda da própria função lambda. Se o papel lambda tiver permissões suficientes, você pode usá-lo para conceder direitos de administrador a você:
Também é possível vazar as credenciais da função lambda sem a necessidade de uma conexão externa. Isso seria útil para Lambdas isoladas de rede usadas em tarefas internas. Se houver grupos de segurança desconhecidos filtrando suas shells reversas, este trecho de código permitirá vazar diretamente as credenciais como saída da lambda.
Impacto Potencial: Privesc direto para a função de serviço lambda arbitrária especificada.
Note que mesmo que possa parecer interessante lambda:InvokeAsync
não permite por si só executar aws lambda invoke-async
, você também precisa de lambda:InvokeFunction
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
Assim como no cenário anterior, você pode conceder a si mesmo a permissão lambda:InvokeFunction
se tiver a permissão lambda:AddPermission
Impacto Potencial: Privesc direto para a função de serviço lambda arbitrariamente especificada.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
Usuários com permissões de iam:PassRole
, lambda:CreateFunction
e lambda:CreateEventSourceMapping
(e potencialmente dynamodb:PutItem
e dynamodb:CreateTable
) podem escalar privilégios indiretamente mesmo sem lambda:InvokeFunction
.
Eles podem criar uma função Lambda com código malicioso e atribuir a ela uma função IAM existente.
Em vez de invocar diretamente a Lambda, o usuário configura ou utiliza uma tabela DynamoDB existente, vinculando-a à Lambda por meio de um mapeamento de origem de evento. Essa configuração garante que a função Lambda seja acionada automaticamente ao entrar um novo item na tabela, seja pela ação do usuário ou por outro processo, invocando indiretamente a função Lambda e executando o código com as permissões da função IAM passada.
Se o DynamoDB já está ativo no ambiente AWS, o usuário só precisa estabelecer o mapeamento da origem do evento para a função Lambda. No entanto, se o DynamoDB não está em uso, o usuário deve criar uma nova tabela com streaming habilitado:
Agora é possível conectar a função Lambda à tabela DynamoDB criando um mapeamento de origem de evento:
Com a função Lambda vinculada ao stream do DynamoDB, o atacante pode ativar indiretamente a Lambda ao ativar o stream do DynamoDB. Isso pode ser feito inserindo um item na tabela do DynamoDB:
Impacto Potencial: Privesc direto para a função de serviço lambda especificada.
lambda:AddPermission
lambda:AddPermission
Um atacante com essa permissão pode conceder a si mesmo (ou a outros) quaisquer permissões (isso gera políticas baseadas em recursos para conceder acesso ao recurso):
Impacto Potencial: Privesc direto para a função de serviço lambda usada ao conceder permissão para modificar o código e executá-lo.
lambda:AddLayerVersionPermission
lambda:AddLayerVersionPermission
Um atacante com essa permissão pode conceder a si mesmo (ou a outros) a permissão lambda:GetLayerVersion
. Ele poderia acessar a camada e procurar por vulnerabilidades ou informações sensíveis.
Impacto Potencial: Potencial acesso a informações sensíveis.
lambda:UpdateFunctionCode
lambda:UpdateFunctionCode
Os usuários que possuem permissão lambda:UpdateFunctionCode
têm o potencial de modificar o código de uma função Lambda existente que está vinculada a uma função IAM.
O atacante pode modificar o código da lambda para extrair as credenciais IAM.
Embora o atacante possa não ter a capacidade direta de invocar a função, se a função Lambda já existir e estiver operacional, é provável que seja acionada por meio de fluxos de trabalho ou eventos existentes, facilitando indiretamente a execução do código modificado.
Impacto Potencial: Privesc direto para a função de serviço lambda usada.
lambda:UpdateFunctionConfiguration
lambda:UpdateFunctionConfiguration
Introdução
Camadas Lambda permite incluir código em sua função lambda, mas armazenando-o separadamente, para que o código da função possa permanecer pequeno e várias funções possam compartilhar código.
Dentro da lambda, você pode verificar os caminhos de onde o código Python é carregado com uma função como a seguinte:
Estes são os locais:
/var/task
/opt/python/lib/python3.7/site-packages
/opt/python
/var/runtime
/var/lang/lib/python37.zip
/var/lang/lib/python3.7
/var/lang/lib/python3.7/lib-dynload
/var/lang/lib/python3.7/site-packages
/opt/python/lib/python3.7/site-packages
/opt/python
Por exemplo, a biblioteca boto3 é carregada a partir de /var/runtime/boto3
(4ª posição).
Exploração
É possível abusar da permissão lambda:UpdateFunctionConfiguration
para adicionar uma nova camada a uma função lambda. Para executar código arbitrário, essa camada precisa conter alguma biblioteca que a lambda vai importar. Se você puder ler o código da lambda, poderá encontrar isso facilmente, observe também que é possível que a lambda esteja usando uma camada e você poderia baixar a camada e adicionar seu código lá.
Por exemplo, suponha que a lambda esteja usando a biblioteca boto3, isso criará uma camada local com a última versão da biblioteca:
Pode abrir ./lambda_layer/boto3/__init__.py
e adicionar a backdoor no código global (uma função para exfiltrar credenciais ou obter um shell reverso, por exemplo).
Em seguida, compacte o diretório ./lambda_layer
e faça o upload da nova camada lambda na sua própria conta (ou na da vítima, mas você pode não ter permissões para isso).
Observe que você precisa criar uma pasta python e colocar as bibliotecas lá para substituir /opt/python/boto3. Além disso, a camada precisa ser compatível com a versão do python usada pela lambda e, se você fizer o upload para sua conta, precisa estar na mesma região:
Agora, torne a camada lambda carregada acessível por qualquer conta:
E anexe a camada lambda à função lambda da vítima:
O próximo passo seria invocar a função nós mesmos, se pudermos, ou esperar até que ela seja invocada pelos meios normais - o que é o método mais seguro.
Uma maneira mais furtiva de explorar essa vulnerabilidade pode ser encontrada em:
pageAWS - Lambda Layers PersistenceImpacto Potencial: Privesc direto para a função de serviço lambda usada.
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Talvez com essas permissões você consiga criar uma função e executá-la chamando a URL... mas eu não consegui encontrar uma maneira de testar, então me avise se você conseguir!
Lambda MitM
Algumas lambdas vão estar recebendo informações sensíveis dos usuários nos parâmetros. Se conseguir RCE em uma delas, você pode extrair as informações que outros usuários estão enviando para ela, verifique em:
pageAWS - Steal Lambda RequestsReferências
Última actualización