AWS - Lambda Enum

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Lambda

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

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

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

Ваги псевдонімів Lambda

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

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

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

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

Проксі-бази даних Lambda

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

Файлові системи Lambda EFS

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

Шари Lambda

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

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

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

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

Розширення Lambda

Розширення Lambda покращують функції, інтегруючись з різними інструментами моніторингу, спостереження, безпеки та управління. Ці розширення, додані за допомогою .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

Виклик 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 для підвищення привілеїв:

pageAWS - Lambda Privesc

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

pageAWS - Lambda Unauthenticated Access

Післяексплуатаційна діяльність

pageAWS - Lambda Post Exploitation

Постійність

pageAWS - Lambda Persistence

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated