Amazon S3 es un servicio que te permite almacenar grandes cantidades de datos.
Amazon S3 proporciona múltiples opciones para lograr la protección de datos en reposo. Las opciones incluyen Permisos (Política), Cifrado (Lado del Cliente y del Servidor), Versionado de Bucket y eliminación basada en MFA. El usuario puede habilitar cualquiera de estas opciones para lograr la protección de datos. La replicación de datos es una función interna de AWS donde S3 replica automáticamente cada objeto en todas las Zonas de Disponibilidad y la organización no necesita habilitarla en este caso.
Con permisos basados en recursos, puedes definir permisos para subdirectorios de tu bucket por separado.
Versionado de Bucket y eliminación basada en MFA
Cuando el versionado de bucket está habilitado, cualquier acción que intente alterar un archivo dentro de un archivo generará una nueva versión del archivo, manteniendo también el contenido anterior del mismo. Por lo tanto, no sobrescribirá su contenido.
Además, la eliminación basada en MFA evitará que las versiones de archivo en el bucket S3 sean eliminadas y también que el Versionado de Bucket sea deshabilitado, por lo que un atacante no podrá alterar estos archivos.
Registros de acceso S3
Es posible habilitar el registro de acceso S3 (que por defecto está deshabilitado) para algún bucket y guardar los registros en un bucket diferente para saber quién está accediendo al bucket (ambos buckets deben estar en la misma región).
URLs prefirmadas S3
Es posible generar una URL prefirmada que generalmente se puede usar para acceder al archivo especificado en el bucket. Una URL prefirmada se ve así:
Una URL prefirmada puede ser creada desde la cli utilizando credenciales de un principal con acceso al objeto (si la cuenta que usas no tiene acceso, se creará una URL prefirmada más corta pero será inútil)
El único permiso requerido para generar una URL firmada es el permiso que se está otorgando, por lo que para el comando anterior el único permiso necesario por el principal es s3:GetObject
También es posible crear URLs firmadas con otros permisos:
DEK significa Clave de Cifrado de Datos y es la clave que siempre se genera y se utiliza para cifrar datos.
Cifrado del lado del servidor con claves gestionadas por S3, SSE-S3
Esta opción requiere una configuración mínima y toda la gestión de las claves de cifrado utilizadas es gestionada por AWS. Todo lo que necesitas hacer es subir tus datos y S3 se encargará de todos los demás aspectos. A cada bucket en una cuenta de S3 se le asigna una clave de bucket.
Cifrado:
Datos del objeto + DEK en texto plano creado --> Datos cifrados (almacenados dentro de S3)
DEK en texto plano creado + Clave Maestra de S3 --> DEK cifrado (almacenado dentro de S3) y el texto plano se elimina de la memoria
Descifrado:
DEK cifrado + Clave Maestra de S3 --> DEK en texto plano
DEK en texto plano + Datos cifrados --> Datos del objeto
Por favor, ten en cuenta que en este caso la clave es gestionada por AWS (rotación solo cada 3 años). Si usas tu propia clave, podrás rotar, deshabilitar y aplicar control de acceso.
Cifrado del lado del servidor con claves gestionadas por KMS, SSE-KMS
Este método permite a S3 utilizar el servicio de gestión de claves para generar tus claves de cifrado de datos. KMS te ofrece una flexibilidad mucho mayor en cómo se gestionan tus claves. Por ejemplo, puedes deshabilitar, rotar y aplicar controles de acceso al CMK, y ordenar en contra de su uso utilizando AWS Cloud Trail.
Cifrado:
S3 solicita claves de datos a KMS CMK
KMS utiliza un CMK para generar el par DEK en texto plano y DEK cifrado y los envía a S3
S3 utiliza la clave en texto plano para cifrar los datos, almacena los datos cifrados y la clave cifrada y elimina de la memoria la clave en texto plano
Descifrado:
S3 solicita a KMS que descifre la clave de datos cifrada del objeto
KMS descifra la clave de datos con el CMK y la envía de vuelta a S3
S3 descifra los datos del objeto
Cifrado del lado del servidor con claves proporcionadas por el cliente, SSE-C
Esta opción te da la oportunidad de proporcionar tu propia clave maestra que ya puedes estar utilizando fuera de AWS. Tu clave proporcionada por el cliente se enviaría con tus datos a S3, donde S3 realizaría el cifrado por ti.
Cifrado:
El usuario envía los datos del objeto + clave del cliente a S3
La clave del cliente se utiliza para cifrar los datos y los datos cifrados se almacenan
también se almacena un valor HMAC salado de la clave del cliente para futuras validaciones de clave
la clave del cliente se elimina de la memoria
Descifrado:
El usuario envía la clave del cliente
La clave se valida contra el valor HMAC almacenado
La clave proporcionada por el cliente se utiliza para descifrar los datos
Cifrado del lado del cliente con KMS, CSE-KMS
De manera similar a SSE-KMS, este también utiliza el servicio de gestión de claves para generar tus claves de cifrado de datos. Sin embargo, esta vez KMS se invoca a través del cliente, no de S3. El cifrado se realiza del lado del cliente y los datos cifrados se envían a S3 para ser almacenados.
Cifrado:
El cliente solicita una clave de datos a KMS
KMS devuelve el DEK en texto plano y el DEK cifrado con el CMK
Ambas claves se envían de vuelta
El cliente luego cifra los datos con el DEK en texto plano y envía a S3 los datos cifrados + el DEK cifrado (que se guarda como metadatos de los datos cifrados dentro de S3)
Descifrado:
Los datos cifrados con el DEK cifrado se envían al cliente
El cliente solicita a KMS que descifre la clave cifrada utilizando el CMK y KMS envía de vuelta el DEK en texto plano
El cliente ahora puede descifrar los datos cifrados
Cifrado del lado del cliente con claves proporcionadas por el cliente, CSE-C
Usando este mecanismo, puedes utilizar tus propias claves proporcionadas y usar un cliente AWS-SDK para cifrar tus datos antes de enviarlos a S3 para su almacenamiento.
Cifrado:
El cliente genera un DEK y cifra los datos en texto plano
Luego, utilizando su propio CMK personalizado, cifra el DEK
envía los datos cifrados + DEK cifrado a S3 donde se almacenan
Descifrado:
S3 envía los datos cifrados y el DEK
Como el cliente ya tiene el CMK utilizado para cifrar el DEK, descifra el DEK y luego utiliza el DEK en texto plano para descifrar los datos
Enumeración
Una de las principales formas tradicionales de comprometer organizaciones de AWS comienza por comprometer buckets accesibles públicamente. Puedes encontrarenumeradores de buckets públicos en esta página.
# Get buckets ACLsawss3apiget-bucket-acl--bucket<bucket-name>awss3apiget-object-acl--bucket<bucket-name>--keyflag# Get policyawss3apiget-bucket-policy--bucket<bucket-name>awss3apiget-bucket-policy-status--bucket<bucket-name>#if it's public# list S3 buckets associated with a profileawss3lsawss3apilist-buckets# list content of bucket (no creds)awss3lss3://bucket-name--no-sign-requestawss3lss3://bucket-name--recursive# list content of bucket (with creds)awss3lss3://bucket-nameawss3apilist-objects-v2--bucket<bucket-name>awss3apilist-objects--bucket<bucket-name>awss3apilist-object-versions--bucket<bucket-name># copy local folder to S3awss3cpMyFolders3://bucket-name--recursive# deleteawss3rbs3://bucket-name–-force# download a whole S3 bucketawss3syncs3://<bucket>/.# move S3 bucket to different locationawss3syncs3://oldbuckets3://newbucket--source-regionus-west-1# list the sizes of an S3 bucket and its contentsawss3apilist-objects--bucketBUCKETNAME--outputjson--query"[sum(Contents[].Size), length(Contents[])]"# Update Bucket policyawss3apiput-bucket-policy--policyfile:///root/policy.json--bucket<bucket-name>##JSON policy example{"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":"*"}]}# Update bucket ACLawss3apiget-bucket-acl--bucket<bucket-name># Way 1 to get the ACLawss3apiput-bucket-acl--bucket<bucket-name>--access-control-policyfile://acl.jsonawss3apiget-object-acl--bucket<bucket-name>--keyflag#Way 2 to get the ACLawss3apiput-object-acl--bucket<bucket-name>--keyflag--access-control-policyfile://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
dual-stack
Puedes acceder a un bucket de S3 a través de un endpoint de doble pila utilizando un nombre de endpoint de estilo hospedado virtual o de estilo de ruta. Estos son útiles para acceder a S3 a través de IPv6.
Los endpoints de doble pila utilizan la siguiente sintaxis:
bucketname.s3.dualstack.aws-region.amazonaws.com
s3.dualstack.aws-region.amazonaws.com/bucketname
Privesc
En la siguiente página puedes consultar cómo abusar de los permisos de S3 para escalar privilegios:
Acceso no autenticado
S3 Post Explotación
Persistencia
Otras vulnerabilidades de S3
Problema de envenenamiento de caché HTTP de S3
Según esta investigación fue posible almacenar en caché la respuesta de un bucket arbitrario como si perteneciera a uno diferente. Esto podría haberse abusado para cambiar, por ejemplo, las respuestas de archivos javascript y comprometer páginas arbitrarias utilizando S3 para almacenar código estático.
Amazon Athena
Amazon Athena es un servicio de consulta interactivo que facilita analizar datos directamente en Amazon Simple Storage Service (Amazon S3) usando SQL estándar.
Necesitas preparar una tabla de base de datos relacional con el formato del contenido que va a aparecer en los buckets de S3 monitoreados. Y luego, Amazon Athena podrá poblar la base de datos a partir de los registros, para que puedas consultarla.
Amazon Athena admite la capacidad de consultar datos de S3 que ya están cifrados y, si se configura para hacerlo, Athena también puede cifrar los resultados de la consulta que luego pueden ser almacenados en S3.
Este cifrado de resultados es independiente de los datos de S3 consultados subyacentes, lo que significa que incluso si los datos de S3 no están cifrados, los resultados consultados pueden estar cifrados. Un par de puntos a tener en cuenta es que Amazon Athena solo admite datos que han sido cifrados con los siguientes métodos de cifrado de S3, SSE-S3, SSE-KMS y CSE-KMS.
SSE-C y CSE-E no son compatibles. Además de esto, es importante entender que Amazon Athena solo ejecutará consultas contra objetos cifrados que están en la misma región que la consulta misma. Si necesitas consultar datos de S3 que han sido cifrados utilizando KMS, entonces se requieren permisos específicos por parte del usuario de Athena para permitirles realizar la consulta.
Enumeración
# Get catalogsawsathenalist-data-catalogs# Get databases inside catalogawsathenalist-databases--catalog-name<catalog-name>awsathenalist-table-metadata--catalog-name<catalog-name>--database-name<db-name># Get query executions, queries and resultsawsathenalist-query-executionsawsathenaget-query-execution--query-execution-id<id># Get query and meta of resultsawsathenaget-query-results--query-execution-id<id># This will rerun the query and get the results# Get workgroups & Prepared statementsawsathenalist-work-groupsawsathenalist-prepared-statements--work-group<wg-name>awsathenaget-prepared-statement--statement-name<name>--work-group<wg-name># Run queryawsathenastart-query-execution--query-string<query>