AWS - Lambda Layers Persistence
Last updated
Last updated
Aprende 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)
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 publicó una cuenta diferente, 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.
La ruta de carga que Python utilizará en lambda es la siguiente:
Verifica cómo las segundas y terceras posiciones son ocupadas por directorios donde lambda layers descomprimen sus archivos: /opt/python/lib/python3.9/site-packages
y /opt/python
Si un atacante logra backdoor una layer de lambda utilizada o agregar una que esté ejecutando código arbitrario cuando se carga una biblioteca común, podrá ejecutar código malicioso con cada invocación de lambda.
Por lo tanto, los requisitos son:
Verificar bibliotecas que son cargadas por el código de las víctimas
Crear una biblioteca proxy con lambda layers que ejecutará código personalizado y cargará la biblioteca original.
Al abusar de esta técnica encontré una dificultad: Algunas bibliotecas ya están cargadas en el tiempo de ejecución de python cuando se ejecuta tu código. Esperaba encontrar cosas como os
o sys
, pero incluso la biblioteca json
estaba cargada.
Para abusar de esta técnica de persistencia, el código necesita cargar una nueva biblioteca que no esté cargada cuando se ejecuta el código.
Con un código en python como este es posible obtener la lista de bibliotecas que están precargadas dentro del tiempo de ejecución de python en lambda:
Y esta es la lista (verifica que bibliotecas como os
o json
ya estén allí)
Y esta es la lista de bibliotecas que lambda incluye instaladas por defecto: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
En este ejemplo supongamos que el código objetivo está importando csv
. Vamos a inyectar el import de la biblioteca csv
.
Para hacer eso, vamos a crear el directorio csv con el archivo __init__.py
en él en una ruta que es cargada por lambda: /opt/python/lib/python3.9/site-packages
Luego, cuando la lambda se ejecute e intente cargar csv, nuestro archivo __init__.py
será cargado y ejecutado.
Este archivo debe:
Ejecutar nuestra carga útil
Cargar la biblioteca csv original
Podemos hacer ambas cosas con:
Luego, crea un zip con este código en la ruta python/lib/python3.9/site-packages/__init__.py
y agrégalo como una capa lambda.
Puedes encontrar este código en https://github.com/carlospolop/LambdaLayerBackdoor
El payload integrado enviará las credenciales de IAM a un servidor LA PRIMERA VEZ que se invoque o DESPUÉS de un reinicio del contenedor lambda (cambio de código o lambda fría), pero otras técnicas como las siguientes también podrían integrarse:
Ten en cuenta que es posible usar capas lambda de cuentas externas. Además, una lambda puede usar una capa de una cuenta externa incluso si no tiene permisos. También ten en cuenta que el número máximo de capas que una lambda puede tener es 5.
Por lo tanto, para mejorar la versatilidad de esta técnica, un atacante podría:
Inyectar un backdoor en una capa existente del usuario (nada es externo)
Crear una capa en su cuenta, dar acceso a la cuenta de la víctima para usar la capa, configurar la capa en la Lambda de la víctima y eliminar el permiso.
La Lambda aún podrá usar la capa y la víctima no tendrá ninguna forma fácil de descargar el código de las capas (aparte de obtener un rev shell dentro de la lambda)
La víctima no verá capas externas utilizadas con aws lambda list-layers
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)