AWS - Lambda Privesc
lambda
Більше інформації про lambda в:
AWS - Lambda Enumiam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)
iam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)Користувачі з правами iam:PassRole
, lambda:CreateFunction
та lambda:InvokeFunction
можуть підвищити свої привілеї.
Вони можуть створити нову Lambda функцію та призначити їй існуючу IAM роль, надаючи функції права, пов'язані з цією роллю. Користувач може потім написати та завантажити код до цієї Lambda функції (наприклад, з rev shell).
Після налаштування функції користувач може запустити її виконання та заплановані дії, викликавши Lambda функцію через AWS API. Цей підхід ефективно дозволяє користувачу виконувати завдання непрямо через Lambda функцію, працюючи з рівнем доступу, наданим IAM роллю, пов'язаною з нею.\
Зловмисник може зловживати цим, щоб отримати rev shell та вкрасти токен:
Ви також могли б зловживати дозволами ролі lambda з самої функції lambda. Якщо роль lambda мала б достатньо дозволів, ви могли б використати її, щоб надати собі адміністративні права:
Також можливо витікати облікові дані ролі lambda без необхідності зовнішнього з'єднання. Це буде корисно для мережевих ізольованих Lambdas, які використовуються для внутрішніх завдань. Якщо є невідомі групи безпеки, які фільтрують ваші зворотні оболонки, цей фрагмент коду дозволить вам безпосередньо витікати облікові дані як вихідні дані lambda.
Потенційний вплив: Пряме підвищення привілеїв до вказаної довільної ролі служби lambda.
Зверніть увагу, що навіть якщо це може виглядати цікаво, lambda:InvokeAsync
не дозволяє самостійно виконувати aws lambda invoke-async
, вам також потрібен lambda:InvokeFunction
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
Як і в попередньому сценарії, ви можете наділити себе дозволом lambda:InvokeFunction
, якщо у вас є дозвіл lambda:AddPermission
Потенційний вплив: Пряме підвищення привілеїв до вказаної довільної ролі служби lambda.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
Користувачі з iam:PassRole
, lambda:CreateFunction
та lambda:CreateEventSourceMapping
дозволами (і потенційно dynamodb:PutItem
та dynamodb:CreateTable
) можуть непрямо підвищити привілеї, навіть без lambda:InvokeFunction
.
Вони можуть створити функцію Lambda з шкідливим кодом і призначити їй існуючу роль IAM.
Замість того, щоб безпосередньо викликати Lambda, користувач налаштовує або використовує існуючу таблицю DynamoDB, пов'язуючи її з Lambda через мапування джерела подій. Це налаштування забезпечує автоматичний тригер функції Lambda при введенні нового елемента в таблицю, або через дію користувача, або інший процес, таким чином непрямо викликаючи функцію Lambda та виконуючи код з дозволами переданої ролі IAM.
Якщо DynamoDB вже активний в середовищі AWS, користувачеві лише необхідно встановити відображення джерела подій для функції Lambda. Однак, якщо DynamoDB не використовується, користувач повинен створити нову таблицю з увімкненим потоковим режимом:
Тепер можливо підключити функцію Lambda до таблиці DynamoDB шляхом створення відображення джерела подій:
З функцією Lambda, пов'язаною з потоком DynamoDB, зловмисник може непрямо активувати Lambda, активуючи потік DynamoDB. Це можна зробити, вставивши елемент у таблицю DynamoDB:
Потенційний вплив: Пряме підвищення привілеїв до ролі служби lambda, що вказана.
lambda:AddPermission
lambda:AddPermission
Зловмисник з цим дозволом може надавати собі (або іншим) будь-які дозволи (це генерує політики на основі ресурсів для надання доступу до ресурсу):
Потенційний вплив: Пряме підвищення привілеїв до ролі служби lambda, що використовується, надаючи дозвіл на зміну коду та його виконання.
lambda:AddLayerVersionPermission
lambda:AddLayerVersionPermission
Зловмисник з цим дозволом може наділити себе (або інших) дозволом lambda:GetLayerVersion
. Він може отримати доступ до шару та шукати вразливості або чутливу інформацію
Потенційний вплив: Потенційний доступ до чутливої інформації.
lambda:UpdateFunctionCode
lambda:UpdateFunctionCode
Користувачі, які мають дозвіл lambda:UpdateFunctionCode
, мають потенціал модифікувати код існуючої функції Lambda, яка пов'язана з роллю IAM.
Зловмисник може модифікувати код lambda для ексфільтрації облікових даних IAM.
Хоча зловмисник може не мати прямої можливості викликати функцію, якщо функція Lambda вже існує і працює, ймовірно, що вона буде активована через існуючі робочі процеси або події, таким чином непрямо сприяючи виконанню модифікованого коду.
Потенційний вплив: Пряме підвищення привілеїв до ролі служби lambda.
lambda:UpdateFunctionConfiguration
lambda:UpdateFunctionConfiguration
RCE через змінні середовища
З цими дозволами можливо додати змінні середовища, які змусить Lambda виконувати довільний код. Наприклад, у Python можливо зловживати змінними середовища PYTHONWARNING
та BROWSER
, щоб змусити процес Python виконувати довільні команди:
Для інших мов сценаріїв є інші змінні середовища, які ви можете використовувати. Для отримання додаткової інформації перевірте підрозділи мов сценаріїв у:
RCE через Lambda Layers
Lambda Layers дозволяє включати код у вашу функцію lamdba, але зберігати його окремо, тому код функції може залишатися маленьким, а кілька функцій можуть ділитися кодом.
Всередині lambda ви можете перевірити шляхи, з яких завантажується python код, за допомогою функції, подібної до наступної:
Це місця:
/var/task
/opt/python/lib/python3.7/site-packages
/opt/python
/var/runtime
/var/lang/lib/python37.zip
/var/lang/lib/python3.7
/var/lang/lib/python3.7/lib-dynload
/var/lang/lib/python3.7/site-packages
/opt/python/lib/python3.7/site-packages
/opt/python
Наприклад, бібліотека boto3 завантажується з /var/runtime/boto3
(4-та позиція).
Експлуатація
Можливо зловживати дозволом lambda:UpdateFunctionConfiguration
, щоб додати новий шар до функції lambda. Щоб виконати довільний код, цей шар повинен містити якусь бібліотеку, яку lambda збирається імпортувати. Якщо ви можете прочитати код lambda, ви могли б легко це знайти, також зверніть увагу, що можливо, що lambda вже використовує шар і ви могли б завантажити шар і додати свій код туди.
Наприклад, припустимо, що lambda використовує бібліотеку boto3, це створить локальний шар з останньою версією бібліотеки:
Ви можете відкрити ./lambda_layer/boto3/__init__.py
і додати бекдор у глобальний код (функцію для ексфільтрації облікових даних або отримання зворотного шелу, наприклад).
Потім стисніть цю директорію ./lambda_layer
і завантажте новий lambda layer у вашому обліковому записі (або в обліковому записі жертви, але у вас можуть не бути дозволів на це).
Зверніть увагу, що вам потрібно створити папку python і помістити бібліотеки туди, щоб перекрити /opt/python/boto3. Також layer повинен бути сумісним з версією python, що використовується lambda, і якщо ви завантажите його у свій обліковий запис, він повинен бути в тій же області:
Тепер зробіть завантажений шар lambda доступним для будь-якого облікового запису:
І прикріпіть шар lambda до функції жертви lambda:
Наступним кроком буде або викликати функцію самостійно, якщо ми можемо, або чекати, поки вона буде викликана звичайними засобами – що є більш безпечним методом.
Більш прихований спосіб експлуатації цієї вразливості можна знайти в:
AWS - Lambda Layers PersistenceПотенційний вплив: Пряме підвищення привілеїв до ролі служби lambda.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Можливо, з цими дозволами ви зможете створити функцію та виконати її, викликавши URL... але я не зміг знайти спосіб це протестувати, тож дайте знати, якщо ви це зробите!
Lambda MitM
Деякі lambdas будуть отримувати чутливу інформацію від користувачів у параметрах. Якщо ви отримаєте RCE в одній з них, ви зможете ексфільтрувати інформацію, яку інші користувачі надсилають їй, перевірте це в:
AWS - Steal Lambda RequestsПосилання
Last updated