В предыдущих двух частях статьи мы рассмотрели DNS на довольно высоком уровне. Мы не углублялись в детали, необходимы для системного администратора, а сконцентрировались больше на понимании того, что этот протокол делает, и как он это делает. Позднее мы также посмотрели на то, как выглядит пакет DNS в сети, где он находится. В этой последней части статьи о DNS, мы рассмотрим заголовок пакета DNS. Это поможет вам лучше понять сам протокол, и то, как он работает.
Мои мысли по этому поводу, что возможность полностью разобрать пакет по частям придаст вам уверенность при работе с DNS. Это в свою очередь позволит вам приблизиться к любой проблеме в сети с пониманием сути дела. А уверенность такого типа придет лишь при полном понимании не только того, как работает протокол, но и того, как он выглядит в формате пакета.
Давайте разберем пакет на части!
Перед тем, как мы разберем упомянутый выше пакет на части, вам необходимо убедиться, что у вас есть SANS TCP/IPtcpdump flyer расположенный внизу страницы. Это позволит вам подойти к пакету DNS с минимумом затрат. Теперь у буду приводить комментарии по поводу пакета.
01:00:09.684739 192.168.1.200.53 > 192.168.1.100.616: [udp sum ok] 59930 NXDomain 0/1/0 (102) (ttl 58, id 55787, len 130)
0x0000 4500 0082 d9eb 0000 3a11 f873 c0a8 01c8 E.......:..s..e.
0x0010 c0a8 0164 0035 0268 006e ba41 ea1a 8183 .....5.h.n.A....
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, следущий за направляющим символом, который означает как проходил диалог.
Далее идет [udp sum ok], означающий, что контрольная сумма udp правильна. Далее идет номер транзакции DNS – 59930. Он, как упоминалось ранее, используется, чтобы отследить DNS запросы и ответы инициатором запроса.
Далее мы видим RCODE NXDomain, что означает, что домен, разрешение которого мы запросили, не существует. Номера 0/1/0 означают, что у нас ноль записей с ответом, одна официальная запись и ноль дополнительных записей в этом пакете.
Далее у нас есть значение 102 в скобках. Это число данных DNS, содержащихся в этом пакете. Далее идет значение ttl равное 58, и IP ID равный 55787, и наконец, длина всего пакета, равная 130. Важно запомнить, что поле “len 130”, как видно выше в пакете, ссылается на длину всего пакета, и что он включает как заголовок протокола, так и данные, которые он представляет.
Мы не будем останавливаться на шестнадцатиричном значении, которое представляет заголовок IP и UDP.
Мы знаем, что наш заголовок IP заканчивается на байтах “0164”, как подчеркнуто в линии 0×0010. Согласно этому, мы знаем, что заголовок UDP начинается с байтов “0035” и заканчивается на байтах “ba41”. Из этого мы можем заключить, что наш заголовок DNS начнется с байта begin at byte “ea” что подчеркивается в линии 0×0010.
Теперь мы рассмотрим значения DNS заголовка. Если вы проверите ваш TCP/IP и tcpdump flyer, который вы загрузили, вы обратите внимание, что первое поле в заголовке DNS относится к номеру ID. Это поле занимает два байта или 16 бит. Вам необходимо выписать маленькую таблицу, наподобие той, что представлена ниже.
| 32768 | 16384 | 8192 | 4096 | 2048 | 1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Все, что нам необходимо теперь сделать, это взять два байта, представляемые символами “ea1a” и ввести их в калькулятор, который выполнит преобразование шестнадцатиричного значения к десятичному. В результате преобразования в действительности получите значение 59930 в пакете выше. Дальше – лучше, номер записи DNS совпадает.
Далее мы увидим, что следующие значения, как упоминалось в нашей таблице SANS, имеют набор различных значений. Мы видим, что большинство значений отражены в заголовке, который четко разбивается на часть байта или полного байта. В DNS у нас несколько значений содержится в одном байте. Поэтому нам необходима таблица, показанная выше.
Нам необходимо взять значение двух байтов “8183” и преобразовать их к десятичному числу. По этому десятичному числу мы сможем определить, какие значения установлены, а какие нет. Шестнадцатиричное значение 8183 или правильнее записать 0×8183 преобразуется к десятичному 33155.
Используя таблицу, мы начинаем делить 33155 на значения, содержащихся в двух байтовых полях, которые содержат значения вашей таблицы, т.е.: QR, Opcode, и т.д. Поэтому мы знаем, что задана первая позиция 32768, что соответствует ответу. Отняв от 33155 32768, мы получаем остаток 387.
Теперь, вычитаем от 387 ближайшее число из последовательности. В нашем случае это 256. Это значение также установлено, и мы получаем, что поле “Recursion Desired” или RD задано. Теперь мы получаем остаток 131. От этого значения мы отнимаем 128, согласно нашей таблице, которая говорит нам, что задано поле “Recursion Available”. Теперь, после вычитания у нас остается значение 3.
Теперь осталась сложная часть. Вы должны взять это десятичное значение 3 и посмотреть на ваше поле “Response code” в вашей таблице SANS, под заголовком DNS. Вы увидите, что это десятичное значение отображает, что установлено поле “Non-existent domain” или NXDomain RCODE. Мы можем видеть, что он располагается в заголовке этого пакета, что подтверждает NXDomain.
Согласно этим значениям, это просто способ использования аналогичной логики к остальным значениям в заголовке DNS. Как вы можете увидеть, это не намного сложнее, чем разбор обыкновенного пакета, что мы делали перед этим. Это было лишь немного более запутанным, когда мы рассматривали данные уровня приложения. Теперь вы успешно разобрали пакет DNS. А это умеют немногие люди! DNS, состоящую из трех частей, и я искренне надеюсь, что она была полезна для вас. Я всегда приветствую комментарии, поэтому напишите мне. До встречи!
Автор: Дон Паркер (Don Parker)
Взято с netdocs.ru
One Comment