AWS - Lambda Enum

Підтримайте HackTricks

Lambda

Amazon Web Services (AWS) Lambda описується як обчислювальний сервіс, який дозволяє виконувати код без необхідності надання або управління серверами. Він характеризується здатністю автоматично керувати розподілом ресурсів, необхідних для виконання коду, забезпечуючи такі функції, як висока доступність, масштабованість та безпека. Важливим аспектом Lambda є його модель ціноутворення, де оплата здійснюється виключно за використаний обчислювальний час, що усуває потребу в початкових інвестиціях або довгострокових зобов'язаннях.

Щоб викликати lambda, можна викликати її настільки часто, як хочете (з Cloudwatch), виставити URL-ендпоінт і викликати його, викликати через API Gateway або навіть на основі подій, таких як зміни даних у S3 бакеті або оновлення таблиці DynamoDB.

Код lambda зберігається в /var/task.

Lambda Aliases Weights

Lambda може мати кілька версій. І вона може мати більше 1 версії, виставленої через aliases. Ваги кожної з версій, виставлених всередині alias, визначатимуть, який alias отримає виклик (це може бути 90%-10%, наприклад). Якщо код одного з alias вразливий, ви можете надсилати запити, поки вразлива версія не отримає експлойт.

Resource Policies

Політики ресурсів Lambda дозволяють надавати доступ іншим сервісам/акаунтам для виклику lambda, наприклад. Наприклад, це політика, яка дозволяє будь-кому отримати доступ до lambda, виставленої через URL:

Або це, щоб дозволити API Gateway викликати її:

Lambda Database Proxies

Коли є сотні одночасних запитів lambda, якщо кожен з них потребує підключення та закриття з'єднання з базою даних, це просто не спрацює (lambda є безстанова, не може підтримувати відкриті з'єднання). Тоді, якщо ваші функції Lambda взаємодіють з RDS Proxy замість вашого екземпляра бази даних. Вона обробляє пулінг з'єднань, необхідний для масштабування багатьох одночасних з'єднань, створених одночасними функціями Lambda. Це дозволяє вашим додаткам Lambda повторно використовувати існуючі з'єднання, замість створення нових з'єднань для кожного виклику функції.

Lambda EFS Filesystems

Для збереження та навіть спільного використання даних Lambdas можуть отримувати доступ до EFS та монтувати їх, тому Lambda зможе читати та записувати з нього.

Lambda Layers

Lambda layer - це архівний файл .zip, який може містити додатковий код або інший вміст. Шар може містити бібліотеки, custom runtime, дані або конфігураційні файли.

Можна включити до п'яти шарів на функцію. Коли ви включаєте шар у функцію, вміст витягується до /opt каталогу в середовищі виконання.

За замовчуванням, шари, які ви створюєте, є приватними для вашого AWS акаунту. Ви можете вибрати поділитися шаром з іншими акаунтами або зробити шар публічним. Якщо ваші функції використовують шар, опублікований іншим акаунтом, ваші функції можуть продовжувати використовувати версію шару після її видалення або після відкликання вашого дозволу на доступ до шару. Однак ви не можете створити нову функцію або оновити функції, використовуючи видалену версію шару.

Функції, розгорнуті як контейнерний образ, не використовують шари. Замість цього ви пакуєте свій бажаний runtime, бібліотеки та інші залежності в контейнерний образ під час його створення.

Lambda Extensions

Розширення Lambda покращують функції, інтегруючись з різними інструментами моніторингу, спостережуваності, безпеки та управління. Ці розширення, додані через .zip архіви за допомогою шарів Lambda або включені в розгортання контейнерних образів, працюють у двох режимах: внутрішньому та зовнішньому.

  • Внутрішні розширення об'єднуються з процесом runtime, маніпулюючи його запуском за допомогою змінних середовища, специфічних для мови та скриптів-обгорток. Це налаштування застосовується до ряду runtime, включаючи Java Correto 8 та 11, Node.js 10 та 12, та .NET Core 3.1.

  • Зовнішні розширення працюють як окремі процеси, підтримуючи узгодженість роботи з життєвим циклом функції Lambda. Вони сумісні з різними runtime, такими як Node.js 10 та 12, Python 3.7 та 3.8, Ruby 2.5 та 2.7, Java Corretto 8 та 11, .NET Core 3.1, та custom runtimes.

Enumeration

aws lambda get-account-settings

# List functions and get extra config info
aws lambda list-functions
aws lambda get-function --function-name <function_name>
aws lambda get-function-configuration --function-name <function_name>
aws lambda list-function-event-invoke-configs --function-name <function_name>
## Check for creds in env vars
aws lambda list-functions | jq '.Functions[].Environment'
## Download & check the source code
aws lambda get-function --function-name "<func_name>" --query 'Code.Location'
wget -O lambda-function.zip <url-from-previous-query>

# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name <function_name>
aws lambda get-function-url-config --function-name <function_name>

# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name <function_name>

# Versions and Aliases
aws lambda list-versions-by-function --function-name <func_name>
aws lambda list-aliases --function-name <func_name>

# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name <name>
aws lambda get-layer-version --layer-name <name> --version-number <ver>
aws lambda get-layer-version-by-arn --arn <name> #Get external ARNs

# List other metadata
aws lambda list-event-source-mappings
aws lambda list-code-signing-configs
aws lambda list-functions-by-code-signing-config --code-signing-config-arn <arn>

Викликати lambda

Вручну

# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## Some functions will expect parameters, they will access them with something like:
## target_policys = event['policy_names']
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt

Через відкритий URL

Якщо URL-адреса функції aws lambda відкрита, ми можемо отримати доступ до неї без автентифікації. Це може призвести до витоку даних або виконання довільного коду.

Використання aws-cli

Ми можемо використовувати aws-cli для перерахування функцій aws lambda. Для цього нам потрібні облікові дані aws.

aws lambda list-functions --region <region>

Ця команда поверне список функцій aws lambda у вказаному регіоні.

Використання boto3

boto3 - це бібліотека Python для взаємодії з aws. Ми можемо використовувати її для перерахування функцій aws lambda.

import boto3

client = boto3.client('lambda', region_name='<region>')
response = client.list_functions()

for function in response['Functions']:
    print(function['FunctionName'])

Цей скрипт поверне список функцій aws lambda у вказаному регіоні.

aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config   --function-name <function_name> #Get lambda URL

Виклик Lambda функції через URL

Тепер настав час дізнатися можливі lambda функції для виконання:

aws --region us-west-2 --profile level6 lambda list-functions

Доступна функція lambda під назвою "Level6". Давайте дізнаємось, як її викликати:

aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6

Тепер, коли ви знаєте ім'я та ID, ви можете отримати ім'я:

aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"

І нарешті викличте функцію, отримавши доступ (зверніть увагу, що ID, Name і function-name з'являються в URL): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

URL:https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>

Інші Тригери

Існує багато інших джерел, які можуть викликати lambda

Privesc

На наступній сторінці ви можете дізнатися, як зловживати дозволами Lambda для підвищення привілеїв:

AWS - Lambda Privesc

Неавтентифікований Доступ

AWS - Lambda Unauthenticated Access

Постексплуатація

AWS - Lambda Post Exploitation

Персистентність

AWS - Lambda Persistence

Посилання

Підтримайте HackTricks

Last updated