
Server exploit PoC per CVE-2015-7547
Per testare su una macchina locale con una versione vulnerabile di 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
Avvio del server UDP su 127.0.0.127:53...
Avvio del server TCP su 127.0.0.127:53...
Quindi, da un'altra sessione terminale, esegui gli attacchi come mostrato negli esempi seguenti.
Richiede la capacità di inviare risposte > 2048 byte via UDP e TCP.
Sequenza dell'attacco:
Risposta UDP, > 2048 byte, header/query valido, flag TC impostato (innesca una gestione errata del buffer e un tentativo TCP)
Risposta TCP, header/query valido (costringe la risposta successiva a essere memorizzata in un buffer allocato sullo stack)
Risposta TCP, > 2048 byte (overflow del buffer allocato sullo stack)
Esempio:
user@localhost:/# curl http://attack1
*** stack smashing detected ***: curl terminato
Segmentation fault (core dumped)
Richiede la capacità di inviare risposte > 2048 byte via UDP.
Sequenza dell'attacco:
Risposta UDP, > 2048 byte, header non valido (innesca una gestione errata del buffer, non conteggiata come risposta valida)
Ignora la richiesta successiva (innesca un tentativo UDP a causa del timeout di polling)
Risposta UDP, header/query valido (costringe la risposta successiva a essere memorizzata in un buffer allocato sullo stack)
Risposta UDP, > 2048 byte (overflow del buffer allocato sullo stack)
Esempio:
user@localhost:/# curl http://attack2
*** stack smashing detected ***: curl terminato
Segmentation fault (core dumped)
Richiede la capacità di inviare risposte > 1024 byte via UDP e > 2048 byte via TCP.
Sequenza dell'attacco:
Risposta UDP, 1024 byte, header/query valido (riempie metà del buffer allocato sullo stack)
Risposta UDP, > 1024 byte, header/query valido, flag TC impostato (innesca una gestione errata del buffer e un tentativo TCP)
Risposta TCP, header/query valido (costringe la risposta successiva a essere memorizzata in un buffer allocato sullo stack)
Risposta TCP, > 2048 byte (overflow del buffer allocato sullo stack)
Esempio:
user@localhost:/# curl http://attack3
*** stack smashing detected ***: curl terminato
Segmentation fault (core dumped)
Richiede la capacità di inviare risposte > 2048 byte via UDP.
Sequenza dell'attacco:
Risposta UDP, 2048 byte, header/query valido (riempie il buffer allocato sullo stack)
Risposta UDP (innesca una gestione errata del buffer e un tentativo UDP a causa di una ricezione socket di 0 byte)
Risposta UDP, header/query valido (costringe la risposta successiva a essere memorizzata in un buffer allocato sullo stack)
Risposta UDP, > 2048 byte (overflow del buffer allocato sullo stack)
Esempio:
user@localhost:/# curl http://attack4
*** stack smashing detected ***: curl terminato
Segmentation fault (core dumped)
Richiede la capacità di inviare risposte > 2048 byte via TCP e almeno due voci nameserver in /etc/resolv.conf.
Sequenza dell'attacco:
Risposta UDP, header/query valido, flag TC impostato (opzionale, innesca un tentativo TCP se la query iniziale è via UDP)
Risposta TCP, > 2048 byte (innesca una gestione errata del buffer)
Risposta TCP, vuota (innesca un tentativo TCP a causa di una ricezione socket di 0 byte)
Risposta TCP, header/query valido (costringe la risposta successiva a essere memorizzata in un buffer allocato sullo stack)
Risposta TCP, > 2048 byte (overflow del buffer allocato sullo stack)
Esempio:
user@localhost:/# curl http://attack5
*** stack smashing detected ***: curl terminato
Segmentation fault (core dumped)