# AWS - MSK Enum {{#include ../../../banners/hacktricks-training.md}} ## Amazon MSK **Amazon Managed Streaming for Apache Kafka (Amazon MSK)** es un servicio completamente gestionado que facilita el desarrollo y la ejecución de aplicaciones que procesan datos en streaming a través de **Apache Kafka**. Las operaciones del plano de control, incluyendo la creación, actualización y eliminación de **clusters**, son ofrecidas por Amazon MSK. El servicio permite la utilización de operaciones del plano de datos de Apache Kafka, abarcando la producción y consumo de datos. Funciona con **versiones de código abierto de Apache Kafka**, asegurando la compatibilidad con aplicaciones, herramientas y complementos existentes tanto de socios como de la **comunidad de Apache Kafka**, eliminando la necesidad de alteraciones en el código de la aplicación. En términos de fiabilidad, Amazon MSK está diseñado para **detectar y recuperarse automáticamente de escenarios comunes de fallos en clusters**, asegurando que las aplicaciones de productores y consumidores continúen con sus actividades de escritura y lectura de datos con mínima interrupción. Además, busca optimizar los procesos de replicación de datos al intentar **reutilizar el almacenamiento de brokers reemplazados**, minimizando así el volumen de datos que necesita ser replicado por Apache Kafka. ### **Tipos** Hay 2 tipos de clusters de Kafka que AWS permite crear: Provisionados y Sin Servidor. Desde el punto de vista de un atacante, necesitas saber que: - **Sin Servidor no puede ser público directamente** (solo puede ejecutarse en una VPN sin ninguna IP expuesta públicamente). Sin embargo, **Provisionado** puede configurarse para obtener una **IP pública** (por defecto no lo tiene) y configurar el **grupo de seguridad** para **exponer** los puertos relevantes. - **Sin Servidor** **solo soporta IAM** como método de autenticación. **Provisionado** soporta autenticación SASL/SCRAM (**contraseña**), autenticación **IAM**, autenticación de AWS **Certificate** Manager (ACM) y acceso **No Autenticado**. - Ten en cuenta que no es posible exponer públicamente un Kafka Provisionado si el acceso no autenticado está habilitado. ### Enumeración ```bash #Get clusters aws kafka list-clusters aws kafka list-clusters-v2 # Check the supported authentication aws kafka list-clusters | jq -r ".ClusterInfoList[].ClientAuthentication" # Get Zookeeper endpoints aws kafka list-clusters | jq -r ".ClusterInfoList[].ZookeeperConnectString, .ClusterInfoList[].ZookeeperConnectStringTls" # Get nodes and node enspoints aws kafka kafka list-nodes --cluster-arn aws kafka kafka list-nodes --cluster-arn | jq -r ".NodeInfoList[].BrokerNodeInfo.Endpoints" # Get endpoints # Get used kafka configs aws kafka list-configurations #Get Kafka config file aws kafka describe-configuration --arn # Get version of config aws kafka describe-configuration-revision --arn --revision # Get content of config version # If using SCRAN authentication, get used AWS secret name (not secret value) aws kafka list-scram-secrets --cluster-arn ``` ### Acceso IAM a Kafka (en serverless) ```bash # Guide from https://docs.aws.amazon.com/msk/latest/developerguide/create-serverless-cluster.html # Download Kafka wget https://archive.apache.org/dist/kafka/2.8.1/kafka_2.12-2.8.1.tgz tar -xzf kafka_2.12-2.8.1.tgz # In kafka_2.12-2.8.1/libs download the MSK IAM JAR file. cd kafka_2.12-2.8.1/libs wget https://github.com/aws/aws-msk-iam-auth/releases/download/v1.1.1/aws-msk-iam-auth-1.1.1-all.jar # Create file client.properties in kafka_2.12-2.8.1/bin security.protocol=SASL_SSL sasl.mechanism=AWS_MSK_IAM sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required; sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler # Export endpoints address export BS=boot-ok2ngypz.c2.kafka-serverless.us-east-1.amazonaws.com:9098 ## Make sure you will be able to access the port 9098 from the EC2 instance (check VPS, subnets and SG) # Create a topic called msk-serverless-tutorial kafka_2.12-2.8.1/bin/kafka-topics.sh --bootstrap-server $BS --command-config client.properties --create --topic msk-serverless-tutorial --partitions 6 # Send message of every new line kafka_2.12-2.8.1/bin/kafka-console-producer.sh --broker-list $BS --producer.config client.properties --topic msk-serverless-tutorial # Read messages kafka_2.12-2.8.1/bin/kafka-console-consumer.sh --bootstrap-server $BS --consumer.config client.properties --topic msk-serverless-tutorial --from-beginning ``` ### Privesc {{#ref}} ../aws-privilege-escalation/aws-msk-privesc/README.md {{#endref}} ### Acceso No Autenticado {{#ref}} ../aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum/README.md {{#endref}} ### Persistencia Si vas a **tener acceso a la VPC** donde se encuentra un Kafka Provisionado, podrías **habilitar acceso no autorizado**, si **la autenticación SASL/SCRAM**, **leer** la contraseña del secreto, otorgar algunos **permisos IAM a otro usuario controlado** (si se usa IAM o sin servidor) o persistir con **certificados**. ## Referencias - [https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html](https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html) {{#include ../../../banners/hacktricks-training.md}}