Понимание протокола DNS (часть 3)

Опубликовано: 24 Марта, 2023

  • Понимание протокола DNS (часть 1)

DNS и его биты и байты

В течение последних двух статей мы рассмотрели DNS на довольно высоком уровне. На самом деле мы не углублялись в какой-либо контент системного администрирования, а сосредоточились больше на том, чтобы получить четкое представление о том, что делает протокол и как он это делает. Наконец, мы также рассмотрели, как выглядит DNS-пакет в проводной сети. В этой последней части серии статей о DNS мы возьмем один пакет DNS и пройдемся по заголовку DNS. Надеюсь, это позволит вам лучше понять сам протокол и то, как он работает. Вам может показаться, что прохождение пакета DNS, шестнадцатеричное значение за шестнадцатеричным значением, не имеет значения.

Я считаю, что возможность полностью разобрать пакет придаст вам чувство уверенности при работе с DNS. Это, в свою очередь, позволит вам уверенно подходить к любой проблеме, связанной с сетью, связанной с DNS. Такая уверенность в себе может прийти только от понимания не только того, как работает сам протокол, но и того, как он выглядит в пакетном формате.

Давайте разберем этот пакет!

Задолго до того, как мы начнем разбирать указанный ниже пакет, вам нужно убедиться, что у вас есть листовка SANS TCP/IP и tcpdump, расположенная внизу страницы. Это позволит вам перемещаться по пакету DNS с минимальными усилиями. Теперь я прокомментирую пакет прямо под ним.

01:00:09.684739 192.168.1.200.53 > 192.168.1.100.616: [сумма UDP в порядке] 59930 NXDomain 0/1/0 (102) (ttl 58, id 55787, длина 130)
0x0000 4 5 00 0082 d9eb 0000 3a11 f873 c0a8 01c8 E…….:..s..e.
0x0010 c0a8 0164 0035 0268 006e ba41 ea1a 8183 …..5.hnA….
0x0020 0001 0000 0001 0000 0133 0234 3503 3139 ………3.45.19
0x0030 3103 3230 3605 646e 7362 6c05 736f 7262 1.206.dnsbl.sorb
0x0040 7303 6e65 7400 0001 0001 c019 0006 0001 s.net………..
0x0050 0000 0e10 002c 0772 626c 646e 7330 c01f …..,.rbldns0..
0x0060 0364 6e73 0469 7375 7803 636f 6d00 431c.dns.isux.com.C.
0x0070 e07e 0000 1c20 0000 1c20 0009 3a80 0000.~……….:…
0x0080 0e10..








В качестве переподготовки я быстро пройдусь по всем полям, начиная с первой строки, и буду работать справа налево. Первая строка содержит отметку времени, то есть время, когда компьютер назначения 192.168.1.100 получил этот DNS-пакет.

Затем у нас есть исходный IP-адрес и исходный порт, т.е.: 192.168.1.200.53, за которым следует знак директора, который, так сказать, обозначает поток разговора. После этого у нас есть IP-адрес назначения и порт назначения.

Теперь у нас есть [udp sum ok], означающий, что контрольная сумма udp верна. После этого у нас есть номер транзакции DNS 59930. Он, как упоминалось ранее, используется для отслеживания DNS-запросов и ответов отправителя запроса.

Далее мы видим RCODE NXDomain, а это означает, что домен, для которого запрашивалось разрешение, не существует. Далее следуют числа 0/1/0, и они означают, что в этом пакете нет записей ответов, одна авторитетная запись и ноль дополнительных записей.

После этого у нас есть значение 102 в скобках. Это объем данных DNS, содержащихся в этом пакете. Далее следует значение ttl 58, значение IP ID 55787 и, наконец, общая длина пакета 130. Важно помнить, что поле «len 130», как показано в приведенном выше пакете, относится к общему размеру пакета, и который включает в себя как заголовки протокола, так и данные, если они есть.

