AWS - Lambda Enum

Support HackTricks

Lambda

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

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

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

Ваги Аліасів Лямбди

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

Політики Ресурсів

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

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

Проксі Бази Даних Лямбди

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

Файлові Системи EFS Лямбди

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

Шари Лямбди

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

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

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

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

Розширення Лямбди

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

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

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

Перерахування

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>

Викликати лямбду

Вручну

# 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

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

Call Lambda function via URL

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

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

Доступна функція лямбда під назвою "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