Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
secure-by-default-rce-demo — 安全默认演示实验室,展示容器加固(无发行版镜像、非root、只读文件系统、运行时注入的机密)如何中和关键的Next.js/React Server Actions RCE(CVE-2025-55182“React2Shell”),并并排显示安全与不安全部署及漏洞利用日志 | Kitploit
工具/GitHubGitHub/meganekos/secure-by-default-rce-demo
容器安全漏洞分析漏洞利用Web安全云安全DevSecOps错误配置学习与教育实验室与实践

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
GitHub
meganekos/secure-by-default-rce-demo

secure-by-default-rce-demo

安全默认演示实验室,展示容器加固(无发行版镜像、非root、只读文件系统、运行时注入的机密)如何中和关键的Next.js/React Server Actions RCE(CVE-2025-55182“React2Shell”),并并排显示安全与不安全部署及漏洞利用日志

查看仓库
48个月前尚未审核

Node.js RCE 缓解:DevOps 作为最后一道防线

本项目演示了 Next.js 应用程序(特别是通过服务器操作)中的一个严重远程代码执行 (RCE) 漏洞,以及基础设施加固如何在代码漏洞仍然存在的情况下有效阻止攻击。

它对比了使用Distroless镜像和只读文件系统的标准“不安全”部署与强化后的“安全”部署。

🛡️ 概念:深度防御

软件漏洞不可避免。当代码失效时,你的基础设施必须阻止攻击者扩大立足点。

漏洞

Next.js 使用的 React 服务器组件 (RSC) 实现中存在一个严重 RCE 漏洞(CVE-2025-55182,又名 React2Shell)。

  • CVSS:10.0(严重)
  • 根本原因:“Flight”协议的不安全反序列化允许攻击者在服务器操作处理期间操纵内部对象(通过原型污染或类似机制)。
  • 影响:允许在无需认证的情况下执行任意代码(如 spawnSync)。

攻击向量

  1. 离地攻击(LotL):使用操作系统已有的工具(curl、wget、ls、cat)窃取机密或下载恶意软件。
    • 机制:漏洞利用 Node.js child_process.spawnSync()。它直接执行二进制文件,无需 shell(/bin/sh)。
  2. 自带武器(BYOL):如果标准工具缺失,攻击者上传自己的二进制文件(例如编译好的 Go 可执行文件),标记为可执行(chmod +x),然后运行。

🏗️ 架构对比


📝 应用程序日志分析

以下日志展示了从应用程序视角看攻击尝试的样子。这种对比生动地凸显了安全措施的有效性。

安全应用日志(logs/server.safe.log)

日志显示重复的失败(ENOENT)。

  • 原因? spawnSync 尝试运行 ls、id、curl。Distroless 镜像根本没有这些二进制文件。这不仅是没有 shell,工具本身也不存在。
root@kitploit:~
[Instrumentation] Logging initialized. Writing to: /app/logs/server.safe.log
 ⨯ Error: NEXT_REDIRECT
    ... digest: '`{"step":"1. Write Initial Chunk to /tmp/hello_test","success":true}`'
 ⨯ Error: NEXT_REDIRECT
    ... digest: '`{"step":"2. Verify Binary was Written","verification":{...},"success":true}`'
 ⨯ Error: NEXT_REDIRECT
    ... digest: '`{"step":"4. Execute Binary","stdout":"","stderr":"","error_obj":{"message":"spawnSync /tmp/hello_test EACCES","code":"EACCES"},"success":true}`'

不安全应用日志(logs/server.unsafe.log)

日志确认命令执行成功和文件系统操作。

root@kitploit:~
[Instrumentation] Logging initialized. Writing to: /app/logs/server.unsafe.log
 ⨯ Error: NEXT_REDIRECT
    ... digest: '`{"step":"1. Write Initial Chunk to /tmp/hello_test","success":true}`'
 ⨯ Error: NEXT_REDIRECT
    ... digest: '`{"step":"4. Execute Binary","stdout":"Hello from Go binary!\\n","stderr":"","error_obj":null,"success":true}`'
 ⨯ Error: NEXT_REDIRECT
    ... digest: '`{"command":"id","args":[],"stdout":"uid=0(root) gid=0(root) ...","stderr":"","status":0,"signal":null}`'
 ⨯ Error: NEXT_REDIRECT
    ... digest: '`{"command":"cat","args":["/app/.env"],"stdout":"","stderr":"cat: can\'t open \'/app/.env\': No such file or directory\n","status":1,"signal":null}`'

