AWS - S3, Athena & Glacier Enum

Support HackTricks

S3

Amazon S3 é um serviço que permite que você armazenar grandes quantidades de dados.

Amazon S3 fornece várias 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 nesse 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 tentar 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, de modo que um atacante não poderá alterar esses arquivos.

Logs de acesso do S3

É possível habilitar o login de acesso do 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 do 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:

https://<bucket-name>.s3.us-east-1.amazonaws.com/asd.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAUUE8GZC4S5L3TY3P%2F20230227%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230227T142551Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjELf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJHMEUCIBhQpdETJO3HKKDk2hjNIrPWwBE8gZaQccZFV3kCpPCWAiEAid3ueDtFFU%2FOQfUpvxYTGO%2BHoS4SWDMUrQAE0pIaB40qggMIYBAAGgwzMTgxNDIxMzg1NTMiDJLI5t7gr2EGxG1Y5CrfAioW0foHIQ074y4gvk0c%2B%2Fmqc7cNWb1njQslQkeePHkseJ3owzc%2FCwkgE0EuZTd4mw0aJciA2XIbJRCLPWTb%2FCBKPnIMJ5aBzIiA2ltsiUNQTTUxYmEgXZoJ6rFYgcodnmWW0Et4Xw59UlHnCDB2bLImxPprriyCzDDCD6nLyp3J8pFF1S8h3ZTJE7XguA8joMs4%2B2B1%2FeOZfuxXKyXPYSKQOOSbQiHUQc%2BFnOfwxleRL16prWk1t7TamvHR%2Bt3UgMn5QWzB3p8FgWwpJ6GjHLkYMJZ379tkimL1tJ7o%2BIod%2FMYrS7LDCifP9d%2FuYOhKWGhaakPuJKJh9fl%2B0vGl7kmApXigROxEWon6ms75laXebltsWwKcKuYca%2BUWu4jVJx%2BWUfI4ofoaGiCSaKALTqwu4QNBRT%2BMoK6h%2BQa7gN7JFGg322lkxRY53x27WMbUE4unn5EmI54T4dWt1%2Bg8ljDS%2BvKfBjqmAWRwuqyfwXa5YC3xxttOr3YVvR6%2BaXpzWtvNJQNnb6v0uI3%2BTtTexZkJpLQYqFcgZLQSxsXWSnf988qvASCIUhAzp2UnS1uqy7QjtD5T73zksYN2aesll7rvB80qIuujG6NOdHnRJ2M5%2FKXXNo1Yd15MtzPuSjRoSB9RSMon5jFu31OrQnA9eCUoawxbB0nHqwK8a43CKBZHhA8RoUAJW%2B48EuFsp3U%3D&X-Amz-Signature=3436e4139e84dbcf5e2e6086c0ebc92f4e1e9332b6fda24697bc339acbf2cdfa

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)

aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'

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:

import boto3
url = boto3.client('s3').generate_presigned_url(
ClientMethod='put_object',
Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
ExpiresIn=3600
)

Mecanismos de Criptografia do S3

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 criptografado (armazenado dentro do S3) e o texto simples é excluído da memória

  • Descriptografia:

  • DEK criptografado + 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 criptografado 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

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 encontrar enumeradores de buckets públicos nesta página.

# Get buckets ACLs
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api get-object-acl --bucket <bucket-name> --key flag

# Get policy
aws s3api get-bucket-policy --bucket <bucket-name>
aws s3api get-bucket-policy-status --bucket <bucket-name> #if it's public

# list S3 buckets associated with a profile
aws s3 ls
aws s3api list-buckets

# list content of bucket (no creds)
aws s3 ls s3://bucket-name --no-sign-request
aws s3 ls s3://bucket-name --recursive

# list content of bucket (with creds)
aws s3 ls s3://bucket-name
aws s3api list-objects-v2 --bucket <bucket-name>
aws s3api list-objects --bucket <bucket-name>
aws s3api list-object-versions --bucket <bucket-name>

# copy local folder to S3
aws s3 cp MyFolder s3://bucket-name --recursive

# delete
aws s3 rb s3://bucket-name –-force

# download a whole S3 bucket
aws s3 sync s3://<bucket>/ .

# move S3 bucket to different location
aws s3 sync s3://oldbucket s3://newbucket --source-region us-west-1

# list the sizes of an S3 bucket and its contents
aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"

# Update Bucket policy
aws s3api put-bucket-policy --policy file:///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 ACL
aws s3api get-bucket-acl --bucket <bucket-name> # Way 1 to get the ACL
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.json

aws s3api get-object-acl --bucket <bucket-name> --key flag #Way 2 to get the ACL
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

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.

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 de resultados é independente dos dados S3 consultados, o que significa que mesmo que os dados 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 catalogs
aws athena list-data-catalogs

# Get databases inside catalog
aws athena list-databases --catalog-name <catalog-name>
aws athena list-table-metadata --catalog-name <catalog-name> --database-name <db-name>

# Get query executions, queries and results
aws athena list-query-executions
aws athena get-query-execution --query-execution-id <id> # Get query and meta of results
aws athena get-query-results --query-execution-id <id> # This will rerun the query and get the results

# Get workgroups & Prepared statements
aws athena list-work-groups
aws athena list-prepared-statements --work-group <wg-name>
aws athena get-prepared-statement --statement-name <name> --work-group <wg-name>

# Run query
aws athena start-query-execution --query-string <query>

Referências

Suporte ao HackTricks

Last updated