Kubernetes Network Attacks

Attaques réseau Kubernetes

Soutenez HackTricks et bénéficiez d'avantages !

Introduction

Kubernetes connecte par défaut tous les conteneurs s'exécutant sur le même nœud (même s'ils appartiennent à des espaces de noms différents) jusqu'au niveau 2 (Ethernet). Cela permet à un conteneur malveillant d'effectuer une attaque d'usurpation ARP sur les conteneurs du même nœud et de capturer leur trafic.

Dans le scénario, 4 machines vont être créées :

  • ubuntu-pe : machine privilégiée pour s'échapper vers le nœud et vérifier les métriques (pas nécessaire pour l'attaque)

  • ubuntu-attack : conteneur malveillant dans l'espace de noms par défaut

  • ubuntu-victim : machine victime dans l'espace de noms kube-system

  • mysql : machine victime dans l'espace de noms par défaut

echo 'apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-pe
spec:
  containers:
  - image: ubuntu
    command:
      - "sleep"
      - "360000" 
    imagePullPolicy: IfNotPresent
    name: ubuntu-pe
    securityContext:
      allowPrivilegeEscalation: true
      privileged: true
      runAsUser: 0 
    volumeMounts:
    - mountPath: /host
      name: host-volume
  restartPolicy: Never 
  hostIPC: true 
  hostNetwork: true 
  hostPID: true 
  volumes:
  - name: host-volume
    hostPath:
      path: /
---
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-attack
  labels:
    app: ubuntu
spec:
  containers:
  - image: ubuntu
    command:
      - "sleep"
      - "360000" 
    imagePullPolicy: IfNotPresent
    name: ubuntu-attack
  restartPolicy: Never
---
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-victim
  namespace: kube-system
spec:
  containers:
  - image: ubuntu
    command:
      - "sleep"
      - "360000" 
    imagePullPolicy: IfNotPresent
    name: ubuntu-victim
  restartPolicy: Never
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql
spec:
  containers:
  - image: mysql:5.6
    ports:
      - containerPort: 3306
    imagePullPolicy: IfNotPresent
    name: mysql
    env:
      - name: MYSQL_ROOT_PASSWORD
        value: mysql
  restartPolicy: Never' | kubectl apply -f -
kubectl exec -it ubuntu-attack -- bash -c "apt update; apt install -y net-tools python3-pip python3 ngrep nano dnsutils; pip3 install scapy; bash"
kubectl exec -it ubuntu-victim -n kube-system -- bash -c "apt update; apt install -y net-tools curl netcat mysql-client; bash"
kubectl exec -it mysql bash -- bash -c "apt update; apt install -y net-tools; bash"

Réseau de base Kubernetes

Si vous souhaitez plus de détails sur les sujets de mise en réseau introduits ici, consultez les références.

ARP

En général, la mise en réseau pod-à-pod à l'intérieur du nœud est disponible via un pont qui connecte tous les pods. Ce pont est appelé "cbr0". (Certains plugins réseau installeront leur propre pont.) Le cbr0 peut également gérer la résolution ARP (Address Resolution Protocol). Lorsqu'un paquet entrant arrive à cbr0, il peut résoudre l'adresse MAC de destination à l'aide d'ARP.

Ce fait implique que, par défaut, chaque pod s'exécutant sur le même nœud va être en mesure de communiquer avec n'importe quel autre pod sur le même nœud (indépendamment de l'espace de noms) au niveau Ethernet (couche 2).

Par conséquent, il

Dans la machine Ubuntu

dig google.com [...] ;; SECTION DE RÉPONSE: google.com. 1 IN A 1.1.1.1


<div data-gb-custom-block data-tag="hint" data-style='info'>

Si vous essayez de créer votre propre script de détournement de DNS, si vous **modifiez simplement la réponse DNS**, cela ne va **pas fonctionner**, car la **réponse** aura une **adresse IP source** l'adresse IP du **pod malveillant** et ne sera **pas acceptée**.\
Vous devez générer un **nouveau paquet DNS** avec l'**adresse IP source** du **DNS** où la victime envoie la demande DNS (qui ressemble à 172.16.0.2, pas 10.96.0.10, c'est l'adresse IP du service DNS K8s et non l'adresse IP du serveur DNS, plus d'informations à ce sujet dans l'introduction).

</div>

## Capture de trafic

L'outil [**Mizu**](https://github.com/up9inc/mizu) est un visualiseur de trafic API simple mais puissant pour Kubernetes qui vous permet de **visualiser toutes les communications API** entre les microservices pour vous aider à déboguer et à résoudre les régressions.\
Il installera des agents dans les pods sélectionnés, recueillera leurs informations de trafic et vous les montrera dans un serveur web. Cependant, vous aurez besoin de permissions K8s élevées pour cela (et ce n'est pas très discret).

## Références

* [https://www.cyberark.com/resources/threat-research-blog/attacking-kubernetes-clusters-through-your-network-plumbing-part-1](https://www.cyberark.com/resources/threat-research-blog/attacking-kubernetes-clusters-through-your-network-plumbing-part-1)
* [https://blog.aquasec.com/dns-spoofing-kubernetes-clusters](https://blog.aquasec.com/dns-spoofing-kubernetes-clusters)

<details>

<summary><strong>Soutenez HackTricks et obtenez des avantages !</strong></summary>

* Si vous voulez voir votre **entreprise annoncée dans HackTricks** ou si vous voulez accéder à la **dernière version de PEASS ou télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
* **Rejoignez** 💬 [**le groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm).
* **Partagez vos astuces de piratage en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.

</details>

Dernière mise à jour