
Server di attacco PoC per la vulnerabilità di overflow del buffer CVE-2015-7547 nel risolutore DNS stub di glibc (versione pubblica)
Per testare su 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
Starting UDP server on 127.0.0.127:53...
Starting TCP server on 127.0.0.127:53...
Poi, da un'altra sessione terminale, esegui gli attacchi come mostrato negli esempi qui sotto.
Richiede la capacità di inviare risposte > 2048 byte su UDP e TCP.
Sequenza dell'attacco:
Risposta UDP, > 2048 byte, header/question validi, flag TC impostato (innesca una cattiva gestione del buffer e un ritentativo TCP)
Risposta TCP, header/question validi (forza la memorizzazione della risposta successiva 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 terminated
Segmentation fault (core dumped)
Richiede la capacità di inviare risposte > 2048 byte su UDP.
Sequenza dell'attacco:
Risposta UDP, > 2048 byte, header non valido (innesca una cattiva gestione del buffer, non conteggiato come risposta valida)
Ignora la richiesta successiva (innesca un ritentativo UDP a causa del timeout di polling)
Risposta UDP, header/question validi (forza la memorizzazione della risposta successiva 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 terminated
Segmentation fault (core dumped)
Richiede la capacità di inviare risposte > 1024 byte su UDP e > 2048 byte su TCP.
Sequenza dell'attacco:
Risposta UDP, 1024 byte, header/question validi (riempie metà del buffer allocato sullo stack)
Risposta UDP, > 1024 byte, header/question validi, flag TC impostato (innesca una cattiva gestione del buffer e un ritentativo TCP)
Risposta TCP, header/question validi (forza la memorizzazione della risposta successiva 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 terminated
Segmentation fault (core dumped)
Richiede la capacità di inviare risposte > 2048 byte su UDP.
Sequenza dell'attacco:
Risposta UDP, 2048 byte, header/question validi (riempie il buffer allocato sullo stack)
Risposta UDP (innesca una cattiva gestione del buffer e un ritentativo UDP a causa di una ricezione socket di 0 byte)
Risposta UDP, header/question validi (forza la memorizzazione della risposta successiva 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 terminated
Segmentation fault (core dumped)
Richiede la capacità di inviare risposte > 2048 byte su TCP e almeno due voci di nameserver in /etc/resolv.conf.
Sequenza dell'attacco:
Risposta UDP, header/question validi, flag TC impostato (opzionale, attiva il ritentativo TCP se la query iniziale è su UDP)
Risposta TCP, > 2048 byte (innesca una cattiva gestione del buffer)
Risposta TCP, vuota (innesca un ritentativo TCP a causa di una ricezione socket di 0 byte)
Risposta TCP, header/question validi (forza la memorizzazione della risposta successiva 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 terminated
Segmentation fault (core dumped)
Per attivare una risposta valida di tipo A/AAAA di una certa dimensione dal server, invia una richiesta per uno dei seguenti:
Le richieste possono essere inviate su UDP o TCP, e le risposte conterranno il numero appropriato di risposte valide A o AAAA per riempire la risposta fino alla dimensione richiesta. Quando il server PoC è configurato come server dei nomi autorevole per un dominio di test, ciò consente di esplorare il comportamento delle gerarchie di cache DNS quando si trovano di fronte a risposte sovradimensionate.
Esempio:
user@localhost:/$ curl http://payload1.somedomain.com