(注意:在不安全日志中,上面的 cat /app/.env 失败是因为文件在根目录下名为 .env,但在完整日志中 ls -la 会显示目录结构。)


💥 POC 结果

1. 标准 RCE(离地攻击)

尝试运行标准 shell 命令。

  • 不安全:✅ 成功。攻击者可以运行 id、ls、cat .env,并访问敏感数据。
  • 安全:❌ 被阻止。spawnSync /bin/sh ENOENT。没有 shell 可以执行命令。

2. 高级攻击(自带武器)

尝试通过上传自定义二进制文件绕过“缺少工具”。

  • 不安全:✅ 成功。
    1. 攻击者分块传输二进制文件(绕过有效载荷限制)。
    2. 写入 /tmp/malware。
    3. 运行 chmod +x。
    4. 执行二进制文件。
  • 安全:❌ 被阻止。
    • 写入失败:EROFS: read-only file system。
    • 攻击者无法在任何地方放置文件,有效中和了 BYOL 攻击。

3. “真正无文件”执行分析

攻击者能否将二进制文件加载到变量中并直接从内存执行?

  • 概念:将二进制文件的分块连接成一个全局 JavaScript 变量(例如 global.payload = "..."),然后执行它。
  • 现实:失败。
    • Node.js child_process 函数(spawn、exec)需要文件路径。它们无法直接执行缓冲区或字符串。
    • 要在 Linux 上绕过这一点,需要 memfd_create(一个在 RAM 中创建匿名文件的系统调用)。
    • 障碍:Node.js 并不原生暴露 memfd_create。要使用它,需要预先在 node_modules 中安装 C++ 插件(如 ffi-napi)。
    • Distroless 的影响:由于镜像缺少编译器(gcc、make),攻击者无法即时构建此插件。

🔐 演示的最佳实践

1. 使用 Distroless 镜像

“Distroless”镜像只包含你的应用程序及其运行时依赖。它们不包含包管理器、shell 或标准 UNIX 工具。

  • 为什么? 如果攻击者获得了 RCE,他们将无法四处查看(ls)、下载文件(curl)或轻松提升权限。

2. 只读文件系统

配置你的容器运行时,将根文件系统挂载为只读。

  • 为什么? 它阻止攻击者下载(BYOL)或修改你的应用程序代码(持久化)。
  • 如何做? 在 docker-compose.yml 中:
    root@kitploit:~
    read_only: true
    tmpfs:
      - /tmp:noexec # 关键:明确阻止执行!
    
    观察:使用此设置,我们的 POC 显示攻击者可以将二进制文件写入 /tmp(写入成功),但由于 noexec 标志,执行失败并返回 EACCES(权限被拒绝)。这平衡了功能(可写 tmp)和安全性。

3. 原生环境变量(“导出”空间)

不要在你的容器镜像中附带 .env 文件。如果攻击者可以读取文件(例如 cat .env),你的机密就会泄露。

  • 安全方法:在运行时将变量直接注入进程环境(例如通过 Kubernetes Secrets、AWS Parameter Store 或 Docker 的 environment 键)。
  • 为什么? 相比于读取单个文件,这使攻击者一次性转储所有机密变得更加困难。

🚀 如何运行

  1. 启动环境: 安全和不安全的应用程序都定义在单个 docker-compose.yml 文件中。

    root@kitploit:~
    docker compose up --build -d
    
  2. 运行漏洞利用: 你可以针对特定端口运行漏洞利用,以查看差异。

    • 针对不安全应用(端口 3001):

      root@kitploit:~
      # 1. 标准 RCE(LotL) - 成功
      python exploit/poc.py http://localhost:3001
      
      # 2. 高级攻击(BYOL) - 成功
      python exploit/poc_advanced.py http://localhost:3001
      
    • 针对安全应用(端口 3000):

      root@kitploit:~
      # 1. 标准 RCE(LotL) - 失败(ENOENT)
      python exploit/poc.py http://localhost:3000
      
      # 2. 高级攻击(BYOL) - 失败(EACCES/EROFS)
      python exploit/poc_advanced.py http://localhost:3000
      
  3. 清理:

    root@kitploit:~
    docker compose down
    
下载工具
特性❌ 不安全环境(端口 3001)✅ 安全环境(端口 3000)
基础镜像node:20-alpine(包含 ls、curl、wget 等)gcr.io/distroless/nodejs20-debian12(无 shell,无工具)
文件系统可写(标准 Docker 默认)只读(read_only: true)
机密磁盘上的 .env 文件(易受 cat .env 攻击)环境变量(运行时注入)
用户root(默认)非 root(Distroless 强制)