AWS - Lambda Privesc
lambda
Додаткова інформація про lambda в:
pageAWS - 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 (наприклад, з оборотним shell).
Після налаштування функції користувач може запустити її виконання та необхідні дії, викликавши функцію Lambda через API AWS. Цей підхід ефективно дозволяє користувачеві виконувати завдання опосередковано через функцію Lambda, працюючи на рівні доступу, наданого роллю IAM, пов'язаною з нею.\
Атакувальник може скористатися цим, щоб отримати оборотний shell та вкрасти токен:
Ви також можете зловживати дозволами ролі lambda з самої функції 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
Потенційний вплив: Пряме підвищення привілеїв до вказаної довільної службової ролі лямбди.
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.
Замість прямого виклику Лямбди, користувач налаштовує або використовує існуючу таблицю DynamoDB, пов'язуючи її з Лямбдою через відображення джерела подій. Ця настройка забезпечує автоматичне спрацювання функції Лямбда при введенні нового елементу в таблицю, або користувачем, або іншим процесом, тим самим опосередковано викликаючи функцію Лямбда та виконуючи код з дозволами переданої ролі IAM.
Якщо DynamoDB вже активний в середовищі AWS, користувачу лише потрібно встановити відображення джерела подій для функції Lambda. Однак, якщо DynamoDB не використовується, користувач повинен створити нову таблицю з увімкненим потоком даних:
Зараз можливо підключити функцію Lambda до таблиці DynamoDB, створивши відображення джерела подій:
За допомогою функції Lambda, пов'язаної з потоком DynamoDB, зловмисник може непрямо активувати Lambda, активуючи потік DynamoDB. Це можна зробити, вставивши елемент у таблицю DynamoDB:
Потенційний вплив: Пряме підвищення привілеїв до вказаної ролі служби lambda.
lambda:AddPermission
lambda:AddPermission
Зловмисник з цим дозволом може надати собі (або іншим) будь-які дозволи (це генерує політики на основі ресурсів для надання доступу до ресурсу):
lambda:UpdateFunctionCode
lambda:UpdateFunctionCode
Користувачі, які мають дозвіл lambda:UpdateFunctionCode
, мають можливість змінювати код існуючої функції Lambda, яка пов'язана з роллю IAM.
Атакувальник може змінити код лямбди для витіснення IAM-підтверджень.
Хоча атакувальник може не мати прямої можливості викликати функцію, якщо функція Lambda існує і працює, ймовірно, що вона буде запущена через існуючі робочі процеси або події, тим самим опосередковано сприяючи виконанню зміненого коду.
Потенційний вплив: Пряме підвищення привілеїв до службової ролі lambda, яка використовується.
lambda:UpdateFunctionConfiguration
lambda:UpdateFunctionConfiguration
Вступ
Lambda Layers дозволяє включати код у вашу функцію lambda, але зберігати його окремо, щоб код функції міг залишатися малим, і декілька функцій могли ділитися кодом.
У 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
для додавання нового шару до функції лямбда. Для виконання довільного коду цей шар повинен містити бібліотеку, яку лямбда буде імпортувати. Якщо ви можете прочитати код лямбди, ви можете легко знайти це, також слід зауважити, що можливо, що лямбда вже використовує шар і ви можете завантажити шар та додати свій код туди.
Наприклад, давайте припустимо, що лямбда використовує бібліотеку boto3, це створить локальний шар з останньою версією бібліотеки:
Ви можете відкрити ./lambda_layer/boto3/__init__.py
та додати задній прохід у глобальний код (наприклад, функцію для витягування облікових даних або отримання зворотного шелу).
Потім стисніть цю директорію ./lambda_layer
та завантажте новий шар lambda у свій власний обліковий запис (або в обліковий запис жертви, але у вас може не бути дозволів на це).
Зверніть увагу, що вам потрібно створити папку python та помістити бібліотеки туди, щоб перезаписати /opt/python/boto3. Крім того, шар повинен бути сумісний з версією Python, яку використовує lambda, і якщо ви завантажуєте його у свій обліковий запис, він повинен бути в тому ж регіоні:
Зараз зробіть завантажений шар lambda доступним для будь-якого облікового запису:
І додайте шар lambda до функції lambda жертви:
Наступним кроком буде або викликати функцію самостійно, якщо ми можемо, або зачекати, поки вона буде викликана звичайними засобами - це безпечніший метод.
Більш прихований спосіб використання цієї вразливості можна знайти в:
pageAWS - Lambda Layers PersistenceПотенційний вплив: Пряме підвищення привілеїв до використаної ролі служби лямбда.
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Можливо, з цими дозволами ви зможете створити функцію та виконати її, викликавши URL... але я не зміг знайти спосіб це перевірити, тому дайте знати, якщо ви це зробите!
Прослуховування Lambda
Деякі лямбди будуть отримувати чутливу інформацію від користувачів у параметрах. Якщо ви отримаєте RCE в одній з них, ви зможете витягти інформацію, яку інші користувачі надсилають до неї, перевірте це в:
pageAWS - Steal Lambda RequestsПосилання
Last updated