AWS - S3, Athena & Glacier Enum

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

S3

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

O Amazon S3 oferece várias opções para alcançar a proteção de 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 de dados. A replicação de dados é uma facilidade interna da AWS, onde o 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 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, para que um invasor não consiga alterar esses arquivos.

Logs de acesso ao S3

É possível habilitar o registro de acesso ao 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 pré-assinadas do S3

É possível gerar uma URL pré-assinada que geralmente pode ser usada para acessar o arquivo especificado no bucket. Uma URL pré-assinada 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

Um URL pré-assinado pode ser criado a partir da linha de comando usando credenciais de um principal com acesso ao objeto (se a conta que você usar não tiver acesso, um URL pré-assinado mais curto será criado, 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 assinada é a permissão sendo concedida, então para o comando anterior a única permissão necessária pelo principal é s3:GetObject

Também é possível criar URLs 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 uma configuração mínima e toda a gestão das chaves de criptografia usadas é feita 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 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 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 na forma como suas chaves são gerenciadas. Por exemplo, você pode desativar, rotacionar e aplicar controles de acesso ao CMK e monitorar 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, armazenar 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 para o S3

  • O S3 descriptografa os dados do objeto

Criptografia do lado do servidor com chaves fornecidas pelo cliente, SSE-C

Esta opção lhe dá 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 então 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 em relação ao valor HMAC armazenado

  • A chave fornecida pelo cliente é então usada para descriptografar os dados

Criptografia do lado do cliente com KMS, CSE-KMS

Similarmente 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 e não pelo S3. A criptografia então ocorre do lado do cliente e os dados criptografados são enviados ao S3 para serem armazenados.

  • Criptografia:

  • 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 pede 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 para o 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

endpoints de dupla pilha

Você pode acessar um bucket S3 por meio de um endpoint de dupla pilha usando um nome de endpoint de estilo hospedado virtual ou de estilo de caminho. Esses são úteis para acessar o S3 por meio do IPv6.

Os endpoints de dupla pilha usam a seguinte sintaxe:

  • bucketname.s3.dualstack.aws-region.amazonaws.com

  • s3.dualstack.aws-region.amazonaws.com/bucketname

Escalada de Privilégios

Na página a seguir, você pode verificar como abusar das permissões do S3 para escalar privilégios:

pageAWS - S3 Privesc

Acesso não autenticado

pageAWS - S3 Unauthenticated Enum

Pós-Exploração do S3

pageAWS - S3 Post Exploitation

Persistência

pageAWS - S3 Persistence

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 outro. Isso poderia ter sido abusado para alterar, por exemplo, 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. Em seguida, o Amazon Athena poderá 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, o Athena também pode criptografar os resultados da consulta que podem então ser armazenados no S3.

Essa criptografia de 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 em objetos criptografados que estão na mesma região que a consulta em si. Se você precisar consultar dados do S3 que foram criptografados usando o KMS, então 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

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Última actualización