AWS - Lambda Enum
Lambda
Amazon Web Services (AWS) Lambda est décrit comme un service de calcul qui permet l'exécution de code sans nécessiter de provisionnement ou de gestion de serveur. Il se caractérise par sa capacité à gérer automatiquement l'allocation de ressources nécessaire à l'exécution du code, garantissant des fonctionnalités telles que la haute disponibilité, la scalabilité et la 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 le besoin d'investissements initiaux ou d'engagements à long terme.
Pour appeler une lambda, il est possible de l'appeler aussi fréquemment que vous le souhaitez (avec Cloudwatch), exposer une URL et l'appeler, l'appeler via API Gateway ou même en fonction d'é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
.
Poids des alias Lambda
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 à l'intérieur d'un alias décideront quel alias reçoit l'invocation (cela peut être par exemple 90%-10%). 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.
Politiques de ressources Lambda
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 à tout le monde d'accéder à une lambda exposée via une URL :
Ou ceci pour permettre à une API Gateway de l'invoquer :
Proxies de base de données Lambda
Lorsqu'il y a des centaines de requêtes lambda simultanées, si chacune d'entre elles doit se connecter et fermer une connexion à une base de données, cela ne fonctionnera tout simplement pas (les lambdas sont sans état, ne peuvent pas maintenir des connexions ouvertes). Ensuite, si vos fonctions Lambda interagissent avec RDS Proxy au lieu de votre instance de base de données. Il gère le pool de connexions nécessaire pour mettre à l'échelle de nombreuses connexions simultanées créées par des fonctions Lambda concurrentes. Cela permet à vos applications Lambda de réutiliser des connexions existantes, plutôt que de créer de nouvelles connexions pour chaque invocation de fonction.
Systèmes de fichiers EFS Lambda
Pour préserver et même partager des données, les Lambdas peuvent accéder à EFS et les monter, ainsi la Lambda pourra lire et écrire à partir de celui-ci.
Couches Lambda
Une couche Lambda est une archive de fichier .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
de l'environnement d'exécution.
Par défaut, les couches que vous créez sont privées pour votre compte AWS. Vous pouvez choisir de partager une couche avec d'autres comptes ou de la rendre publique. Si vos fonctions consomment une couche publiée par un compte différent, vos fonctions peuvent continuer à utiliser la version de la couche après sa suppression, ou après la révocation de votre autorisation d'accès à la couche. Cependant, vous ne pouvez pas créer une nouvelle fonction ou mettre à jour des fonctions en 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 emballez votre runtime préféré, des bibliothèques et d'autres dépendances dans l'image de conteneur lors de la construction de l'image.
Extensions Lambda
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 en utilisant des couches Lambda ou incluses dans des 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'enrobage. 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 s'exécutent en tant que processus séparés, maintenant l'alignement opérationnel avec le cycle de vie de la fonction Lambda. Ils sont compatibles avec divers runtimes tels que 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 les runtimes personnalisés.
Énumération
Appeler une lambda
Manuel
Via URL exposée
Appeler une fonction Lambda via une URL
Maintenant, il est temps de découvrir les éventuelles fonctions lambda à exécuter :
Un lambda function appelé "Level6" est disponible. Trouvons 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 (remarquez 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>
Autres Déclencheurs
Il existe de nombreuses autres sources qui peuvent déclencher une lambda
Élévation de privilèges
Sur la page suivante, vous pouvez vérifier comment abuser des autorisations Lambda pour escalader les privilèges :
pageAWS - Lambda PrivescAccès non authentifié
pageAWS - Lambda Unauthenticated AccessPost-exploitation
pageAWS - Lambda Post ExploitationPersistance
pageAWS - Lambda PersistenceRéférences
Dernière mise à jour