AWS - EC2 Privesc
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Per ulteriori informazioni su EC2 controlla:
iam:PassRole
, ec2:RunInstances
Un attaccante potrebbe creare un'istanza allegando un ruolo IAM e poi accedere all'istanza per rubare le credenziali del ruolo IAM dall'endpoint dei metadati.
Accesso tramite SSH
Esegui una nuova istanza utilizzando una chiave ssh creata (--key-name
) e poi accedi tramite ssh (se vuoi crearne una nuova potresti aver bisogno del permesso ec2:CreateKeyPair
).
Accesso tramite rev shell nei dati utente
Puoi avviare una nuova istanza utilizzando un dati utente (--user-data
) che ti invierà una rev shell. Non è necessario specificare il gruppo di sicurezza in questo modo.
Fai attenzione a GuradDuty se utilizzi le credenziali del ruolo IAM al di fuori dell'istanza:
Impatto Potenziale: Privesc diretto a qualsiasi ruolo EC2 collegato ai profili di istanza esistenti.
Con questo insieme di permessi potresti anche creare un'istanza EC2 e registrarla all'interno di un cluster ECS. In questo modo, i servizi ECS verranno eseguiti all'interno dell'istanza EC2 a cui hai accesso e poi puoi penetrare in quei servizi (contenitori docker) e rubare i loro ruoli ECS allegati.
Per imparare a forzare i servizi ECS a essere eseguiti in questa nuova istanza EC2, controlla:
Se non puoi creare una nuova istanza ma hai il permesso ecs:RegisterContainerInstance
, potresti essere in grado di registrare l'istanza all'interno del cluster e eseguire l'attacco commentato.
Impatto Potenziale: Privesc diretto ai ruoli ECS associati ai task.
iam:PassRole
, iam:AddRoleToInstanceProfile
Simile allo scenario precedente, un attaccante con questi permessi potrebbe cambiare il ruolo IAM di un'istanza compromessa in modo da poter rubare nuove credenziali.
Poiché un profilo di istanza può avere solo 1 ruolo, se il profilo di istanza ha già un ruolo (caso comune), avrai anche bisogno di iam:RemoveRoleFromInstanceProfile
.
Se il profilo dell'istanza ha un ruolo e l'attaccante non può rimuoverlo, c'è un'altra soluzione. Potrebbe trovare un profilo dell'istanza senza un ruolo o crearne uno nuovo (iam:CreateInstanceProfile
), aggiungere il ruolo a quel profilo dell'istanza (come discusso in precedenza) e associare il profilo dell'istanza compromesso a un'istanza compromessa:
Se l'istanza non ha alcun profilo dell'istanza (ec2:AssociateIamInstanceProfile
) *
Impatto Potenziale: Privesc diretto a un diverso ruolo EC2 (è necessario aver compromesso un'istanza AWS EC2 e avere alcuni permessi extra o uno stato specifico del profilo dell'istanza).
iam:PassRole
(( ec2:AssociateIamInstanceProfile
& ec2:DisassociateIamInstanceProfile
) || ec2:ReplaceIamInstanceProfileAssociation
)Con questi permessi è possibile cambiare il profilo dell'istanza associato a un'istanza, quindi se l'attacco ha già accesso a un'istanza, sarà in grado di rubare le credenziali per più ruoli di profilo dell'istanza cambiando quello associato ad essa.
Se ha un profilo dell'istanza, puoi rimuovere il profilo dell'istanza (ec2:DisassociateIamInstanceProfile
) e associarlo *
o sostituire il profilo dell'istanza dell'istanza compromessa (ec2:ReplaceIamInstanceProfileAssociation
). *
Impatto Potenziale: Privesc diretto a un diverso ruolo EC2 (è necessario aver compromesso un'istanza AWS EC2 e avere alcuni permessi extra o uno stato specifico del profilo dell'istanza).
ec2:RequestSpotInstances
,iam:PassRole
Un attaccante con i permessi ec2:RequestSpotInstances
eiam:PassRole
può richiedere un Spot Instance con un ruolo EC2 allegato e una rev shell nei dati utente.
Una volta che l'istanza è in esecuzione, può rubare il ruolo IAM.
ec2:ModifyInstanceAttribute
Un attaccante con ec2:ModifyInstanceAttribute
può modificare gli attributi delle istanze. Tra questi, può cambiare i dati utente, il che implica che può far eseguire dati arbitrari all'istanza. Questo può essere utilizzato per ottenere una rev shell all'istanza EC2.
Nota che gli attributi possono essere modificati solo mentre l'istanza è ferma, quindi le permissive ec2:StopInstances
e ec2:StartInstances
.
Impatto Potenziale: Privesc diretto a qualsiasi ruolo IAM EC2 attaccato a un'istanza creata.
ec2:CreateLaunchTemplateVersion
,ec2:CreateLaunchTemplate
,ec2:ModifyLaunchTemplate
Un attaccante con i permessi ec2:CreateLaunchTemplateVersion
,ec2:CreateLaunchTemplate
e ec2:ModifyLaunchTemplate
può creare una nuova versione del Launch Template con una rev shell in i dati utente e qualsiasi ruolo IAM EC2 su di esso, cambiare la versione predefinita, e qualsiasi gruppo Autoscaler che utilizza quel Launch Template che è configurato per utilizzare la versione più recente o la versione predefinita riavvierà le istanze utilizzando quel template ed eseguirà la rev shell.
Impatto Potenziale: Privesc diretto a un diverso ruolo EC2.
autoscaling:CreateLaunchConfiguration
, autoscaling:CreateAutoScalingGroup
, iam:PassRole
Un attaccante con i permessi autoscaling:CreateLaunchConfiguration
,autoscaling:CreateAutoScalingGroup
,iam:PassRole
può creare una Configurazione di Avvio con un Ruolo IAM e una rev shell all'interno dei dati utente, quindi creare un gruppo di autoscaling da quella configurazione e aspettare che la rev shell rubare il Ruolo IAM.
Impatto Potenziale: Privesc diretto a un diverso ruolo EC2.
!autoscaling
Il set di permessi ec2:CreateLaunchTemplate
e autoscaling:CreateAutoScalingGroup
non è sufficiente per escalare i privilegi a un ruolo IAM perché per allegare il ruolo specificato nella Configurazione di Avvio o nel Modello di Avvio hai bisogno dei permessi iam:PassRole
e ec2:RunInstances
(che è un noto privesc).
ec2-instance-connect:SendSSHPublicKey
Un attaccante con il permesso ec2-instance-connect:SendSSHPublicKey
può aggiungere una chiave ssh a un utente e usarla per accedervi (se ha accesso ssh all'istanza) o per escalare i privilegi.
Impatto Potenziale: Privesc diretto ai ruoli IAM EC2 associati alle istanze in esecuzione.
ec2-instance-connect:SendSerialConsoleSSHPublicKey
Un attaccante con il permesso ec2-instance-connect:SendSerialConsoleSSHPublicKey
può aggiungere una chiave ssh a una connessione seriale. Se la seriale non è abilitata, l'attaccante ha bisogno del permesso ec2:EnableSerialConsoleAccess
per abilitarla.
Per connettersi alla porta seriale è anche necessario conoscere il nome utente e la password di un utente all'interno della macchina.
Questo modo non è molto utile per il privesc poiché è necessario conoscere un nome utente e una password per sfruttarlo.
Impatto Potenziale: (Altamente improbabile) Privesc diretto ai ruoli IAM EC2 associati alle istanze in esecuzione.
describe-launch-templates
,describe-launch-template-versions
Poiché i modelli di avvio hanno versioning, un attaccante con permessi ec2:describe-launch-templates
e ec2:describe-launch-template-versions
potrebbe sfruttarli per scoprire informazioni sensibili, come le credenziali presenti nei dati utente. Per raggiungere questo obiettivo, il seguente script scorre tutte le versioni dei modelli di avvio disponibili:
Nei comandi sopra, anche se stiamo specificando determinati modelli (aws_|password|token|api
), puoi utilizzare una regex diversa per cercare altri tipi di informazioni sensibili.
Assumendo di trovare aws_access_key_id
e aws_secret_access_key
, possiamo utilizzare queste credenziali per autenticarsi su AWS.
Impatto Potenziale: Escalation diretta dei privilegi agli utenti IAM.
Impara e pratica Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)