
Используйте Terraform для создания собственного полигона для повышения привилегий AWS IAM, уязвимого по замыслу.
Используйте Terraform для создания собственного уязвимого по замыслу полигона для повышения привилегий AWS IAM.

IAM Vulnerable использует бинарный файл Terraform и ваши учетные данные AWS для развертывания более 250 ресурсов IAM в выбранном вами аккаунте AWS. В течение нескольких минут вы можете начать изучать, как выявлять и эксплуатировать уязвимые конфигурации IAM, которые позволяют повышать привилегии.
Всем привет. IAM Vulnerable по-прежнему чрезвычайно полезен для понимания основных строительных блоков повышения привилегий AWS IAM. Однако через несколько лет после создания IAM Vulnerable я создал CloudFoxable — версию в стиле CTF, которая более целостно обучает основам пентеста облачных сред. — @sethsec
Присоединяйтесь к нам на сервере RedSec в Discord
🦊 В настоящее время поддерживаемые пути повышения привилегий: 31
Статья в блоге: IAM Vulnerable — Полигон для повышения привилегий AWS IAM
Этот краткий старт описывает один из подходов к быстрому запуску IAM Vulnerable в вашем аккаунте AWS. Возможно, многие из этих шагов у вас уже выполнены, или вы захотите настроить что-то под свою текущую конфигурацию. Ознакомьтесь с разделом Другие варианты использования в этом репозитории для получения дополнительных вариантов настройки.
aws sts get-caller-identity.git clone https://github.com/BishopFox/iam-vulnerablecd iam-vulnerable/terraform initexport TF_VAR_aws_local_profile=PROFILE_IN_AWS_CREDENTIALS_FILE_IF_OTHER_THAN_DEFAULTexport TF_VAR_aws_local_creds_file=FILE_LOCATION_IF_NON_DEFAULTterraform planОчистка
Всякий раз, когда вы захотите удалить все созданные IAM Vulnerable ресурсы, выполните следующие команды:
cd iam-vulnerable/terraform destroyАльтернативная очистка (когда состояние Terraform утеряно)
Если вы развернули iam-vulnerable с помощью Terraform, но больше не имеете доступа к файлу состояния (и terraform destroy не работает), вы можете использовать следующие скрипты очистки:```bash
./cleanup-scripts/cleanup_iam_vulnerable.py --dry-run
./cleanup-scripts/cleanup_iam_vulnerable.sh --dry-run
These scripts will:
- Automatically identify all IAM Vulnerable resources in your AWS account
- Show you exactly what will be deleted before proceeding
- Delete resources in the proper order to avoid dependency conflicts
- Support AWS profiles and provide detailed logging
**Important**: Always run with `--dry-run` first to see what would be deleted. See `cleanup-scripts/CLEANUP_README.md` for detailed usage instructions.
## Какие ресурсы были только что созданы?
Бинарный файл Terraform только что использовал учетные данные вашего профиля AWS по умолчанию для создания:
* **31 пользователей, ролей и политик**, каждая из которых имеет свой уникальный путь эксплуатации к административному доступу в аккаунте песочницы
* Некоторых дополнительных пользователей, групп, ролей и политик, необходимых для полной реализации определенных путей эксплуатации
* Некоторых дополнительных пользователей, ролей и политик, которые проверяют возможности обнаружения других инструментов
По умолчанию каждая роль, созданная этим модулем Terraform, может быть принята пользователем или ролью, которые вы использовали для запуска Terraform.
* Если вы хотите, чтобы Terraform использовал профиль, отличный от профиля по умолчанию, или вы хотите жестко задать ARN `assume_role_policy`, см. [Другие сценарии использования](#other-use-cases).
## Сколько это будет стоить?
Развертывание IAM Vulnerable в **конфигурации по умолчанию ничего не будет стоить**. Прочтите следующий раздел, чтобы узнать, как включить нестандартные модули, которые влекут за собой затраты, и сколько каждый модуль будет стоить в месяц, если вы его развернете.
# Модульный подход
IAM Vulnerable группирует определенные ресурсы вместе в модули. Некоторые модули включены по умолчанию (те, которые не имеют затрат), а другие отключены по умолчанию (те, которые влекут затраты при развертывании). Таким образом, вы можете включать конкретные модули по мере необходимости.
Например, когда вы будете готовы поработать с путями эксплуатации, такими как `ssm:StartSession`, которые включают ресурсы вне IAM, вы можете развернуть и удалить эти ресурсы по требованию, раскомментировав модуль в файле `iam-vulnerable/main.tf` и повторно запустив `terraform apply`:```
# Uncomment the next four lines to create an ec2 instance and related resources
#module "ec2" {
# source = "./modules/non-free-resources/ec2"
# aws_assume_role_arn = (var.aws_assume_role_arn != "" ? var.aws_assume_role_arn : data.aws_caller_identity.current.arn)
#}
После того как вы раскомментируете модуль ec2, выполните:```
terraform init
terraform apply
You have now deployed the required components to try the SSM privesc paths.
## Модули бесплатных ресурсов
Развертывание всего в `free-resources` не требует затрат:
| Имя | Статус по умолчанию | Предполагаемая стоимость | Описание |
| --- | --- | --- | --- |
| privesc-paths | Включено | Нет | Содержит все пути повышения привилегий IAM |
| tool-testing | Включено | Нет | Содержит тестовые сценарии для оценки возможностей различных инструментов повышения привилегий IAM |
## Модули платных ресурсов
Развертывание этих дополнительных модулей может повлечь затраты:
| Имя | Статус по умолчанию | Предполагаемая стоимость | Описание | Требуется для |
| --- | --- | --- | --- | --- |
| EC2 | Отключено | :heavy_dollar_sign: <br> $4.50/мес. | Создает экземпляр EC2 и группу безопасности, разрешающую SSH отовсюду | `ssm-SendCommand` <br> `ssm-StartSession` <br> `ec2InstanceConnect-SendSSHPublicKey` |
| Lambda | Отключено | :slightly_smiling_face: <br> Ежемесячная стоимость зависит от использования (должна быть нулевой) | Создает функцию Lambda | `Lambda-EditExistingLambdaFunctionWithRole` |
| Glue | Отключено | :heavy_dollar_sign::heavy_dollar_sign::heavy_dollar_sign::heavy_dollar_sign: <br> $4/час | Создает конечную точку разработки Glue | `Glue-UpdateExistingGlueDevEndpoint` |
| SageMaker | Отключено | Пока не определено | Создает блокнот SageMaker | `sageMakerCreatePresignedNotebookURL` |
| CloudFormation | Отключено | :slightly_smiling_face: <br> $0.40/мес. за секрет, созданный через CloudFormation. Ничего или почти ничего за сам стек | Создает стек CloudFormation, который создает секрет в Secrets Manager | `privesc-cloudFormationUpdateStack` |
# Поддерживаемые пути повышения привилегий
| Имя пути | IAM уязвимое имя профиля | Требуемые нестандартные модули | Ссылки по эксплуатации |
| --- | --- | --- | --- |
| **Категория: Разрешения IAM на других пользователей** | | | |
| IAM-CreateAccessKey | privesc4 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 04](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) <br> :lock: [s3cur3.it IAMVulnerable - Part 3](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-3) |
| IAM-CreateLoginProfile | privesc5 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 05](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) <br> :lock: [s3cur3.it IAMVulnerable - Part 3](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-3) |
| IAM-UpdateLoginProfile | privesc6 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 06](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) <br> :lock: [s3cur3.it IAMVulnerable - Part 3](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-3) |
| **Категория: PassRole для сервиса** | | | |
| CloudFormation-PassExistingRoleToCloudFormation | privesc20 | Нет |:fox_face: [Well, That Escalated Quickly - Privesc 20](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| CodeBuild-CreateProjectPassRole | privesc-codeBuildProject | Нет | |
| DataPipeline-PassExistingRoleToNewDataPipeline | privesc21 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 21](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| EC2-CreateInstanceWithExistingProfile | privesc3 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 03](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) <br> :lock: [s3cur3.it IAMVulnerable - Part 2](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-2) |
| Glue-PassExistingRoleToNewGlueDevEndpoint | privesc18 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 18](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| Lambda-PassExistingRoleToNewLambdaThenInvoke | privesc15 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 15](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| Lambda-PassRoleToNewLambdaThenTrigger | privesc16 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 16](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| SageMaker-CreateNotebookPassRole | privesc-sageNotebook | Нет | :rhinoceros: [AWS IAM Privilege Escalation - Method 2](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) |
| SageMaker-CreateTrainingJobPassRole | privesc-sageTraining | Нет | |
| SageMaker-CreateProcessingJobPassRole | privesc-sageProcessing | Нет | |
| **Категория: Разрешения на политики** | | |
| IAM-AddUserToGroup | privesc13 | Нет |:fox_face: [Well, That Escalated Quickly - Privesc 13](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-AttachGroupPolicy | privesc8 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 08](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-AttachRolePolicy | privesc9 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 09](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-AttachUserPolicy | privesc7 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 07](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-CreateNewPolicyVersion | privesc1 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 01](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) <br> :lock: [s3cur3.it IAMVulnerable - Part 1](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable) |
| IAM-PutGroupPolicy | privesc11 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 11](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-PutRolePolicy | privesc12 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 12](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-PutUserPolicy | privesc10 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 10](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| IAM-SetExistingDefaultPolicyVersion | privesc2 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 02](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) <br> :lock: [s3cur3.it IAMVulnerable - Part 2](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-2) |
| **Категория: Повышение привилегий с помощью сервисов AWS** | | | |
| EC2InstanceConnect-SendSSHPublicKey | privesc-instanceConnect | EC2 | 🔑 [AWS IAM privilege escalation paths](https://pswalia2u.medium.com/aws-iam-privilege-escalation-paths-cba36be1aa9e) |
| CloudFormation-UpdateStack | privesc-cfUpdateStack | CloudFormation | 🔑 [AWS IAM privilege escalation paths](https://pswalia2u.medium.com/aws-iam-privilege-escalation-paths-cba36be1aa9e) |
| Glue-UpdateExistingGlueDevEndpoint | privesc19 | Glue | :fox_face: [Well, That Escalated Quickly - Privesc 19](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
| Lambda-EditExistingLambdaFunctionWithRole | privesc17 | Lambda | :fox_face: [Well, That Escalated Quickly - Privesc 17](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) <br> :lock: [s3cur3.it IAMVulnerable - Part 4](https://s3cur3.it/home/practicing-aws-security-with-iamvulnerable-part-4) |
| SageMakerCreatePresignedNotebookURL | privesc-sageUpdateURL | Sagemaker | :rhinoceros: [AWS IAM Privilege Escalation - Method 3](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) |
| SSM-SendCommand | privesc-ssm-command | EC2 | 🔑 [AWS IAM privilege escalation paths](https://pswalia2u.medium.com/aws-iam-privilege-escalation-paths-cba36be1aa9e) |
| SSM-StartSession | privesc-ssm-session | EC2 | 🔑 [AWS IAM privilege escalation paths](https://pswalia2u.medium.com/aws-iam-privilege-escalation-paths-cba36be1aa9e) |
| STS-AssumeRole | privesc-assumerole | Нет | 🔑 [AWS IAM privilege escalation paths](https://pswalia2u.medium.com/aws-iam-privilege-escalation-paths-cba36be1aa9e) |
| **Категория: Обновление политики AssumeRole** | | | |
| IAM-UpdatingAssumeRolePolicy | privesc14 | Нет | :fox_face: [Well, That Escalated Quickly - Privesc 14](https://labs.bishopfox.com/tech-blog/privilege-escalation-in-aws) |
# Другие случаи использования
#### По умолчанию — `terraform.tfvars` не настроен
* Развертывание с использованием профиля AWS по умолчанию
* Все созданные роли доступны для принятия субъектом, используемым для запуска Terraform (указан в профиле по умолчанию)
#### Использование профиля, отличного от профиля по умолчанию, для запуска Terraform
* Скопируйте `terraform.tfvars.example` в `terraform.tfvars`
* Раскомментируйте строку `#aws_local_profile = "profile_name"` и укажите нужное имя профиля
* Если вы используете нестандартный профиль и по-прежнему хотите использовать файл `aws_credentials_file_example`, выполните эту команду для создания файла учетных данных AWS, который будет работать с вашим нестандартным именем профиля (спасибо @scriptingislife):
* Не забудьте заменить `nondefaultuser` на используемое имя профиля):
* `tail -n +7 aws_credentials_file_example | sed -e "s/111111111111/$(aws sts get-caller-identity | grep Account | awk -F\" '{print $4}')/g;s/default/nondefaultuser/g" >> ~/.aws/credentials`
#### Использование ARN, отличного от ARN вызывающего субъекта, в качестве субъекта, который может принимать вновь созданные роли
* Скопируйте `terraform.tfvars.example` в `terraform.tfvars`
* Раскомментируйте строку `#aws_assume_role_arn = "arn:aws:iam::112233445566:user/you"` и укажите нужный ARN
После создания каждая из ролей privesc будет доступна для принятия указанному субъекту (ARN).
#### Создание ресурса в учетной записи X, но использование ARN из учетной записи Y в качестве субъекта, который может принимать вновь созданные роли
Если вы настроили профили AWS CLI, которые принимают роли в других учетных записях, вам нужно указать имя профиля И вручную указать ARN, который вы хотите использовать для принятия различных ролей.
В примере ниже ресурсы будут созданы в учетной записи, связанной с `"prod-cross-org-access-role"`, но каждая роль, созданная Terraform, может быть доступна через `"arn:aws:iam::112233445566:user/you"`, который принадлежит другой учетной записи.```
aws_local_profile = "prod-cross-org-access-role"
aws_assume_role_arn = "arn:aws:iam::112233445566:user/you"
Все эти инструменты используют Terraform для развертывания намеренно уязвимой инфраструктуры в AWS. Однако основное внимание IAM Vulnerable уделяется повышению привилегий IAM, в то время как другие инструменты либо не охватывают повышение привилегий IAM, либо охватывают лишь некоторые сценарии.
Все эти инструменты помогают выявлять существующие неверные конфигурации в вашей среде AWS. Некоторые, как Pacu, также помогают эксплуатировать неверные конфигурации. В отличие от них, IAM Vulnerable создает намеренно уязвимую инфраструктуру. Если вы действительно хотите научиться использовать такие инструменты, как Principal Mapper (PMapper), AWSPX, Pacu и Cloudsplaining, IAM Vulnerable для вас.
Я тоже боялся Terraform и проектов, которые создают ресурсы в моем аккаунте, пока не узнал, как работает Terraform. Вот несколько вещей, которые могут облегчить ваше беспокойство:
terraform plan — это пробный запуск. Она показывает вам именно то, что будет развернуто, если вы выполните terraform apply, до того, как вы это сделаете.terraform destroy для всего, что вы применили с помощью terraform apply, чтобы получить чистый лист.iam-vulnerable. Этот инструмент запускает terraform plan и рассчитывает ежемесячную стоимость, связанную с планом в его текущей конфигурации. Это инструмент, который я использовал для заполнения таблицы оценки стоимости модулей выше.Да. Каждый инструмент будет хранить свое состояние Terraform отдельно, но все ресурсы будут создаваться, обновляться и удаляться в одном и том же аккаунте, и они могут сосуществовать.
terraform applycp ~/.aws/credentials ~/.aws/credentials.backuptail -n +7 aws_credentials_file_example | sed s/111111111111/$(aws sts get-caller-identity | grep Account | awk -F\" '{print $4}')/g >> ~/.aws/credentials