# AWS - MSK Enum

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

## Amazon MSK

**Amazon Managed Streaming for Apache Kafka (Amazon MSK)** est un service entièrement géré, facilitant le développement et l'exécution d'applications traitant des données en streaming via **Apache Kafka**. Les opérations de contrôle, y compris la création, la mise à jour et la suppression de **clusters**, sont proposées par Amazon MSK. Le service permet l'utilisation des opérations de **data-plane** d'Apache Kafka, englobant la production et la consommation de données. Il fonctionne sur des **versions open-source d'Apache Kafka**, garantissant la compatibilité avec les applications, outils et plugins existants provenant à la fois des partenaires et de la **communauté Apache Kafka**, éliminant ainsi le besoin de modifications dans le code de l'application.

En termes de fiabilité, Amazon MSK est conçu pour **détecter et récupérer automatiquement des scénarios de défaillance de cluster courants**, garantissant que les applications productrices et consommatrices continuent leurs activités d'écriture et de lecture de données avec un minimum de perturbations. De plus, il vise à optimiser les processus de réplication des données en tentant de **réutiliser le stockage des brokers remplacés**, minimisant ainsi le volume de données qui doit être répliqué par Apache Kafka.

### **Types**

Il existe 2 types de clusters Kafka que AWS permet de créer : Provisionné et Sans serveur.

Du point de vue d'un attaquant, vous devez savoir que :

- **Sans serveur ne peut pas être directement public** (il ne peut fonctionner que dans un VPN sans aucune IP exposée publiquement). Cependant, **Provisionné** peut être configuré pour obtenir une **IP publique** (par défaut, ce n'est pas le cas) et configurer le **groupe de sécurité** pour **exposer** les ports pertinents.
- **Sans serveur** **ne prend en charge que IAM** comme méthode d'authentification. **Provisionné** prend en charge l'authentification SASL/SCRAM (**mot de passe**), l'authentification **IAM**, l'authentification AWS **Certificate** Manager (ACM) et l'accès **non authentifié**.
- Notez qu'il n'est pas possible d'exposer publiquement un Kafka Provisionné si l'accès non authentifié est activé.

### Enumeration
```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>
```
### Accès IAM 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.md
{{#endref}}

### Accès non authentifié

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

### Persistance

Si vous allez **avoir accès au VPC** où se trouve un Kafka Provisionné, vous pourriez **activer un accès non autorisé**, si **l'authentification SASL/SCRAM**, **lire** le mot de passe à partir du secret, donner des **permissions IAM à un autre utilisateur contrôlé** (si IAM ou sans serveur utilisé) ou persister avec **des certificats**.

## Références

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