AWS - Lambda Layers Persistence
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Treinamento Especialista em Red Team AWS (ARTE) Aprenda e pratique Hacking GCP: HackTricks Treinamento Especialista em Red Team GCP (GRTE)
Uma camada 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 à 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.
O caminho de carregamento que o Python usará na lambda é o seguinte:
Verifique como as segundas e terceiras posições são ocupadas por diretórios onde lambda layers descompactam seus arquivos: /opt/python/lib/python3.9/site-packages
e /opt/python
Se um atacante conseguir backdoor uma layer lambda usada ou adicionar uma que estará executando código arbitrário quando uma biblioteca comum for carregada, ele poderá executar código malicioso com cada invocação de lambda.
Portanto, os requisitos são:
Verificar bibliotecas que são carregadas pelo código das vítimas
Criar uma biblioteca proxy com lambda layers que irá executar código personalizado e carregar a biblioteca original.
Ao abusar dessa técnica, encontrei uma dificuldade: Algumas bibliotecas já estão carregadas no tempo de execução do python quando seu código é executado. Eu esperava encontrar coisas como os
ou sys
, mas até a biblioteca json
estava carregada.
Para abusar dessa técnica de persistência, o código precisa carregar uma nova biblioteca que não esteja carregada quando o código é executado.
Com um código python como este, é possível obter a lista de bibliotecas que estão pré-carregadas dentro do tempo de execução do python em lambda:
E esta é a lista (verifique se bibliotecas como os
ou json
já estão lá)
E esta é a lista de bibliotecas que lambda inclui instaladas por padrão: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Neste exemplo, vamos supor que o código alvo está importando csv
. Vamos backdoor a importação da biblioteca csv
.
Para fazer isso, vamos criar o diretório csv com o arquivo __init__.py
nele em um caminho que é carregado pelo lambda: /opt/python/lib/python3.9/site-packages
Então, quando o lambda for executado e tentar carregar csv, nosso arquivo __init__.py
será carregado e executado.
Este arquivo deve:
Executar nosso payload
Carregar a biblioteca csv original
Podemos fazer ambos com:
Então, crie um zip com este código no caminho python/lib/python3.9/site-packages/__init__.py
e adicione-o como uma camada lambda.
Você pode encontrar este código em https://github.com/carlospolop/LambdaLayerBackdoor
O payload integrado enviará as credenciais IAM para um servidor NA PRIMEIRA VEZ que for invocado ou APÓS um reset do contêiner lambda (mudança de código ou lambda fria), mas outras técnicas como as seguintes também poderiam ser integradas:
Observe que é possível usar camadas lambda de contas externas. Além disso, uma lambda pode usar uma camada de uma conta externa mesmo que não tenha permissões. Além disso, o número máximo de camadas que uma lambda pode ter é 5.
Portanto, para melhorar a versatilidade desta técnica, um atacante poderia:
Backdoor uma camada existente do usuário (nada é externo)
Criar uma camada em sua conta, dar acesso à conta da vítima para usar a camada, configurar a camada na Lambda da vítima e remover a permissão.
A Lambda ainda poderá usar a camada e a vítima não terá uma maneira fácil de baixar o código das camadas (além de conseguir um rev shell dentro da lambda)
A vítima não verá camadas externas usadas com aws lambda list-layers
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)