
Сервер атаки PoC для уязвимости переполнения буфера CVE-2015-7547 в DNS-резольвере (stub resolver) glibc (публичная версия)
Для тестирования на локальной машине с уязвимой версией 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...
Затем из другого сеанса терминала выполните атаки, как показано в примерах ниже.
Требуется возможность отправки ответов размером > 2048 байт по UDP и TCP.
Последовательность атаки:
UDP-ответ размером > 2048 байт, корректный заголовок/запрос, установлен флаг TC (вызывает неправильное управление буфером и повторную попытку по TCP)
TCP-ответ, корректный заголовок/запрос (заставляет следующий ответ сохраняться в стековом буфере)
TCP-ответ размером > 2048 байт (переполняет стековый буфер)
Пример:
user@localhost:/$ curl http://attack1
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Требуется возможность отправки ответов размером > 2048 байт по UDP.
Последовательность атаки:
UDP-ответ размером > 2048 байт, некорректный заголовок (вызывает неправильное управление буфером, не считается действительным ответом)
Игнорировать следующий запрос (вызывает повторную попытку UDP из-за тайм-аута опроса)
UDP-ответ, корректный заголовок/запрос (заставляет следующий ответ сохраняться в стековом буфере)
UDP-ответ размером > 2048 байт (переполняет стековый буфер)
Пример:
user@localhost:/$ curl http://attack2
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Требуется возможность отправки ответов размером > 1024 байт по UDP и > 2048 байт по TCP.
Последовательность атаки:
UDP-ответ размером 1024 байта, корректный заголовок/запрос (заполняет половину стекового буфера)
UDP-ответ размером > 1024 байт, корректный заголовок/запрос, установлен флаг TC (вызывает неправильное управление буфером и повторную попытку по TCP)
TCP-ответ, корректный заголовок/запрос (заставляет следующий ответ сохраняться в стековом буфере)
TCP-ответ размером > 2048 байт (переполняет стековый буфер)
Пример:
user@localhost:/$ curl http://attack3
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Требуется возможность отправки ответов размером > 2048 байт по UDP.
Последовательность атаки:
UDP-ответ размером 2048 байт, корректный заголовок/запрос (заполняет стековый буфер)
UDP-ответ (вызывает неправильное управление буфером и повторную попытку UDP из-за получения 0 байт через сокет)
UDP-ответ, корректный заголовок/запрос (заставляет следующий ответ сохраняться в стековом буфере)
UDP-ответ размером > 2048 байт (переполняет стековый буфер)
Пример:
user@localhost:/$ curl http://attack4
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Требуется возможность отправки ответов размером > 2048 байт по TCP и наличие как минимум двух записей серверов имён в /etc/resolv.conf.
Последовательность атаки:
UDP-ответ, корректный заголовок/запрос, установлен флаг TC (опционально, вызывает повторную попытку TCP, если начальный запрос был по UDP)
TCP-ответ размером > 2048 байт (вызывает неправильное управление буфером)
TCP-ответ, пустой (вызывает повторную попытку TCP из-за получения 0 байт через сокет)
TCP-ответ, корректный заголовок/запрос (заставляет следующий ответ сохраняться в стековом буфере)
TCP-ответ размером > 2048 байт (переполняет стековый буфер)
Пример:
user@localhost:/$ curl http://attack5
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Чтобы получить от сервера корректный ответ типа A/AAAA определённого размера, отправьте запрос на один из следующих адресов:
Запросы могут быть отправлены по UDP или TCP, и ответы будут содержать соответствующее количество корректных A или AAAA записей, чтобы дополнить ответ до запрошенного размера. Когда PoC-сервер настроен как авторитетный сервер имён для тестового домена, это позволяет исследовать поведение иерархии DNS-кэша при получении слишком больших ответов.
Пример:
user@localhost:/$ curl http://payload1.somedomain.com