Amazon S3 é um serviço que permite que você armazenar grandes quantidades de dados.
Amazon S3 fornece múltiplas opções para alcançar a proteção dos dados em repouso. As opções incluem Permissão (Política), Criptografia (Lado do Cliente e do Servidor), Versionamento de Bucket e exclusão baseada em MFA. O usuário pode habilitar qualquer uma dessas opções para alcançar a proteção dos dados. A replicação de dados é uma funcionalidade interna da AWS onde S3 replica automaticamente cada objeto em todas as Zonas de Disponibilidade e a organização não precisa habilitá-la neste caso.
Com permissões baseadas em recursos, você pode definir permissões para subdiretórios do seu bucket separadamente.
Versionamento de Bucket e exclusão baseada em MFA
Quando o versionamento de bucket está habilitado, qualquer ação que tente alterar um arquivo dentro de um arquivo gerará uma nova versão do arquivo, mantendo também o conteúdo anterior do mesmo. Portanto, não sobrescreverá seu conteúdo.
Além disso, a exclusão baseada em MFA impedirá que versões de arquivos no bucket S3 sejam excluídas e também que o Versionamento de Bucket seja desativado, então um atacante não poderá alterar esses arquivos.
Logs de acesso S3
É possível habilitar o login de acesso S3 (que por padrão está desativado) para algum bucket e salvar os logs em um bucket diferente para saber quem está acessando o bucket (ambos os buckets devem estar na mesma região).
URLs Presignadas S3
É possível gerar uma URL presignada que pode ser usada para acessar o arquivo especificado no bucket. Uma URL presignada se parece com isso:
Uma URL pré-assinada pode ser criada a partir da cli usando credenciais de um principal com acesso ao objeto (se a conta que você usa não tiver acesso, uma URL pré-assinada mais curta será criada, mas será inútil)
A única permissão necessária para gerar uma URL pré-assinada é a permissão que está sendo concedida, então para o comando anterior a única permissão necessária pelo principal é s3:GetObject
Também é possível criar URLs pré-assinadas com outras permissões:
DEK significa Chave de Criptografia de Dados e é a chave que é sempre gerada e usada para criptografar dados.
Criptografia do lado do servidor com chaves gerenciadas pelo S3, SSE-S3
Esta opção requer configuração mínima e toda a gestão das chaves de criptografia utilizadas é gerenciada pela AWS. Tudo o que você precisa fazer é fazer o upload dos seus dados e o S3 cuidará de todos os outros aspectos. Cada bucket em uma conta S3 é atribuído a uma chave de bucket.
Criptografia:
Dados do Objeto + DEK em texto simples criado --> Dados criptografados (armazenados dentro do S3)
DEK em texto simples criado + Chave Mestra do S3 --> DEK criptografada (armazenada dentro do S3) e o texto simples é excluído da memória
Descriptografia:
DEK criptografada + Chave Mestra do S3 --> DEK em texto simples
DEK em texto simples + Dados criptografados --> Dados do Objeto
Por favor, note que neste caso a chave é gerenciada pela AWS (rotação apenas a cada 3 anos). Se você usar sua própria chave, poderá rotacionar, desativar e aplicar controle de acesso.
Criptografia do lado do servidor com chaves gerenciadas pelo KMS, SSE-KMS
Este método permite que o S3 use o serviço de gerenciamento de chaves para gerar suas chaves de criptografia de dados. O KMS oferece uma flexibilidade muito maior sobre como suas chaves são gerenciadas. Por exemplo, você pode desativar, rotacionar e aplicar controles de acesso ao CMK, e ordenar contra seu uso usando o AWS Cloud Trail.
Criptografia:
S3 solicita chaves de dados ao KMS CMK
O KMS usa um CMK para gerar o par DEK em texto simples e DEK criptografada e os envia para o S3
O S3 usa a chave em texto simples para criptografar os dados, armazena os dados criptografados e a chave criptografada e exclui da memória a chave em texto simples
Descriptografia:
O S3 solicita ao KMS para descriptografar a chave de dados criptografada do objeto
O KMS descriptografa a chave de dados com o CMK e a envia de volta ao S3
O S3 descriptografa os dados do objeto
Criptografia do lado do servidor com chaves fornecidas pelo cliente, SSE-C
Esta opção oferece a oportunidade de fornecer sua própria chave mestra que você pode já estar usando fora da AWS. Sua chave fornecida pelo cliente seria então enviada com seus dados para o S3, onde o S3 realizaria a criptografia para você.
Criptografia:
O usuário envia os dados do objeto + chave do cliente para o S3
A chave do cliente é usada para criptografar os dados e os dados criptografados são armazenados
um valor HMAC salgado da chave do cliente também é armazenado para validação futura da chave
a chave do cliente é excluída da memória
Descriptografia:
O usuário envia a chave do cliente
A chave é validada contra o valor HMAC armazenado
A chave fornecida pelo cliente é então usada para descriptografar os dados
Criptografia do lado do cliente com KMS, CSE-KMS
De forma semelhante ao SSE-KMS, isso também usa o serviço de gerenciamento de chaves para gerar suas chaves de criptografia de dados. No entanto, desta vez o KMS é chamado pelo cliente, não pelo S3. A criptografia ocorre do lado do cliente e os dados criptografados são enviados ao S3 para serem armazenados.
Criptografia:
O cliente solicita uma chave de dados ao KMS
O KMS retorna o DEK em texto simples e o DEK criptografado com o CMK
Ambas as chaves são enviadas de volta
O cliente então criptografa os dados com o DEK em texto simples e envia ao S3 os dados criptografados + o DEK criptografado (que é salvo como metadados dos dados criptografados dentro do S3)
Descriptografia:
Os dados criptografados com o DEK criptografado são enviados ao cliente
O cliente solicita ao KMS para descriptografar a chave criptografada usando o CMK e o KMS envia de volta o DEK em texto simples
O cliente agora pode descriptografar os dados criptografados
Criptografia do lado do cliente com chaves fornecidas pelo cliente, CSE-C
Usando este mecanismo, você pode utilizar suas próprias chaves fornecidas e usar um cliente AWS-SDK para criptografar seus dados antes de enviá-los ao S3 para armazenamento.
Criptografia:
O cliente gera um DEK e criptografa os dados em texto simples
Em seguida, usando seu próprio CMK personalizado, ele criptografa o DEK
envia os dados criptografados + DEK criptografado para o S3, onde são armazenados
Descriptografia:
O S3 envia os dados criptografados e o DEK
Como o cliente já possui o CMK usado para criptografar o DEK, ele descriptografa o DEK e então usa o DEK em texto simples para descriptografar os dados
Enumeração
Uma das principais maneiras tradicionais de comprometer organizações AWS começa comprometendo buckets publicamente acessíveis. Você pode encontrarenumeradores de buckets públicos nesta 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
Você pode acessar um bucket S3 através de um endpoint de pilha dupla usando um nome de endpoint de estilo hospedado virtual ou de estilo de caminho. Estes são úteis para acessar o S3 através do IPv6.
Os endpoints de pilha dupla usam a seguinte sintaxe:
bucketname.s3.dualstack.aws-region.amazonaws.com
s3.dualstack.aws-region.amazonaws.com/bucketname
Privesc
Na página a seguir, você pode verificar como abusar das permissões do S3 para escalar privilégios:
Acesso Não Autenticado
S3 Pós Exploração
Persistência
Outras vulnerabilidades do S3
Problema de Envenenamento de Cache HTTP do S3
De acordo com esta pesquisa, foi possível armazenar em cache a resposta de um bucket arbitrário como se pertencesse a um diferente. Isso poderia ter sido abusado para alterar, por exemplo, as respostas de arquivos javascript e comprometer páginas arbitrárias usando o S3 para armazenar código estático.
Amazon Athena
Amazon Athena é um serviço de consulta interativa que facilita a análise de dados diretamente no Amazon Simple Storage Service (Amazon S3) usando SQL padrão.
Você precisa preparar uma tabela de banco de dados relacional com o formato do conteúdo que vai aparecer nos buckets S3 monitorados. E então, o Amazon Athena será capaz de popular o banco de dados a partir dos logs, para que você possa consultá-lo.
O Amazon Athena suporta a capacidade de consultar dados do S3 que já estão criptografados e, se configurado para isso, Athena também pode criptografar os resultados da consulta, que podem ser armazenados no S3.
Essa criptografia dos resultados é independente dos dados do S3 consultados, o que significa que mesmo que os dados do S3 não estejam criptografados, os resultados consultados podem ser criptografados. Alguns pontos a serem observados são que o Amazon Athena suporta apenas dados que foram criptografados com os seguintes métodos de criptografia do S3, SSE-S3, SSE-KMS e CSE-KMS.
SSE-C e CSE-E não são suportados. Além disso, é importante entender que o Amazon Athena só executará consultas contra objetos criptografados que estão na mesma região que a própria consulta. Se você precisar consultar dados do S3 que foram criptografados usando KMS, permissões específicas são necessárias pelo usuário do Athena para permitir que eles realizem a consulta.
Enumeração
# 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>