Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Last updated
Last updated
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
La clase java.net.URL
implementa Serializable
, esto significa que esta clase puede ser serializada.
Esta clase tiene un comportamiento curioso. De la documentación: “Dos hosts se consideran equivalentes si ambos nombres de host pueden resolverse en las mismas direcciones IP”.
Entonces, cada vez que un objeto URL llama a cualquiera de las funciones equals
o hashCode
, se va a enviar una solicitud DNS para obtener la dirección IP.
Llamar a la función hashCode
desde un objeto URL es bastante fácil, es suficiente con insertar este objeto dentro de un HashMap
que va a ser deserializado. Esto se debe a que al final de la función readObject
de HashMap
se ejecuta este código:
Se va a ejecutar putVal
con cada valor dentro del HashMap
. Pero, más relevante es la llamada a hash
con cada valor. Este es el código de la función hash
:
Como puedes observar, cuando deserializas un HashMap
la función hash
se va a ejecutar con cada objeto y durante la ejecución de hash
se va a ejecutar .hashCode()
del objeto. Por lo tanto, si deserializas un HashMap
que contiene un objeto URL, el objeto URL ejecutará .hashCode()
.
Ahora, echemos un vistazo al código de URLObject.hashCode()
:
Como puedes ver, cuando un URLObject
ejecuta .hashCode()
, se llama hashCode(this)
. A continuación, puedes ver el código de esta función:
Puedes ver que se ejecuta un getHostAddress
al dominio, lanzando una consulta DNS.
Por lo tanto, esta clase puede ser abusada para lanzar una consulta DNS para demostrar que la deserialización es posible, o incluso para exfiltrar información (puedes agregar como subdominio la salida de una ejecución de comando).
Puedes encontrar el código de carga útil URDNS de ysoserial aquí. Sin embargo, solo para facilitar la comprensión de cómo codificarlo, creé mi propio PoC (basado en el de ysoserial):
En la idea original, la carga útil de commons collections se cambió para realizar una consulta DNS, esto era menos confiable que el método propuesto, pero esta es la publicación: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
Puedes descargar GadgetProbe desde la tienda de aplicaciones de Burp Suite (Extender).
GadgetProbe intentará averiguar si algunas clases de Java existen en la clase Java del servidor para que puedas saber si es vulnerable a algún exploit conocido.
GadgetProbe utilizará la misma carga útil DNS de la sección anterior pero antes de ejecutar la consulta DNS, intentarà deserializar una clase arbitraria. Si la clase arbitraria existe, la consulta DNS será enviada y GadgetProbe anotará que esta clase existe. Si la solicitud DNS nunca se envía, esto significa que la clase arbitraria no fue deserializada con éxito, por lo que o no está presente o no es serializable/explotable.
Dentro de GitHub, GadgetProbe tiene algunas listas de palabras con clases de Java para ser probadas.
Este escáner se puede descargar de la tienda de aplicaciones de Burp (Extender). La extensión tiene capacidades pasivas y activas.
Por defecto, verifica pasivamente todas las solicitudes y respuestas enviadas buscando bytes mágicos serializados de Java y presentará una advertencia de vulnerabilidad si se encuentra alguno:
Pruebas Manuales
Puedes seleccionar una solicitud, hacer clic derecho y Enviar solicitud a DS - Pruebas Manuales
.
Luego, dentro de la Pestaña del Escáner de Deserialización --> pestaña de pruebas manuales puedes seleccionar el punto de inserción. Y lanzar la prueba (Selecciona el ataque apropiado dependiendo de la codificación utilizada).
Incluso si esto se llama "Pruebas Manuales", es bastante automatizado. Verificará automáticamente si la deserialización es vulnerable a cualquier carga útil de ysoserial verificando las bibliotecas presentes en el servidor web y resaltará las que son vulnerables. Para verificar las bibliotecas vulnerables, puedes seleccionar lanzar Javas Sleeps, sleeps a través del consumo de CPU, o usando DNS como se mencionó anteriormente.
Explotación
Una vez que hayas identificado una biblioteca vulnerable, puedes enviar la solicitud a la Pestaña de Explotación. En esta pestaña debes seleccionar el punto de inyección nuevamente, escribir la biblioteca vulnerable para la que deseas crear una carga útil, y el comando. Luego, solo presiona el botón de Ataque apropiado.
Haz que tu carga útil ejecute algo como lo siguiente:
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)