AWS - Lambda Enum
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Amazon Web Services (AWS) Lambda est décrit comme un service de calcul qui permet l'exécution de code sans la nécessité de provisionner ou de gérer des serveurs. Il se caractérise par sa capacité à gérer automatiquement l'allocation des ressources nécessaires à l'exécution du code, garantissant des fonctionnalités telles que haute disponibilité, évolutivité et sécurité. Un aspect significatif de Lambda est son modèle de tarification, où les frais sont basés uniquement sur le temps de calcul utilisé, éliminant ainsi le besoin d'investissements initiaux ou d'obligations à long terme.
Pour appeler une lambda, il est possible de l'appeler aussi souvent que vous le souhaitez (avec Cloudwatch), d'exposer un point de terminaison URL et de l'appeler, de l'appeler via API Gateway ou même en fonction des événements tels que des changements de données dans un bucket S3 ou des mises à jour d'une table DynamoDB.
Le code d'une lambda est stocké dans /var/task
.
Une Lambda peut avoir plusieurs versions. Et elle peut avoir plus d'une version exposée via des alias. Les poids de chacune des versions exposées dans un alias décideront quel alias reçoit l'invocation (cela peut être 90%-10% par exemple). Si le code de l'un des alias est vulnérable, vous pouvez envoyer des requêtes jusqu'à ce que la version vulnérable reçoive l'exploit.
Les politiques de ressources Lambda permettent de donner accès à d'autres services/comptes pour invoquer la lambda par exemple. Par exemple, voici la politique pour permettre à quiconque d'accéder à une lambda exposée via URL :
Ou ceci pour permettre à un API Gateway de l'invoquer :
Lorsqu'il y a des centaines de requêtes lambda simultanées, si chacune d'elles doit se connecter et fermer une connexion à une base de données, cela ne va tout simplement pas fonctionner (les lambdas sont sans état, ne peuvent pas maintenir des connexions ouvertes). Alors, si vos fonctions Lambda interagissent avec RDS Proxy au lieu de votre instance de base de données. Cela gère le pool de connexions nécessaire pour faire évoluer de nombreuses connexions simultanées créées par des fonctions Lambda concurrentes. Cela permet à vos applications Lambda de réutiliser les connexions existantes, plutôt que de créer de nouvelles connexions pour chaque invocation de fonction.
Pour préserver et même partager des données, les Lambdas peuvent accéder à EFS et les monter, de sorte que Lambda pourra lire et écrire à partir de celui-ci.
Une couche Lambda est une archive .zip qui peut contenir du code supplémentaire ou d'autres contenus. Une couche peut contenir des bibliothèques, un runtime personnalisé, des données ou des fichiers de configuration.
Il est possible d'inclure jusqu'à cinq couches par fonction. Lorsque vous incluez une couche dans une fonction, les contenus sont extraits dans le répertoire /opt
dans l'environnement d'exécution.
Par défaut, les couches que vous créez sont privées à votre compte AWS. Vous pouvez choisir de partager une couche avec d'autres comptes ou de rendre la couche publique. Si vos fonctions consomment une couche qu'un autre compte a publiée, vos fonctions peuvent continuer à utiliser la version de la couche après qu'elle a été supprimée, ou après que votre permission d'accéder à la couche a été révoquée. Cependant, vous ne pouvez pas créer une nouvelle fonction ou mettre à jour des fonctions utilisant une version de couche supprimée.
Les fonctions déployées en tant qu'image de conteneur n'utilisent pas de couches. Au lieu de cela, vous regroupez votre runtime préféré, vos bibliothèques et d'autres dépendances dans l'image de conteneur lorsque vous construisez l'image.
Les extensions Lambda améliorent les fonctions en s'intégrant à divers outils de surveillance, d'observabilité, de sécurité et de gouvernance. Ces extensions, ajoutées via des archives .zip utilisant des couches Lambda ou incluses dans les déploiements d'images de conteneur, fonctionnent en deux modes : interne et externe.
Les extensions internes fusionnent avec le processus d'exécution, manipulant son démarrage à l'aide de variables d'environnement spécifiques au langage et de scripts d'enveloppe. Cette personnalisation s'applique à une gamme de runtimes, y compris Java Correto 8 et 11, Node.js 10 et 12, et .NET Core 3.1.
Les extensions externes fonctionnent en tant que processus séparés, maintenant l'alignement opérationnel avec le cycle de vie de la fonction Lambda. Elles sont compatibles avec divers runtimes comme Node.js 10 et 12, Python 3.7 et 3.8, Ruby 2.5 et 2.7, Java Corretto 8 et 11, .NET Core 3.1, et runtimes personnalisés.
Maintenant, il est temps de découvrir les fonctions lambda possibles à exécuter :
Une fonction lambda appelée "Level6" est disponible. Voyons comment l'appeler :
Maintenant que vous connaissez le nom et l'ID, vous pouvez obtenir le Nom :
Et enfin, appelez la fonction en accédant (notez que l'ID, le nom et le nom de la fonction apparaissent dans l'URL) : https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6
URL:
https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>
Il existe de nombreuses autres sources qui peuvent déclencher une lambda
Dans la page suivante, vous pouvez vérifier comment abuser des permissions Lambda pour escalader les privilèges :
Apprenez et pratiquez le Hacking AWS :HackTricks Training AWS Red Team Expert (ARTE) Apprenez et pratiquez le Hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)