# AWS - MSK Enum

{{#include ../../../banners/hacktricks-training.md}}

## Amazon MSK

**Amazon Managed Streaming for Apache Kafka (Amazon MSK)** è un servizio completamente gestito, che facilita lo sviluppo e l'esecuzione di applicazioni che elaborano dati in streaming tramite **Apache Kafka**. Le operazioni del piano di controllo, inclusa la creazione, l'aggiornamento e la cancellazione di **cluster**, sono offerte da Amazon MSK. Il servizio consente l'utilizzo delle operazioni del piano dati di Apache Kafka, comprendenti la produzione e il consumo di dati. Funziona su **versioni open-source di Apache Kafka**, garantendo compatibilità con applicazioni, strumenti e plugin esistenti sia da parte dei partner che della **comunità Apache Kafka**, eliminando la necessità di modifiche nel codice dell'applicazione.

In termini di affidabilità, Amazon MSK è progettato per **rilevare automaticamente e recuperare da scenari di guasto del cluster prevalenti**, garantendo che le applicazioni di produttori e consumatori continuino le loro attività di scrittura e lettura dei dati con minime interruzioni. Inoltre, mira a ottimizzare i processi di replicazione dei dati cercando di **riutilizzare lo storage dei broker sostituiti**, riducendo così il volume di dati che devono essere replicati da Apache Kafka.

### **Tipi**

Ci sono 2 tipi di cluster Kafka che AWS consente di creare: Provisioned e Serverless.

Dal punto di vista di un attaccante, è necessario sapere che:

- **Serverless non può essere direttamente pubblico** (può funzionare solo in una VPN senza alcun IP esposto pubblicamente). Tuttavia, **Provisioned** può essere configurato per ottenere un **IP pubblico** (di default non lo fa) e configurare il **gruppo di sicurezza** per **esporre** le porte rilevanti.
- **Serverless** **supporta solo IAM** come metodo di autenticazione. **Provisioned** supporta l'autenticazione SASL/SCRAM (**password**), l'autenticazione **IAM**, l'autenticazione AWS **Certificate** Manager (ACM) e l'accesso **non autenticato**.
- Si noti che non è possibile esporre pubblicamente un Kafka Provisioned se l'accesso non autenticato è abilitato.

### Enumerazione
```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 <cluster-arn>
aws kafka kafka list-nodes --cluster-arn <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 <config-arn> # Get version of config
aws kafka describe-configuration-revision --arn <config-arn> --revision <version> # Get content of config version

# If using SCRAN authentication, get used AWS secret name (not secret value)
aws kafka list-scram-secrets --cluster-arn <cluster-arn>
```
### Accesso IAM Kafka (in 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}}

### Accesso non autenticato

{{#ref}}
../aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum/README.md
{{#endref}}

### Persistenza

Se hai **accesso alla VPC** dove si trova un Kafka Provisioned, potresti **abilitare l'accesso non autorizzato**, se l'**autenticazione SASL/SCRAM**, **leggere** la password dal segreto, dare alcune **altre autorizzazioni IAM a un utente controllato** (se si utilizza IAM o serverless) o persistere con **certificati**.

## Riferimenti

- [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}}
