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 se describe como un servicio de computación que permite la ejecución de código sin la necesidad de aprovisionar o gestionar servidores. Se caracteriza por su capacidad de manejar automáticamente la asignación de recursos necesarios para la ejecución del código, asegurando características como alta disponibilidad, escalabilidad y seguridad. Un aspecto significativo de Lambda es su modelo de precios, donde los cargos se basan únicamente en el tiempo de computación utilizado, eliminando la necesidad de inversiones iniciales u obligaciones a largo plazo.
Para llamar a una lambda, es posible llamarla tan frecuentemente como desees (con Cloudwatch), exponer un endpoint de URL y llamarlo, llamarlo a través de API Gateway o incluso basarlo en eventos como cambios en los datos en un S3 bucket o actualizaciones a una tabla de DynamoDB.
El código de una lambda se almacena en /var/task
.
Una Lambda puede tener varias versiones. Y puede tener más de 1 versión expuesta a través de alias. Los pesos de cada una de las versiones expuestas dentro de un alias decidirán qué alias recibe la invocación (puede ser 90%-10% por ejemplo). Si el código de uno de los alias es vulnerable, puedes enviar solicitudes hasta que la versión vulnerable reciba el exploit.
Las políticas de recursos de Lambda permiten dar acceso a otros servicios/cuentas para invocar la lambda, por ejemplo. Por ejemplo, esta es la política para permitir que cualquiera acceda a una lambda expuesta a través de URL:
O esta para permitir que un API Gateway lo invoque:
Cuando hay cientos de solicitudes concurrentes de lambda, si cada una de ellas necesita conectar y cerrar una conexión a una base de datos, simplemente no funcionará (las lambdas son sin estado, no pueden mantener conexiones abiertas). Entonces, si tus funciones Lambda interactúan con RDS Proxy en lugar de tu instancia de base de datos. Maneja el agrupamiento de conexiones necesario para escalar muchas conexiones simultáneas creadas por funciones Lambda concurrentes. Esto permite que tus aplicaciones Lambda reutilicen conexiones existentes, en lugar de crear nuevas conexiones para cada invocación de función.
Para preservar e incluso compartir datos, las Lambdas pueden acceder a EFS y montarlos, por lo que Lambda podrá leer y escribir desde ellos.
Una capa de Lambda es un archivo .zip que puede contener código adicional u otro contenido. Una capa puede contener bibliotecas, un runtime personalizado, datos o archivos de configuración.
Es posible incluir hasta cinco capas por función. Cuando incluyes una capa en una función, el contenido se extrae en el directorio /opt
en el entorno de ejecución.
Por defecto, las capas que creas son privadas para tu cuenta de AWS. Puedes elegir compartir una capa con otras cuentas o hacer que la capa sea pública. Si tus funciones consumen una capa que una cuenta diferente publicó, tus funciones pueden seguir utilizando la versión de la capa después de que haya sido eliminada, o después de que se revoque tu permiso para acceder a la capa. Sin embargo, no puedes crear una nueva función o actualizar funciones utilizando una versión de capa eliminada.
Las funciones desplegadas como una imagen de contenedor no utilizan capas. En su lugar, empaquetas tu runtime preferido, bibliotecas y otras dependencias en la imagen del contenedor cuando construyes la imagen.
Las extensiones de Lambda mejoran las funciones al integrarse con varias herramientas de monitoreo, observabilidad, seguridad y gobernanza. Estas extensiones, añadidas a través de .zip archives usando capas de Lambda o incluidas en despliegues de imágenes de contenedor, operan en dos modos: interno y externo.
Las extensiones internas se fusionan con el proceso de ejecución, manipulando su inicio utilizando variables de entorno específicas del lenguaje y scripts envolventes. Esta personalización se aplica a una variedad de runtimes, incluyendo Java Correto 8 y 11, Node.js 10 y 12, y .NET Core 3.1.
Las extensiones externas se ejecutan como procesos separados, manteniendo la alineación de operación con el ciclo de vida de la función Lambda. Son compatibles con varios runtimes como Node.js 10 y 12, Python 3.7 y 3.8, Ruby 2.5 y 2.7, Java Corretto 8 y 11, .NET Core 3.1, y runtimes personalizados.
Ahora es el momento de descubrir posibles funciones lambda para ejecutar:
Una función lambda llamada "Level6" está disponible. Vamos a averiguar cómo llamarla:
Ahora que conoces el nombre y el ID, puedes obtener el Nombre:
Y finalmente llama a la función accediendo (nota que el ID, Nombre y nombre de la función aparecen en la URL): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6
URL:
https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>
Hay muchas otras fuentes que pueden activar una lambda
En la siguiente página puedes verificar cómo abusar de los permisos de Lambda para escalar privilegios:
AWS - Lambda PrivescAprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)