mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-31 15:05:44 -08:00
Translated ['.github/pull_request_template.md', 'src/README.md', 'src/pe
This commit is contained in:
@@ -4,11 +4,11 @@
|
||||
|
||||
Kubernetes utilise plusieurs **services réseau spécifiques** que vous pourriez trouver **exposés à Internet** ou dans un **réseau interne une fois que vous avez compromis un pod**.
|
||||
|
||||
## Finding exposed pods with OSINT
|
||||
## Trouver des pods exposés avec OSINT
|
||||
|
||||
Une façon pourrait être de rechercher `Identity LIKE "k8s.%.com"` dans [crt.sh](https://crt.sh) pour trouver des sous-domaines liés à kubernetes. Une autre façon pourrait être de rechercher `"k8s.%.com"` sur github et de chercher des **fichiers YAML** contenant la chaîne.
|
||||
|
||||
## How Kubernetes Exposes Services
|
||||
## Comment Kubernetes expose des services
|
||||
|
||||
Il pourrait être utile pour vous de comprendre comment Kubernetes peut **exposer des services publiquement** afin de les trouver :
|
||||
|
||||
@@ -16,7 +16,7 @@ Il pourrait être utile pour vous de comprendre comment Kubernetes peut **expose
|
||||
../exposing-services-in-kubernetes.md
|
||||
{{#endref}}
|
||||
|
||||
## Finding Exposed pods via port scanning
|
||||
## Trouver des pods exposés via le scan de ports
|
||||
|
||||
Les ports suivants pourraient être ouverts dans un cluster Kubernetes :
|
||||
|
||||
@@ -27,13 +27,13 @@ Les ports suivants pourraient être ouverts dans un cluster Kubernetes :
|
||||
| 6666/TCP | etcd | etcd |
|
||||
| 4194/TCP | cAdvisor | Métriques de conteneur |
|
||||
| 6443/TCP | kube-apiserver | Port API Kubernetes |
|
||||
| 8443/TCP | kube-apiserver | Port API Minikube |
|
||||
| 8080/TCP | kube-apiserver | Port API non sécurisé |
|
||||
| 10250/TCP | kubelet | API HTTPS qui permet un accès en mode complet |
|
||||
| 8443/TCP | kube-apiserver | Port API Minikube |
|
||||
| 8080/TCP | kube-apiserver | Port API non sécurisé |
|
||||
| 10250/TCP | kubelet | API HTTPS qui permet un accès en mode complet |
|
||||
| 10255/TCP | kubelet | Port HTTP en lecture seule non authentifié : pods, pods en cours d'exécution et état des nœuds |
|
||||
| 10256/TCP | kube-proxy | Serveur de vérification de l'état de Kube Proxy |
|
||||
| 9099/TCP | calico-felix | Serveur de vérification de l'état pour Calico |
|
||||
| 6782-4/TCP | weave | Métriques et points de terminaison |
|
||||
| 10256/TCP | kube-proxy | Serveur de vérification de santé Kube Proxy |
|
||||
| 9099/TCP | calico-felix | Serveur de vérification de santé pour Calico |
|
||||
| 6782-4/TCP | weave | Métriques et points de terminaison |
|
||||
| 30000-32767/TCP | NodePort | Proxy vers les services |
|
||||
| 44134/TCP | Tiller | Service Helm à l'écoute |
|
||||
|
||||
@@ -43,7 +43,7 @@ nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-678
|
||||
```
|
||||
### Kube-apiserver
|
||||
|
||||
Ceci est le **service API Kubernetes** avec lequel les administrateurs communiquent généralement en utilisant l'outil **`kubectl`**.
|
||||
C'est le **service API Kubernetes** avec lequel les administrateurs communiquent généralement en utilisant l'outil **`kubectl`**.
|
||||
|
||||
**Ports communs : 6443 et 443**, mais aussi 8443 dans minikube et 8080 comme non sécurisé.
|
||||
```bash
|
||||
@@ -51,7 +51,7 @@ curl -k https://<IP Address>:(8|6)443/swaggerapi
|
||||
curl -k https://<IP Address>:(8|6)443/healthz
|
||||
curl -k https://<IP Address>:(8|6)443/api/v1
|
||||
```
|
||||
**Vérifiez la page suivante pour apprendre comment obtenir des données sensibles et effectuer des actions sensibles en parlant à ce service :**
|
||||
**Vérifiez la page suivante pour apprendre comment obtenir des données sensibles et effectuer des actions sensibles en communiquant avec ce service :**
|
||||
|
||||
{{#ref}}
|
||||
../kubernetes-enumeration.md
|
||||
@@ -98,7 +98,7 @@ Vous pourriez abuser de ce service pour élever les privilèges à l'intérieur
|
||||
|
||||
### cAdvisor
|
||||
|
||||
Service utile pour rassembler des métriques.
|
||||
Service utile pour recueillir des métriques.
|
||||
```bash
|
||||
curl -k https://<IP Address>:4194
|
||||
```
|
||||
@@ -108,25 +108,25 @@ Lorsqu'un port est exposé sur tous les nœuds via un **NodePort**, le même por
|
||||
```bash
|
||||
sudo nmap -sS -p 30000-32767 <IP>
|
||||
```
|
||||
## Vulnerable Misconfigurations
|
||||
## Configurations vulnérables
|
||||
|
||||
### Kube-apiserver Accès Anonyme
|
||||
### Accès anonyme à Kube-apiserver
|
||||
|
||||
L'accès anonyme aux **endpoints API kube-apiserver n'est pas autorisé**. Mais vous pouvez vérifier certains endpoints :
|
||||
L'accès anonyme aux **points de terminaison de l'API kube-apiserver n'est pas autorisé**. Mais vous pouvez vérifier certains points de terminaison :
|
||||
|
||||

|
||||
|
||||
### **Vérification de l'Accès Anonyme ETCD**
|
||||
### **Vérification de l'accès anonyme à ETCD**
|
||||
|
||||
L'ETCD stocke les secrets du cluster, les fichiers de configuration et d'autres **données sensibles**. Par **défaut**, l'ETCD **ne peut pas** être accessible **anonymement**, mais il est toujours bon de vérifier.
|
||||
|
||||
Si l'ETCD peut être accessible anonymement, vous devrez peut-être **utiliser le** [**etcdctl**](https://github.com/etcd-io/etcd/blob/master/etcdctl/READMEv2.md) **outil**. La commande suivante récupérera toutes les clés stockées :
|
||||
Si l'ETCD peut être accessible anonymement, vous devrez peut-être **utiliser** l'outil [**etcdctl**](https://github.com/etcd-io/etcd/blob/master/etcdctl/READMEv2.md). La commande suivante récupérera toutes les clés stockées :
|
||||
```bash
|
||||
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only
|
||||
```
|
||||
### **Kubelet RCE**
|
||||
|
||||
La [**documentation de Kubelet**](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) explique qu'**en par défaut, l'accès anonyme** au service est **autorisé :**
|
||||
La [**documentation de Kubelet**](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/) explique qu'en **default, l'accès anonyme** au service est **autorisé :**
|
||||
|
||||
> Permet les requêtes anonymes au serveur Kubelet. Les requêtes qui ne sont pas rejetées par une autre méthode d'authentification sont traitées comme des requêtes anonymes. Les requêtes anonymes ont un nom d'utilisateur de `system:anonymous`, et un nom de groupe de `system:unauthenticated`
|
||||
|
||||
@@ -169,7 +169,7 @@ kubeletctl exec [command]
|
||||
|
||||
### **Vérification de l'exposition des informations du Kubelet (Port en lecture seule)**
|
||||
|
||||
Lorsqu'un **port en lecture seule du kubelet** est exposé, il devient possible pour des parties non autorisées de récupérer des informations de l'API. L'exposition de ce port peut conduire à la divulgation de divers **éléments de configuration du cluster**. Bien que les informations, y compris **les noms des pods, les emplacements des fichiers internes et d'autres configurations**, ne soient pas critiques, leur exposition pose tout de même un risque pour la sécurité et doit être évitée.
|
||||
Lorsqu'un **port en lecture seule du kubelet** est exposé, il devient possible pour des parties non autorisées de récupérer des informations de l'API. L'exposition de ce port peut conduire à la divulgation de divers **éléments de configuration du cluster**. Bien que les informations, y compris **les noms des pods, les emplacements des fichiers internes et d'autres configurations**, ne soient pas critiques, leur exposition pose néanmoins un risque pour la sécurité et doit être évitée.
|
||||
|
||||
Un exemple de la façon dont cette vulnérabilité peut être exploitée implique un attaquant distant accédant à une URL spécifique. En naviguant vers `http://<external-IP>:10255/pods`, l'attaquant peut potentiellement récupérer des informations sensibles du kubelet :
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
|
||||
## Kubelet Authentication <a href="#kubelet-authentication" id="kubelet-authentication"></a>
|
||||
|
||||
[**D'après la documentation :**](https://kubernetes.io/docs/reference/access-authn-authz/kubelet-authn-authz/)
|
||||
[**Depuis la documentation :**](https://kubernetes.io/docs/reference/access-authn-authz/kubelet-authn-authz/)
|
||||
|
||||
Par défaut, les requêtes vers le point de terminaison HTTPS du kubelet qui ne sont pas rejetées par d'autres méthodes d'authentification configurées sont traitées comme des requêtes anonymes, et se voient attribuer un **nom d'utilisateur de `system:anonymous`** et un **groupe de `system:unauthenticated`**.
|
||||
Par défaut, les requêtes vers le point de terminaison HTTPS du kubelet qui ne sont pas rejetées par d'autres méthodes d'authentification configurées sont traitées comme des requêtes anonymes, et reçoivent un **nom d'utilisateur de `system:anonymous`** et un **groupe de `system:unauthenticated`**.
|
||||
|
||||
Les **3** méthodes d'authentification sont :
|
||||
Les **3** méthodes d'**authentification** sont :
|
||||
|
||||
- **Anonyme** (par défaut) : Utilisez le paramètre **`--anonymous-auth=true` ou la configuration :**
|
||||
```json
|
||||
@@ -17,9 +17,9 @@ Les **3** méthodes d'authentification sont :
|
||||
"enabled": true
|
||||
},
|
||||
```
|
||||
- **Webhook** : Cela va **activer** les **tokens porteurs API** kubectl comme autorisation (tout token valide sera valide). Autorisez-le avec :
|
||||
- **Webhook** : Cela va **activer** les **tokens bearer API** kubectl comme autorisation (tout token valide sera valide). Autorisez-le avec :
|
||||
- assurez-vous que le groupe API `authentication.k8s.io/v1beta1` est activé dans le serveur API
|
||||
- démarrez le kubelet avec les options **`--authentication-token-webhook`** et **`--kubeconfig`** ou utilisez le paramètre suivant :
|
||||
- démarrez le kubelet avec les drapeaux **`--authentication-token-webhook`** et **`--kubeconfig`** ou utilisez le paramètre suivant :
|
||||
```json
|
||||
"authentication": {
|
||||
"webhook": {
|
||||
@@ -44,10 +44,10 @@ Les **3** méthodes d'authentification sont :
|
||||
|
||||
Toute demande qui est authentifiée avec succès (y compris une demande anonyme) **est ensuite autorisée**. Le mode d'autorisation **par défaut** est **`AlwaysAllow`**, qui **permet toutes les demandes**.
|
||||
|
||||
Cependant, l'autre valeur possible est **`webhook`** (qui est ce que vous trouverez **principalement là-bas**). Ce mode **vérifiera les permissions de l'utilisateur authentifié** pour autoriser ou interdire une action.
|
||||
Cependant, l'autre valeur possible est **`webhook`** (qui est ce que vous trouverez **principalement là-bas**). Ce mode **vérifie les permissions de l'utilisateur authentifié** pour autoriser ou interdire une action.
|
||||
|
||||
> [!WARNING]
|
||||
> Notez que même si **l'authentification anonyme est activée**, l'**accès anonyme** pourrait **ne pas avoir de permissions** pour effectuer une action.
|
||||
> Notez que même si l'**authentification anonyme est activée**, l'**accès anonyme** pourrait **ne pas avoir de permissions** pour effectuer une action.
|
||||
|
||||
L'autorisation via webhook peut être configurée en utilisant le **paramètre `--authorization-mode=Webhook`** ou via le fichier de configuration avec :
|
||||
```json
|
||||
@@ -59,7 +59,7 @@ L'autorisation via webhook peut être configurée en utilisant le **paramètre `
|
||||
}
|
||||
},
|
||||
```
|
||||
Le kubelet appelle l'**`SubjectAccessReview`** API sur le serveur API configuré pour **déterminer** si chaque demande est **autorisée.**
|
||||
Le kubelet appelle l'API **`SubjectAccessReview`** sur le serveur API configuré pour **déterminer** si chaque demande est **autorisée.**
|
||||
|
||||
Le kubelet autorise les demandes API en utilisant la même approche des [attributs de demande](https://kubernetes.io/docs/reference/access-authn-authz/authorization/#review-your-request-attributes) que l'apiserver :
|
||||
|
||||
@@ -70,18 +70,18 @@ Le kubelet autorise les demandes API en utilisant la même approche des [attribu
|
||||
| POST | créer |
|
||||
| GET, HEAD | obtenir (pour des ressources individuelles), lister (pour des collections, y compris le contenu complet de l'objet), surveiller (pour surveiller une ressource individuelle ou une collection de ressources) |
|
||||
| PUT | mettre à jour |
|
||||
| PATCH | patch |
|
||||
| PATCH | patch |
|
||||
| DELETE | supprimer (pour des ressources individuelles), deletecollection (pour des collections) |
|
||||
|
||||
- La **ressource** parlant à l'API Kubelet est **toujours** **nodes** et la **sous-ressource** est **déterminée** à partir du chemin de la demande entrante :
|
||||
- La **ressource** communiquant avec l'API Kubelet est **toujours** **nodes** et la **sous-ressource** est **déterminée** à partir du chemin de la demande entrante :
|
||||
|
||||
| API Kubelet | ressource | sous-ressource |
|
||||
| ----------- | --------- | -------------- |
|
||||
| /stats/\* | nodes | stats |
|
||||
| /metrics/\* | nodes | metrics |
|
||||
| /logs/\* | nodes | log |
|
||||
| /spec/\* | nodes | spec |
|
||||
| _toutes les autres_ | nodes | proxy |
|
||||
| API Kubelet | ressource | sous-ressource |
|
||||
| ------------ | -------- | -------------- |
|
||||
| /stats/\* | nodes | stats |
|
||||
| /metrics/\* | nodes | metrics |
|
||||
| /logs/\* | nodes | log |
|
||||
| /spec/\* | nodes | spec |
|
||||
| _toutes les autres_ | nodes | proxy |
|
||||
|
||||
Par exemple, la demande suivante a essayé d'accéder aux informations des pods de kubelet sans autorisation :
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user