
PoC-Angriffsserver für die Pufferüberlauf-Schwachstelle CVE-2015-7547 im glibc-DNS-Stub-Resolver (öffentliche Version)
Zum Testen auf einem lokalen Rechner mit einer anfälligen glibc-Version:
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...
Führen Sie dann von einem anderen Terminal aus die Angriffe wie in den folgenden Beispielen gezeigt aus.
Erfordert die Fähigkeit, Antworten > 2048 Bytes über UDP und TCP zu senden.
Angriffssequenz:
UDP-Antwort, > 2048 Bytes, gültiger Header/Frage, TC-Flag gesetzt (löst Pufferfehlverwaltung und TCP-Wiederholung aus)
TCP-Antwort, gültiger Header/Frage (zwingt die nächste Antwort, in einem stapelallokierten Puffer gespeichert zu werden)
TCP-Antwort, > 2048 Bytes (überläuft den stapelallokierten Puffer)
Beispiel:
user@localhost:/$ curl http://attack1
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Erfordert die Fähigkeit, Antworten > 2048 Bytes über UDP zu senden.
Angriffssequenz:
UDP-Antwort, > 2048 Bytes, ungültiger Header (löst Pufferfehlverwaltung aus, wird nicht als gültige Antwort gezählt)
Nächste Anfrage ignorieren (löst UDP-Wiederholung aufgrund von Timeout beim Polling aus)
UDP-Antwort, gültiger Header/Frage (zwingt die nächste Antwort, in einem stapelallokierten Puffer gespeichert zu werden)
UDP-Antwort, > 2048 Bytes (überläuft den stapelallokierten Puffer)
Beispiel:
user@localhost:/$ curl http://attack2
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Erfordert die Fähigkeit, Antworten > 1024 Bytes über UDP und > 2048 Bytes über TCP zu senden.
Angriffssequenz:
UDP-Antwort, 1024 Bytes, gültiger Header/Frage (füllt die Hälfte des stapelallokierten Puffers)
UDP-Antwort, > 1024 Bytes, gültiger Header/Frage, TC-Flag gesetzt (löst Pufferfehlverwaltung und TCP-Wiederholung aus)
TCP-Antwort, gültiger Header/Frage (zwingt die nächste Antwort, in einem stapelallokierten Puffer gespeichert zu werden)
TCP-Antwort, > 2048 Bytes (überläuft den stapelallokierten Puffer)
Beispiel:
user@localhost:/$ curl http://attack3
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Erfordert die Fähigkeit, Antworten > 2048 Bytes über UDP zu senden.
Angriffssequenz:
UDP-Antwort, 2048 Bytes, gültiger Header/Frage (füllt den stapelallokierten Puffer)
UDP-Antwort (löst Pufferfehlverwaltung und UDP-Wiederholung aufgrund eines 0-Byte-Socketempfangs aus)
UDP-Antwort, gültiger Header/Frage (zwingt die nächste Antwort, in einem stapelallokierten Puffer gespeichert zu werden)
UDP-Antwort, > 2048 Bytes (überläuft den stapelallokierten Puffer)
Beispiel:
user@localhost:/$ curl http://attack4
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Erfordert die Fähigkeit, Antworten > 2048 Bytes über TCP zu senden, sowie mindestens zwei Nameserver-Einträge in /etc/resolv.conf.
Angriffssequenz:
UDP-Antwort, gültiger Header/Frage, TC-Flag gesetzt (optional, löst TCP-Wiederholung aus, wenn die erste Anfrage über UDP erfolgt)
TCP-Antwort, > 2048 Bytes (löst Pufferfehlverwaltung aus)
TCP-Antwort, leer (löst TCP-Wiederholung aufgrund eines 0-Byte-Socketempfangs aus)
TCP-Antwort, gültiger Header/Frage (zwingt die nächste Antwort, in einem stapelallokierten Puffer gespeichert zu werden)
TCP-Antwort, > 2048 Bytes (überläuft den stapelallokierten Puffer)
Beispiel:
user@localhost:/$ curl http://attack5
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Um eine gültige Typ-A/AAAA-Antwort einer bestimmten Größe vom Server auszulösen, senden Sie eine Anfrage für eine der folgenden:
Die Anfragen können über UDP oder TCP gestellt werden, und die Antworten enthalten die entsprechende Anzahl gültiger A- oder AAAA-Antworten, um die Antwort auf die angeforderte Größe aufzufüllen. Wenn der PoC-Server als autoritativer Nameserver für eine Testdomain eingerichtet ist, ermöglicht dies die Untersuchung des Verhaltens von DNS-Cache-Hierarchien bei übermäßig großen Antworten.
Beispiel:
user@localhost:/$ curl http://payload1.somedomain.com