mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-29 22:20:33 -08:00
Translated ['src/pentesting-ci-cd/cloudflare-security/cloudflare-domains
This commit is contained in:
@@ -13,13 +13,13 @@
|
||||
Um zu versuchen, aus den Pods zu entkommen, müssen Sie möglicherweise zuerst **Berechtigungen eskalieren**, einige Techniken dafür:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/linux-hardening/privilege-escalation
|
||||
https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/index.html
|
||||
{{#endref}}
|
||||
|
||||
Sie können diese **Docker-Ausbrüche überprüfen, um zu versuchen, aus einem Pod zu entkommen, den Sie kompromittiert haben:**
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.xyz/linux-hardening/privilege-escalation/docker-breakout
|
||||
https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/index.html
|
||||
{{#endref}}
|
||||
|
||||
### Missbrauch von Kubernetes-Berechtigungen
|
||||
@@ -30,7 +30,7 @@ Wie im Abschnitt über **Kubernetes-Enumeration** erklärt:
|
||||
kubernetes-enumeration.md
|
||||
{{#endref}}
|
||||
|
||||
In der Regel werden die Pods mit einem **Service-Account-Token** innerhalb von ihnen ausgeführt. Dieser Service-Account kann einige **Berechtigungen haben**, die Sie **missbrauchen** könnten, um zu anderen Pods zu **wechseln** oder sogar zu den Knoten, die im Cluster konfiguriert sind, zu **entkommen**. Überprüfen Sie, wie in:
|
||||
In der Regel werden die Pods mit einem **Service-Account-Token** innerhalb von ihnen ausgeführt. Dieser Service-Account kann einige **Berechtigungen haben**, die Sie **ausnutzen** können, um zu anderen Pods zu **wechseln** oder sogar zu den Knoten, die im Cluster konfiguriert sind, zu **entkommen**. Überprüfen Sie, wie in:
|
||||
|
||||
{{#ref}}
|
||||
abusing-roles-clusterroles-in-kubernetes/
|
||||
@@ -42,7 +42,7 @@ Wenn der Pod in einer **Cloud-Umgebung** ausgeführt wird, könnten Sie in der L
|
||||
|
||||
## Suche nach anfälligen Netzwerkdiensten
|
||||
|
||||
Da Sie sich in der Kubernetes-Umgebung befinden, sollten Sie, wenn Sie die Berechtigungen nicht durch den Missbrauch der aktuellen Pod-Berechtigungen eskalieren können und nicht aus dem Container entkommen können, **potenziell anfällige Dienste suchen.**
|
||||
Da Sie sich in der Kubernetes-Umgebung befinden, sollten Sie, wenn Sie die Berechtigungen der aktuellen Pods nicht ausnutzen und nicht aus dem Container entkommen können, **nach potenziell anfälligen Diensten suchen.**
|
||||
|
||||
### Dienste
|
||||
|
||||
@@ -73,7 +73,7 @@ nmap-kube ${SERVER_RANGES} "${LOCAL_RANGE}"
|
||||
}
|
||||
nmap-kube-discover
|
||||
```
|
||||
Überprüfen Sie die folgende Seite, um zu erfahren, wie Sie **Kubernetes-spezifische Dienste angreifen** können, um **andere Pods/die gesamte Umgebung zu kompromittieren**:
|
||||
Überprüfen Sie die folgende Seite, um zu erfahren, wie Sie **Kubernetes-spezifische Dienste** **angreifen** können, um **andere Pods/die gesamte Umgebung zu kompromittieren**:
|
||||
|
||||
{{#ref}}
|
||||
pentesting-kubernetes-services/
|
||||
@@ -94,7 +94,7 @@ kubernetes-network-attacks.md
|
||||
|
||||
## Node DoS
|
||||
|
||||
Es gibt keine Spezifikation von Ressourcen in den Kubernetes-Manifests und **keine angewendeten Limit**-Bereiche für die Container. Als Angreifer können wir **alle Ressourcen verbrauchen, in denen der Pod/Deployment läuft**, und andere Ressourcen aushungern und einen DoS für die Umgebung verursachen.
|
||||
Es gibt keine Spezifikation von Ressourcen in den Kubernetes-Manifests und **keine angewendeten Limit**-Bereiche für die Container. Als Angreifer können wir **alle Ressourcen verbrauchen, in denen der Pod/Deployment läuft** und andere Ressourcen aushungern und einen DoS für die Umgebung verursachen.
|
||||
|
||||
Dies kann mit einem Tool wie [**stress-ng**](https://zoomadmin.com/HowToInstall/UbuntuPackage/stress-ng) durchgeführt werden:
|
||||
```
|
||||
@@ -106,10 +106,10 @@ kubectl --namespace big-monolith top pod hunger-check-deployment-xxxxxxxxxx-xxxx
|
||||
```
|
||||
## Node Post-Exploitation
|
||||
|
||||
Wenn Sie es geschafft haben, **aus dem Container zu entkommen**, gibt es einige interessante Dinge, die Sie im Knoten finden werden:
|
||||
Wenn Sie es geschafft haben, **aus dem Container zu entkommen**, gibt es einige interessante Dinge, die Sie im Node finden werden:
|
||||
|
||||
- Der **Container Runtime** Prozess (Docker)
|
||||
- Weitere **Pods/Container**, die im Knoten laufen und die Sie wie diesen missbrauchen können (mehr Tokens)
|
||||
- Weitere **Pods/Container**, die im Node laufen und die Sie wie diesen missbrauchen können (mehr Tokens)
|
||||
- Das gesamte **Dateisystem** und das **Betriebssystem** im Allgemeinen
|
||||
- Der **Kube-Proxy** Dienst, der lauscht
|
||||
- Der **Kubelet** Dienst, der lauscht. Überprüfen Sie die Konfigurationsdateien:
|
||||
@@ -119,7 +119,7 @@ Wenn Sie es geschafft haben, **aus dem Container zu entkommen**, gibt es einige
|
||||
- `/var/lib/kubelet/config.yaml`
|
||||
- `/var/lib/kubelet/kubeadm-flags.env`
|
||||
- `/etc/kubernetes/kubelet-kubeconfig`
|
||||
- Weitere **kubernetes gemeinsame Dateien**:
|
||||
- Weitere **kubernetes gängige Dateien**:
|
||||
- `$HOME/.kube/config` - **Benutzerkonfiguration**
|
||||
- `/etc/kubernetes/kubelet.conf` - **Reguläre Konfiguration**
|
||||
- `/etc/kubernetes/bootstrap-kubelet.conf` - **Bootstrap-Konfiguration**
|
||||
@@ -154,14 +154,14 @@ echo ""
|
||||
fi
|
||||
done
|
||||
```
|
||||
Das Skript [**can-they.sh**](https://github.com/BishopFox/badPods/blob/main/scripts/can-they.sh) wird automatisch **die Tokens anderer Pods abrufen und überprüfen, ob sie die Berechtigung** haben, nach der Sie suchen (anstatt dass Sie 1 nach dem anderen suchen):
|
||||
Das Skript [**can-they.sh**](https://github.com/BishopFox/badPods/blob/main/scripts/can-they.sh) wird automatisch **die Tokens anderer Pods abrufen und überprüfen, ob sie die Berechtigung** haben, nach der Sie suchen (anstatt dass Sie 1 für 1 suchen):
|
||||
```bash
|
||||
./can-they.sh -i "--list -n default"
|
||||
./can-they.sh -i "list secrets -n kube-system"// Some code
|
||||
```
|
||||
### Privileged DaemonSets
|
||||
|
||||
Ein DaemonSet ist ein **pod**, der in **allen Knoten des Clusters** **ausgeführt** wird. Daher, wenn ein DaemonSet mit einem **privilegierten Dienstkonto** konfiguriert ist, wirst du in **ALLEN Knoten** das **Token** dieses **privilegierten Dienstkontos** finden, das du ausnutzen könntest.
|
||||
Ein DaemonSet ist ein **pod**, der in **allen Knoten des Clusters** **ausgeführt** wird. Daher, wenn ein DaemonSet mit einem **privilegierten Dienstkonto** konfiguriert ist, wirst du in **ALLEN Knoten** das **Token** dieses **privilegierten Dienstkontos** finden, das du missbrauchen könntest.
|
||||
|
||||
Der Exploit ist derselbe wie im vorherigen Abschnitt, aber du bist jetzt nicht auf Glück angewiesen.
|
||||
|
||||
@@ -175,7 +175,7 @@ kubernetes-pivoting-to-clouds.md
|
||||
|
||||
### Steal etcd
|
||||
|
||||
Wenn du den [**nodeName**](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/#create-a-pod-that-gets-scheduled-to-specific-node) des Knotens angeben kannst, der den Container ausführen wird, erhalte eine Shell innerhalb eines Control-Plane-Knotens und hole die **etcd-Datenbank**:
|
||||
Wenn du den [**nodeName**](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/#create-a-pod-that-gets-scheduled-to-specific-node) des Knotens angeben kannst, der den Container ausführen wird, erhalte eine Shell in einem Control-Plane-Knoten und hole die **etcd-Datenbank**:
|
||||
```
|
||||
kubectl get nodes
|
||||
NAME STATUS ROLES AGE VERSION
|
||||
@@ -186,15 +186,15 @@ control-plane-Knoten haben die **Rolle Master** und in **cloud-managed Clustern
|
||||
|
||||
#### Geheimnisse aus etcd lesen 1
|
||||
|
||||
Wenn Sie Ihren Pod auf einem control-plane-Knoten mit dem `nodeName`-Selektor in der Pod-Spezifikation ausführen können, haben Sie möglicherweise einfachen Zugriff auf die `etcd`-Datenbank, die alle Konfigurationen für den Cluster enthält, einschließlich aller Geheimnisse.
|
||||
Wenn Sie Ihren Pod auf einem Control-Plane-Knoten mit dem `nodeName`-Selektor in der Pod-Spezifikation ausführen können, haben Sie möglicherweise einfachen Zugriff auf die `etcd`-Datenbank, die alle Konfigurationen für den Cluster, einschließlich aller Geheimnisse, enthält.
|
||||
|
||||
Unten finden Sie eine schnelle und einfache Möglichkeit, Geheimnisse aus `etcd` zu extrahieren, wenn es auf dem control-plane-Knoten läuft, auf dem Sie sich befinden. Wenn Sie eine elegantere Lösung wünschen, die einen Pod mit dem `etcd`-Client-Utility `etcdctl` startet und die Anmeldeinformationen des control-plane-Knotens verwendet, um sich mit etcd zu verbinden, wo auch immer es läuft, schauen Sie sich [dieses Beispiel-Manifest](https://github.com/mauilion/blackhat-2019/blob/master/etcd-attack/etcdclient.yaml) von @mauilion an.
|
||||
Unten finden Sie eine schnelle und schmutzige Möglichkeit, Geheimnisse aus `etcd` zu extrahieren, wenn es auf dem Control-Plane-Knoten läuft, auf dem Sie sich befinden. Wenn Sie eine elegantere Lösung wünschen, die einen Pod mit dem `etcd`-Client-Utility `etcdctl` startet und die Anmeldeinformationen des Control-Plane-Knotens verwendet, um sich mit etcd zu verbinden, wo auch immer es läuft, schauen Sie sich [dieses Beispiel-Manifest](https://github.com/mauilion/blackhat-2019/blob/master/etcd-attack/etcdclient.yaml) von @mauilion an.
|
||||
|
||||
**Überprüfen Sie, ob `etcd` auf dem control-plane-Knoten läuft und wo sich die Datenbank befindet (Dies ist in einem `kubeadm`-erstellten Cluster)**
|
||||
**Überprüfen Sie, ob `etcd` auf dem Control-Plane-Knoten läuft und wo sich die Datenbank befindet (Dies ist in einem `kubeadm`-erstellten Cluster)**
|
||||
```
|
||||
root@k8s-control-plane:/var/lib/etcd/member/wal# ps -ef | grep etcd | sed s/\-\-/\\n/g | grep data-dir
|
||||
```
|
||||
Bitte geben Sie den zu übersetzenden Text an.
|
||||
Please provide the text you would like me to translate.
|
||||
```bash
|
||||
data-dir=/var/lib/etcd
|
||||
```
|
||||
@@ -206,11 +206,11 @@ strings /var/lib/etcd/member/snap/db | less
|
||||
```bash
|
||||
db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciOiJ`; do name=`echo "$db" | grep $x -B40 | grep registry`; echo $name \| $x; echo; done
|
||||
```
|
||||
**Dasselbe Kommando, aber einige Greps, um nur das Standard-Token im kube-system-Namespace zurückzugeben**
|
||||
**Der gleiche Befehl, aber einige Greps, um nur das Standard-Token im kube-system-Namespace zurückzugeben**
|
||||
```bash
|
||||
db=`strings /var/lib/etcd/member/snap/db`; for x in `echo "$db" | grep eyJhbGciOiJ`; do name=`echo "$db" | grep $x -B40 | grep registry`; echo $name \| $x; echo; done | grep kube-system | grep default
|
||||
```
|
||||
Bitte geben Sie den zu übersetzenden Text an.
|
||||
Please provide the text you would like me to translate.
|
||||
```
|
||||
1/registry/secrets/kube-system/default-token-d82kb | eyJhbGciOiJSUzI1NiIsImtpZCI6IkplRTc0X2ZP[REDACTED]
|
||||
```
|
||||
@@ -222,12 +222,12 @@ Bitte geben Sie den zu übersetzenden Text an.
|
||||
```bash
|
||||
mkdir -p restore ; etcdutl snapshot restore etcd-loot-backup.db \ --data-dir ./restore
|
||||
```
|
||||
4. Start **`etcd`** auf deinem lokalen Rechner und lasse es den gestohlenen Snapshot verwenden:
|
||||
4. Start **`etcd`** auf Ihrem lokalen Rechner und lassen Sie es den gestohlenen Snapshot verwenden:
|
||||
```bash
|
||||
etcd \ --data-dir=./restore \ --initial-cluster=state=existing \ --snapshot='./etcd-loot-backup.db'
|
||||
|
||||
```
|
||||
5. Liste alle Geheimnisse auf:
|
||||
5. Liste alle Geheimnisse:
|
||||
```bash
|
||||
etcdctl get "" --prefix --keys-only | grep secret
|
||||
```
|
||||
@@ -235,13 +235,13 @@ etcdctl get "" --prefix --keys-only | grep secret
|
||||
```bash
|
||||
etcdctl get /registry/secrets/default/my-secret
|
||||
```
|
||||
### Statische/Mirrored Pods Persistenz
|
||||
### Statische/Gespiegelte Pods Persistenz
|
||||
|
||||
_Statische Pods_ werden direkt vom kubelet-Daemon auf einem bestimmten Knoten verwaltet, ohne dass der API-Server sie beobachtet. Im Gegensatz zu Pods, die vom Control Plane verwaltet werden (zum Beispiel ein Deployment); stattdessen **überwacht der kubelet jeden statischen Pod** (und startet ihn neu, wenn er fehlschlägt).
|
||||
_Statische Pods_ werden direkt vom kubelet-Daemon auf einem bestimmten Knoten verwaltet, ohne dass der API-Server sie beobachtet. Im Gegensatz zu Pods, die vom Control Plane verwaltet werden (zum Beispiel ein Deployment); stattdessen **beobachtet der kubelet jeden statischen Pod** (und startet ihn neu, wenn er fehlschlägt).
|
||||
|
||||
Daher sind statische Pods immer **an einen Kubelet** auf einem bestimmten Knoten gebunden.
|
||||
|
||||
Der **kubelet versucht automatisch, einen Mirror-Pod auf dem Kubernetes-API-Server** für jeden statischen Pod zu erstellen. Das bedeutet, dass die Pods, die auf einem Knoten ausgeführt werden, auf dem API-Server sichtbar sind, aber von dort aus nicht gesteuert werden können. Die Pod-Namen werden mit dem Hostnamen des Knotens und einem vorangestellten Bindestrich versehen.
|
||||
Der **kubelet versucht automatisch, einen Spiegel-Pod auf dem Kubernetes API-Server** für jeden statischen Pod zu erstellen. Das bedeutet, dass die Pods, die auf einem Knoten ausgeführt werden, auf dem API-Server sichtbar sind, aber von dort aus nicht gesteuert werden können. Die Pod-Namen werden mit dem Hostnamen des Knotens und einem vorangestellten Bindestrich versehen.
|
||||
|
||||
> [!CAUTION]
|
||||
> Die **`spec` eines statischen Pods kann nicht auf andere API-Objekte** verweisen (z. B. ServiceAccount, ConfigMap, Secret usw.). Daher **kannst du dieses Verhalten nicht ausnutzen, um einen Pod mit einem beliebigen ServiceAccount** im aktuellen Knoten zu starten, um den Cluster zu kompromittieren. Aber du könntest dies nutzen, um Pods in verschiedenen Namespaces auszuführen (falls das aus irgendeinem Grund nützlich ist).
|
||||
@@ -250,7 +250,7 @@ Wenn du dich im Knotenhost befindest, kannst du ihn dazu bringen, einen **statis
|
||||
|
||||
Um einen statischen Pod zu erstellen, sind die [**Dokumente eine große Hilfe**](https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/). Du benötigst im Grunde 2 Dinge:
|
||||
|
||||
- Konfiguriere den Parameter **`--pod-manifest-path=/etc/kubernetes/manifests`** im **kubelet-Dienst** oder in der **kubelet-Konfiguration** ([**staticPodPath**](https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration)) und starte den Dienst neu
|
||||
- Konfiguriere den Parameter **`--pod-manifest-path=/etc/kubernetes/manifests`** im **kubelet-Dienst** oder in der **kubelet-Konfiguration** ([**staticPodPath**](https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/index.html#kubelet-config-k8s-io-v1beta1-KubeletConfiguration)) und starte den Dienst neu
|
||||
- Erstelle die Definition in der **Pod-Definition** in **`/etc/kubernetes/manifests`**
|
||||
|
||||
**Eine andere, stealthy Methode wäre:**
|
||||
@@ -286,7 +286,7 @@ type: Directory
|
||||
### Pods löschen + nicht planbare Knoten
|
||||
|
||||
Wenn ein Angreifer **einen Knoten kompromittiert hat** und er **Pods von anderen Knoten löschen** und **andere Knoten daran hindern kann, Pods auszuführen**, werden die Pods im kompromittierten Knoten neu gestartet und er wird in der Lage sein, die **Tokens**, die darin ausgeführt werden, zu **stehlen**.\
|
||||
Für [**weitere Informationen folgen Sie diesen Links**](abusing-roles-clusterroles-in-kubernetes/#delete-pods-+-unschedulable-nodes).
|
||||
Für [**weitere Informationen folgen Sie diesen Links**](abusing-roles-clusterroles-in-kubernetes/index.html#delete-pods-+-unschedulable-nodes).
|
||||
|
||||
## Automatische Werkzeuge
|
||||
|
||||
|
||||
Reference in New Issue
Block a user