|
Агрессивная атака: DNS-UDP-IP спуфер
Xakep, номер #048, стр. 048-068-2 Поля ip4 заголовка (RFC-791) ipv4 заголовок равен обычно 20 байтам. кол-во бит(!) описание 4 версия 4 IHL 8 тип сервиса 16 полная длина 16 идентификация 3 флаги 13 смещение фрагмента 8 TTL (time to live (время жизни) 8 протокол 16 контрольная сумма заголовка 32 source адрес (откуда) 32 destination адрес (куда) может не быть Опции нуль Выравнивание (x32) Далее в нашем случае в ip пакете идет udp пакет. Поля udp заголовка (RFC-768) udp заголовок равен восьми байтам. кол-во байт описание 2 с какого порта 2 на какой порт 2 размер пакета (данные + заголовок) 2 контрольная сумма Далее в udp пакете идут данные, которые являются нашими dns пакетами, чью структуру мы теперь и рассмотрим. Структура dns пакета (RFC-1035) Все данные внутри доменного протокола имеют формат, называемый message (сообщение). Уровни сообщения можно разделить на 5 секций, которые показаны ниже: +---------------------+ | Header | заголовок +---------------------+ | Quastion | запрос на преобразование к серверу имен +---------------------+ | Answer | ответ на этот запрос +---------------------+ | Authority | сервера имен, ответственные за данный домен +---------------------+ | Additional | дополнительная информация +---------------------+ Заголовок, как и понятно, присутствовать обязан всегда. Следующие секции зависят от типа dns пакета. При запросе на резолв (resolve - преобразование) пакет имеет только header и quastion секции. При ответе сервера имен dns пакет имеет все секции сообщения. И вот тут, прежде чем посмотреть непосредственно на поля, стоит остановиться. Дело в том, что все эти фразы "умножение", "атака с использованием множителей" ничего не стоят, т.к. математикой здесь и не пахнет. Как ты видишь, запрос на резолв имеет 2 поля, а возврат - 5 полей. В этом все умножение. Чем больше возвратит name server - тем больше "умножение". Почему назвали умножение, а не увеличение? Я не знаю. Наверное, для солидности. Но как бы это не называлось, метод очень действенный. И защититься от него - в общих случаях можно, а в индивидуальных – практически нереально (об этом чуть ниже). Прежде чем перейти к непосредственной реализации, рассмотрим header и quastion секции (т.к. они нам нужны при составлении пакета). Header очень красочно описан в /usr/include/arpa/nameser_compat.h, но для тех, кто ленив, вот он: header (12 байт) кол-во бит флаг описание 16 id - идентификатор dns пакета 1 qr - тип пакета. 0 - запрос, 1 - ответ. 4 opcode - тип запроса: 0 - QUERY, 1 - IQUERY, 2 - STATUS |