Мы не будем утруждать себя просмотром приведенных ниже шестнадцатеричных значений, представляющих заголовки IP и UDP, а скорее перейдем к заголовку и данным DNS. Еще раз быстрый способ перейти к ключевым точкам в пакете состоит в том, чтобы сделать следующее.

Мы знаем, что наш заголовок IP будет заканчиваться на байтах «0164», как подчеркнуто в строке 0x0010. Мы также знаем, что опций IP нет из-за полубайтового значения 5, подчеркнутого в строке 0x0000. Благодаря этому мы знаем, что заголовок UDP будет начинаться с байтов «0035» и заканчиваться байтами «ba41». Таким образом, мы можем убедиться, что наш заголовок DNS будет начинаться с байта «ea», как подчеркнуто в строке 0x0010.

Теперь мы разберем значения заголовков DNS. Если вы проверите загруженную листовку TCP/IP и tcpdump, вы заметите, что первое поле в заголовке DNS относится к идентификационному номеру. Этому полю отводится два байта или 16 бит. Вам нужно будет написать небольшую диаграмму, подобную приведенной ниже.

| 32768 | 16384 | 8192 | 4096 | 2048 | 1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |

Теперь нам нужно взять два байта, представленных символами «ea1a», и ввести их в калькулятор, который выполнит преобразование шестнадцатеричных чисел в десятичные. Вы заметите, что как только вы преобразуете «ea1a» в десятичное число, вы действительно получите значение 59930 в приведенном выше пакете. Пока все хорошо, номер записи DNS совпадает.

Теперь мы увидим, что следующие значения, отмеченные в нашей шпаргалке SANS, имеют множество различных значений. До сих пор мы видели в основном значения, отраженные в заголовке, которые аккуратно разбивались либо на полубайт (половина байта или четыре бита), либо на полный байт или байты. Что ж, в DNS у нас есть несколько значений, содержащихся в байте. Вот почему нам нужна диаграмма, показанная выше.

Нам нужно будет взять значение двух байтов «8183» и преобразовать его в десятичное число. Из этого десятичного числа мы сможем определить, какие значения установлены, а какие нет. Ну 8183 в шестнадцатеричном или как надо писать 0x8183 выбивается в 33155 в десятичном.

Используя приведенную выше диаграмму, как уже отмечалось, мы начинаем делить 33155 на значения, присвоенные двухбайтовому полю, которые содержат значения в вашей шпаргалке, то есть: QR, код операции и так далее. Итак, мы знаем, что установлена первая позиция 32768, поэтому мы знаем, что это ответ, а не запрос. Вычтя 33155 из 32768, мы получим остаток 387.

Теперь мы вычтем 387 из следующего ближайшего соответствия. В данном случае это будет 256. Таким образом, это значение также установлено, что говорит нам о том, что установлено поле «Желаемая рекурсия» или RD. Теперь у нас есть остаток 131. Это мы вычитаем из 128 на нашей диаграмме выше, что говорит нам о том, что поле «Доступная рекурсия» установлено. Теперь у нас остается остаток 3.

Вот сложная часть. Вы должны взять это десятичное значение 3 и посмотреть на поле «Код ответа» в шпаргалке SANS под заголовком DNS. Вы увидите, что десятичное значение 3 означает, что установлен «Несуществующий домен» или NXDomain RCODE. Мы видим, что он находится в заголовке этого пакета, о чем свидетельствует подчеркнутый NXDomain.

Следуя этим значениям, нужно просто применить ту же логику к остальным значениям в заголовке DNS. Как видите, это ненамного сложнее, чем разбивать обычные пакеты TCP/IP, которые мы делали раньше. Это было немного более запутанным, поскольку теперь мы также смотрели на данные прикладного уровня. Теперь вы успешно проанализировали пакет DNS. Это умение, которым обладают немногие! На этой ноте я завершу серию из трех статей о DNS и искренне надеюсь, что она была вам полезна. Я всегда рад комментариям, поэтому, пожалуйста, не стесняйтесь писать мне. До следующего раза!

  • Понимание протокола DNS (часть 1)