Servidor de ataque PoC para la vulnerabilidad CVE-2015-7547 en el resolutor DNS de glibc
Para probar en una 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...
A continuación, desde otra sesión de terminal, ejecute los ataques como se muestra en los ejemplos siguientes.
Ataque 1 (UDP+TCP)
Requiere la capacidad de enviar respuestas de más de 2048 bytes por UDP y por TCP.
Secuencia del ataque:
- Respuesta UDP, > 2048 bytes, cabecera/consulta válida, flag TC establecido (provoca una gestión incorrecta del búfer y un reintento por TCP)
- Respuesta TCP, cabecera/consulta válida (obliga a 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)
Ataque 2 (solo UDP)
Requiere la capacidad de enviar respuestas de más de 2048 bytes por UDP.
Secuencia del ataque:
- Respuesta UDP, > 2048 bytes, cabecera no válida (provoca una gestión incorrecta del búfer, no se cuenta como respuesta válida)
- Ignorar la siguiente petición (provoca un reintento por UDP debido al tiempo de espera de sondeo)
- Respuesta UDP, cabecera/consulta válida (obliga a 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)
Ataque 3 (UDP+TCP)
Requiere la capacidad de enviar respuestas de más de 1024 bytes por UDP y de más de 2048 bytes por TCP.
Secuencia del ataque:
- Respuesta UDP, 1024 bytes, cabecera/consulta válida (llena la mitad del búfer asignado en la pila)
- Respuesta UDP, > 1024 bytes, cabecera/consulta válida, flag TC establecido (provoca una gestión incorrecta del búfer y un reintento por TCP)
- Respuesta TCP, cabecera/consulta válida (obliga a 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)
Ataque 4 (solo UDP)
Requiere la capacidad de enviar respuestas de más de 2048 bytes por UDP.
Secuencia del ataque:
- Respuesta UDP, 2048 bytes, cabecera/consulta válida (llena el búfer asignado en la pila)
- Respuesta UDP (provoca una gestión incorrecta del búfer y un reintento por UDP debido a una recepción de socket de 0 bytes)
- Respuesta UDP, cabecera/consulta válida (obliga a 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)
Ataque 5 (solo TCP)
Requiere la capacidad de enviar respuestas de más de 2048 bytes por TCP y al menos dos entradas de nameserver en /etc/resolv.conf.
Secuencia del ataque:
- Respuesta UDP, cabecera/consulta válida, flag TC establecido (opcional, provoca un reintento por TCP si la consulta inicial es por UDP)
- Respuesta TCP, > 2048 bytes (provoca una gestión incorrecta del búfer)
- Respuesta TCP, vacía (provoca un reintento por TCP debido a una recepción de socket de 0 bytes)
- Respuesta TCP, cabecera/consulta válida (obliga a 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)