Pentesting Kubernetes Services
AWSハッキングの学習と実践:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習と実践:HackTricks Training GCP Red Team Expert (GRTE)
Kubernetesはいくつかの特定のネットワークサービスを使用しており、これらはインターネットに公開されているか、1つのポッドを侵害した後の内部ネットワークに存在する可能性があります。
OSINTを使用した公開ポッドの検出
1つの方法は、crt.shでIdentity LIKE "k8s.%.com"
を検索して、Kubernetesに関連するサブドメインを見つけることです。別の方法は、githubで"k8s.%.com"
を検索し、その文字列を含むYAMLファイルを検索することです。
Kubernetesがサービスを公開する方法
Kubernetesがサービスを公開する方法を理解することは役立つかもしれません:
Exposing Services in Kubernetesポートスキャンを使用した公開ポッドの検出
次のポートは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 | Insecure 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
Kube-apiserver
これは、通常、管理者がツール**kubectl
を使用してやり取りするAPI Kubernetesサービス**です。
一般的なポート: 6443と443、ただし、minikubeでは8443、セキュリティの脆弱性として8080も使用されます。
次のページをチェックして、このサービスと通信して機密データを取得し、機密なアクションを実行する方法を学んでください:
Kubernetes EnumerationKubelet API
このサービスはクラスター内のすべてのノードで実行されます。これはノード内のポッドを制御するサービスです。kube-apiserverと通信します。
このサービスが公開されている場合、認証されていないRCEを見つけた可能性があります。
Kubelet API
もしレスポンスが Unauthorized
であれば、認証が必要です。
ノードをリストできる場合は、次のコマンドで kubelet エンドポイントのリストを取得できます:
kubelet(読み取り専用)
etcd API
etcd API
Tiller
Tiller
cAdvisor
メトリクスを収集するのに便利なサービス。
NodePort
NodePortを介してすべてのノードでポートが公開されると、同じポートがすべてのノードで開かれ、トラフィックが宣言されたServiceにプロキシされます。デフォルトでは、このポートは30000-32767の範囲にあります。したがって、新しい未チェックのサービスはこれらのポートを介してアクセス可能になる可能性があります。
脆弱なミスコンフィギュレーション
Kube-apiserver匿名アクセス
kube-apiserver APIエンドポイントへの匿名アクセスは許可されていません。ただし、いくつかのエンドポイントをチェックできます:
ETCD匿名アクセスのチェック
ETCDにはクラスタのシークレット、構成ファイル、およびより機密性の高いデータが保存されています。デフォルトでは、ETCDは匿名でアクセスできませんが、常にチェックすることが良いでしょう。
ETCDに匿名でアクセスできる場合は、etcdctl ツールを使用する必要があります。次のコマンドで保存されているすべてのキーを取得できます:
Kubelet RCE
Kubeletのドキュメントによると、デフォルトではサービスへの匿名アクセスが許可されています:
Kubeletサーバーへの匿名リクエストを有効にします。他の認証方法によって拒否されないリクエストは匿名リクエストとして扱われます。匿名リクエストのユーザー名は
system:anonymous
で、グループ名はsystem:unauthenticated
です。
Kubelet APIの認証と認可の仕組みをよりよく理解するには、このページを参照してください:
Kubelet Authentication & AuthorizationKubeletサービスのAPIは文書化されていませんが、ソースコードはこちらで見つけることができ、公開されているエンドポイントを見つけることは次のように実行するだけです:
すべて興味深いようです。
Kubeletctlツールを使用して、Kubeletsとそれらのエンドポイントとやり取りすることができます。
/pods
このエンドポイントは、ポッドとそれらのコンテナをリストします。
/exec
このエンドポイントを使用すると、非常に簡単に任意のコンテナ内でコードを実行できます:
この攻撃を回避するためには、kubelet サービスを --anonymous-auth false
オプションで実行し、サービスをネットワークレベルで分離する必要があります。
Kubelet(読み取り専用ポート)情報露出のチェック
kubelet read-only port が公開されると、認可されていない者によってAPIから情報を取得することが可能になります。このポートの露出は、さまざまな クラスター構成要素 の開示につながる可能性があります。情報には ポッド名、内部ファイルの場所、その他の構成 などが含まれます。これらの情報は重要ではないかもしれませんが、その露出はセキュリティリスクを引き起こす可能性があり、避けるべきです。
この脆弱性が悪用される例として、リモート攻撃者が特定のURLにアクセスすることが挙げられます。http://<external-IP>:10255/pods
に移動することで、攻撃者は kubelet から機密情報を取得する可能性があります:
参考文献
AWS ハッキングの学習と実践:HackTricks Training AWS Red Team Expert (ARTE) GCP ハッキングの学習と実践: HackTricks Training GCP Red Team Expert (GRTE)
Last updated