AWS - Lambda Privesc
lambda
Mais informações sobre lambda em:
AWS - 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 um papel IAM existente, concedendo à função as permissões associadas a esse papel. O usuário pode então escrever e fazer upload de código para essa função Lambda (com um rev shell, por exemplo).
Uma vez que a função esteja configurada, o usuário pode disparar sua execução e as ações pretendidas invocando a função Lambda através da API AWS. Essa abordagem permite efetivamente que o usuário realize tarefas indiretamente através da função Lambda, operando com o nível de acesso concedido ao papel IAM associado a ela.\
Um atacante poderia abusar disso para obter um rev shell e roubar o token:
Você também poderia abusar das permissões do papel lambda da própria função lambda. Se o papel lambda tivesse permissões suficientes, você poderia usá-lo para conceder direitos de administrador a você:
É também possível vazar as credenciais da função da lambda sem precisar de uma conexão externa. Isso seria útil para Lambdas isoladas em rede usadas em tarefas internas. Se houver grupos de segurança desconhecidos filtrando seus shells reversos, este trecho de código permitirá que você vaze diretamente as credenciais como a saída da lambda.
Impacto Potencial: Privesc direto para o papel de serviço lambda arbitrário especificado.
Observe 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
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 o papel de serviço lambda arbitrário especificado.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
Usuários com permissões iam:PassRole
, lambda:CreateFunction
e lambda:CreateEventSourceMapping
(e potencialmente dynamodb:PutItem
e dynamodb:CreateTable
) podem indiretamente escalar privilégios mesmo sem lambda:InvokeFunction
.
Eles podem criar uma função Lambda com código malicioso e atribuí-la a um papel IAM existente.
Em vez de invocar diretamente a Lambda, o usuário configura ou utiliza uma tabela DynamoDB existente, vinculando-a à Lambda através de um mapeamento de fonte de evento. Essa configuração garante que a função Lambda seja acionada automaticamente ao inserir 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 do papel IAM passado.
Se o DynamoDB já estiver ativo no ambiente AWS, o usuário precisa apenas estabelecer o mapeamento da fonte de eventos para a função Lambda. No entanto, se o DynamoDB não estiver 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 fonte de evento:
Com a função Lambda vinculada ao fluxo do DynamoDB, o atacante pode indiretamente acionar a Lambda ativando o fluxo do DynamoDB. Isso pode ser realizado inserindo um item na tabela do DynamoDB:
Impacto Potencial: Privesc direto para o papel de serviço lambda especificado.
lambda:AddPermission
lambda:AddPermission
Um atacante com esta 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 o papel de serviço lambda usado 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 vulnerabilidades ou informações sensíveis.
Impacto Potencial: Acesso potencial a informações sensíveis.
lambda:UpdateFunctionCode
lambda:UpdateFunctionCode
Usuários que possuem a permissão lambda:UpdateFunctionCode
têm o potencial de modificar o código de uma função Lambda existente que está vinculada a um papel IAM.
O atacante pode modificar o código da lambda para exfiltrar 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 ela seja acionada por meio de fluxos de trabalho ou eventos existentes, facilitando assim indiretamente a execução do código modificado.
Impacto Potencial: Privesc direto para o papel de serviço lambda utilizado.
lambda:UpdateFunctionConfiguration
lambda:UpdateFunctionConfiguration
RCE via variáveis de ambiente
Com essas permissões, é possível adicionar variáveis de ambiente que farão com que o Lambda execute código arbitrário. Por exemplo, em python, é possível abusar das variáveis de ambiente PYTHONWARNING
e BROWSER
para fazer um processo python executar comandos arbitrários:
Para outras linguagens de script, existem outras variáveis de ambiente que você pode usar. Para mais informações, consulte as subseções de linguagens de script em:
RCE via Lambda Layers
Lambda Layers permite incluir código na sua função lambda, mas armazená-lo 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 lugares:
/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 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, também note que pode ser possível que a lambda já esteja usando uma camada e você poderia baixar a camada e adicionar seu código lá.
Por exemplo, vamos supor que a lambda esteja usando a biblioteca boto3, isso criará uma camada local com a última versão da biblioteca:
Você 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 conta 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 por meios normais – que é o método mais seguro.
Uma maneira mais furtiva de explorar essa vulnerabilidade pode ser encontrada em:
AWS - Lambda Layers PersistenceImpacto Potencial: Privesc direto para a função de serviço lambda utilizada.
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 testá-la, então me avise se você conseguir!
Lambda MitM
Alguns lambdas vão estar recebendo informações sensíveis dos usuários em parâmetros. Se conseguir RCE em um deles, você pode exfiltrar as informações que outros usuários estão enviando para ele, confira em:
AWS - Steal Lambda RequestsReferências
Last updated