AWS - EC2 Privesc
EC2
Para más información sobre EC2 consulta:
AWS - EC2, EBS, ELB, SSM, VPC & VPN Enumiam:PassRole
, ec2:RunInstances
iam:PassRole
, ec2:RunInstances
Un atacante podría crear una instancia adjuntando un rol IAM y luego acceder a la instancia para robar las credenciales del rol IAM desde el punto final de metadatos.
Acceso vía SSH
Ejecuta una nueva instancia usando una clave ssh creada (--key-name
) y luego accede a ella por ssh (si deseas crear una nueva, es posible que necesites tener el permiso ec2:CreateKeyPair
).
Acceso a través de rev shell en datos de usuario
Puedes ejecutar una nueva instancia utilizando un datos de usuario (--user-data
) que te enviará un rev shell. No necesitas especificar el grupo de seguridad de esta manera.
Ten cuidado con GuardDuty si usas las credenciales del rol IAM fuera de la instancia:
AWS - GuardDuty EnumImpacto Potencial: Privesc directo a cualquier rol EC2 adjunto a perfiles de instancia existentes.
Privesc a ECS
Con este conjunto de permisos también podrías crear una instancia EC2 y registrarla dentro de un clúster ECS. De esta manera, los servicios de ECS se ejecutarán dentro de la instancia EC2 a la que tienes acceso y luego podrás penetrar esos servicios (contenedores docker) y robar sus roles ECS adjuntos.
Para aprender a forzar que los servicios de ECS se ejecuten en esta nueva instancia de EC2, consulta:
AWS - ECS PrivescSi no puedes crear una nueva instancia pero tienes el permiso ecs:RegisterContainerInstance
, podrías registrar la instancia dentro del clúster y realizar el ataque comentado.
Impacto Potencial: Privesc directo a los roles de ECS adjuntos a las tareas.
iam:PassRole
, iam:AddRoleToInstanceProfile
iam:PassRole
, iam:AddRoleToInstanceProfile
Similar al escenario anterior, un atacante con estos permisos podría cambiar el rol de IAM de una instancia comprometida para poder robar nuevas credenciales.
Como un perfil de instancia solo puede tener 1 rol, si el perfil de instancia ya tiene un rol (caso común), también necesitarás iam:RemoveRoleFromInstanceProfile
.
Si el perfil de instancia tiene un rol y el atacante no puede eliminarlo, hay otra solución alternativa. Podría encontrar un perfil de instancia sin un rol o crear uno nuevo (iam:CreateInstanceProfile
), agregar el rol a ese perfil de instancia (como se discutió anteriormente) y asociar el perfil de instancia comprometido a una instancia comprometida:
Si la instancia no tiene ningún perfil de instancia (
ec2:AssociateIamInstanceProfile
) *
Impacto Potencial: Privesc directo a un rol EC2 diferente (necesitas haber comprometido una instancia AWS EC2 y tener algunos permisos adicionales o un estado específico del perfil de instancia).
iam:PassRole
(( ec2:AssociateIamInstanceProfile
& ec2:DisassociateIamInstanceProfile
) || ec2:ReplaceIamInstanceProfileAssociation
)
iam:PassRole
(( ec2:AssociateIamInstanceProfile
& ec2:DisassociateIamInstanceProfile
) || ec2:ReplaceIamInstanceProfileAssociation
)Con estos permisos es posible cambiar el perfil de instancia asociado a una instancia, por lo que si el ataque ya tenía acceso a una instancia, podrá robar credenciales para más roles de perfil de instancia cambiando el asociado a ella.
Si tiene un perfil de instancia, puedes eliminar el perfil de instancia (
ec2:DisassociateIamInstanceProfile
) y asociarlo *
o reemplazar el perfil de instancia de la instancia comprometida (
ec2:ReplaceIamInstanceProfileAssociation
). *
Impacto Potencial: Privesc directo a un rol EC2 diferente (necesitas haber comprometido una instancia AWS EC2 y algunos permisos adicionales o un estado específico del perfil de instancia).
ec2:RequestSpotInstances
,iam:PassRole
ec2:RequestSpotInstances
,iam:PassRole
Un atacante con los permisos ec2:RequestSpotInstances
yiam:PassRole
puede solicitar una Instancia Spot con un Rol EC2 adjunto y un rev shell en los datos del usuario.
Una vez que la instancia se ejecute, puede robar el rol IAM.
ec2:ModifyInstanceAttribute
ec2:ModifyInstanceAttribute
Un atacante con el ec2:ModifyInstanceAttribute
puede modificar los atributos de las instancias. Entre ellos, puede cambiar los datos del usuario, lo que implica que puede hacer que la instancia ejecute datos arbitrarios. Esto se puede utilizar para obtener un rev shell a la instancia EC2.
Tenga en cuenta que los atributos solo se pueden modificar mientras la instancia está detenida, por lo que los permisos ec2:StopInstances
y ec2:StartInstances
.
Impacto Potencial: Privesc directo a cualquier Rol IAM de EC2 adjunto a una instancia creada.
ec2:CreateLaunchTemplateVersion
,ec2:CreateLaunchTemplate
,ec2:ModifyLaunchTemplate
ec2:CreateLaunchTemplateVersion
,ec2:CreateLaunchTemplate
,ec2:ModifyLaunchTemplate
Un atacante con los permisos ec2:CreateLaunchTemplateVersion
,ec2:CreateLaunchTemplate
y ec2:ModifyLaunchTemplate
puede crear una nueva versión de Plantilla de Lanzamiento con un rev shell en los datos del usuario y cualquier Rol IAM de EC2 en él, cambiar la versión predeterminada, y cualquier grupo de Autoscaler usando esa Plantilla de Lanzamiento que está configurada para usar la última o la versión predeterminada volverá a ejecutar las instancias usando esa plantilla y ejecutará el rev shell.
Impacto Potencial: Privesc directo a un rol EC2 diferente.
autoscaling:CreateLaunchConfiguration
, autoscaling:CreateAutoScalingGroup
, iam:PassRole
autoscaling:CreateLaunchConfiguration
, autoscaling:CreateAutoScalingGroup
, iam:PassRole
Un atacante con los permisos autoscaling:CreateLaunchConfiguration
,autoscaling:CreateAutoScalingGroup
,iam:PassRole
puede crear una Configuración de Lanzamiento con un Rol IAM y un rev shell dentro de los datos del usuario, luego crear un grupo de escalado automático a partir de esa configuración y esperar a que el rev shell robe el Rol IAM.
Impacto Potencial: Privesc directo a un rol EC2 diferente.
!autoscaling
!autoscaling
El conjunto de permisos ec2:CreateLaunchTemplate
y autoscaling:CreateAutoScalingGroup
no son suficientes para escalar privilegios a un rol IAM porque para adjuntar el rol especificado en la Configuración de Lanzamiento o en la Plantilla de Lanzamiento necesitas los permisos iam:PassRole
y ec2:RunInstances
(lo cual es un privesc conocido).
ec2-instance-connect:SendSSHPublicKey
ec2-instance-connect:SendSSHPublicKey
Un atacante con el permiso ec2-instance-connect:SendSSHPublicKey
puede agregar una clave ssh a un usuario y usarla para acceder (si tiene acceso ssh a la instancia) o para escalar privilegios.
Impacto Potencial: Privesc directo a los roles IAM de EC2 adjuntos a las instancias en ejecución.
ec2-instance-connect:SendSerialConsoleSSHPublicKey
ec2-instance-connect:SendSerialConsoleSSHPublicKey
Un atacante con el permiso ec2-instance-connect:SendSerialConsoleSSHPublicKey
puede agregar una clave ssh a una conexión serial. Si la serial no está habilitada, el atacante necesita el permiso ec2:EnableSerialConsoleAccess
para habilitarla.
Para conectarse al puerto serial también necesita conocer el nombre de usuario y la contraseña de un usuario dentro de la máquina.
Este método no es muy útil para privesc ya que necesitas conocer un nombre de usuario y una contraseña para explotarlo.
Impacto Potencial: (Altamente improbable) Privesc directo a los roles de IAM de EC2 adjuntos a las instancias en ejecución.
describe-launch-templates
,describe-launch-template-versions
describe-launch-templates
,describe-launch-template-versions
Dado que las plantillas de lanzamiento tienen versionado, un atacante con permisos de ec2:describe-launch-templates
y ec2:describe-launch-template-versions
podría explotarlas para descubrir información sensible, como credenciales presentes en los datos del usuario. Para lograr esto, el siguiente script recorre todas las versiones de las plantillas de lanzamiento disponibles:
En los comandos anteriores, aunque estamos especificando ciertos patrones (aws_|password|token|api
), puedes usar una expresión regular diferente para buscar otros tipos de información sensible.
Suponiendo que encontramos aws_access_key_id
y aws_secret_access_key
, podemos usar estas credenciales para autenticar en AWS.
Impacto Potencial: Escalación de privilegios directa a usuario(s) de IAM.
Referencias
Last updated