Iscriviti al webinar gratuito del 12 Maggio per diventare Forensic Analyst! Scopri di più
Corso Ethical Hacker: accedi alla promozione fino al 30 Arile! Scopri di più
Ogni macchina virtuale ospitata su un cloud provider — AWS, GCP, Azure — ha accesso a un servizio interno chiamato Instance Metadata API, raggiungibile di default all'indirizzo link-local 169.254.169.254. Questo endpoint restituisce a chiunque lo interroghi dall'interno dell'istanza una serie di informazioni operative: nome dell'host, security group, tag di configurazione e, soprattutto, credenziali temporanee associate al ruolo IAM dell'istanza stessa. Il problema è che quel "chiunque" include anche un avversario che abbia ottenuto esecuzione di codice sulla macchina, oppure che riesca a sfruttare una vulnerabilità Server-Side Request Forgery (SSRF) in un'applicazione web esposta.
La tecnica si colloca nella tattica Credential Access (TA0006): l'obiettivo non è la persistenza né il movimento laterale in sé, ma l'estrazione di credenziali valide che aprono la strada a tutto il resto. Un singolo token IAM esfiltrato dal metadata service può garantire accesso a bucket S3, database RDS, funzioni Lambda e altre risorse cloud, trasformando una compromissione locale in un incidente a livello di tenant. La superficie d'attacco è amplissima: qualsiasi istanza con un ruolo IAM associato e senza restrizioni specifiche sull'accesso al metadata endpoint è potenzialmente vulnerabile. I dati MITRE documentano 1 gruppo APT, 2 software e 3 mitigazioni specifiche per questa tecnica.
La simulazione di questa tecnica in laboratorio è sorprendentemente semplice, ed è proprio questa semplicità a renderla pericolosa negli ambienti reali. L'intero attacco si riduce a una richiesta HTTP verso un indirizzo IP fisso, senza necessità di autenticazione.
Su un'istanza AWS EC2 con IMDSv1 attivo, il comando fondamentale per estrarre le credenziali temporanee del ruolo IAM associato è una catena in due passaggi. Prima si identifica il nome del ruolo:
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/
Il servizio restituisce il nome del ruolo. A quel punto si richiede il token completo:
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/NOME-RUOLO
La risposta include AccessKeyId, SecretAccessKey e SessionToken — tutto ciò che serve per autenticarsi via AWS CLI da qualsiasi macchina esterna. Su GCP, l'equivalente richiede un header specifico:
curl -s -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token
Per scenari SSRF, il red teamer può testare un'applicazione web vulnerabile iniettando l'indirizzo del metadata service come URL target in parametri di input che l'applicazione usa per effettuare richieste server-side. Tool come Burp Suite (a pagamento) o OWASP ZAP (open source) permettono di intercettare e manipolare questi parametri con precisione.
Lo strumento Peirates (open source) automatizza l'interrogazione delle metadata API sia su AWS che su GCP in contesti Kubernetes compromessi, ed è specificamente progettato per il pentesting di ambienti containerizzati. All'interno di un pod, Peirates enumera automaticamente i secret disponibili e tenta di estrarre credenziali cloud dal metadata endpoint.
Per simulare lo scenario IMDSv2 — la versione protetta da AWS — serve prima ottenere un token di sessione con una PUT:
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
E poi usarlo nelle richieste successive:
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/
Questa seconda variante è più complessa da sfruttare via SSRF perché richiede una PUT con header personalizzato, cosa che molte vulnerabilità SSRF non consentono. Il red teamer dovrebbe documentare nel report se l'ambiente target usa IMDSv1 o IMDSv2, perché la differenza in termini di rischio è sostanziale.
Scarica la guida gratuita e segui il percorso corretto fin dal primo passo