Понимание того, как DNS-запросы работают на более глубоком уровне - PullRequest
0 голосов
/ 09 апреля 2020

Сейчас 04:40 утра, и я застрял на чем-то, чего я просто не понимаю. Я пытаюсь найти доменные имена серверов напрямую, используя протокол DNS. Если я отправляю host -t ns google.com 1.1.1.1 и отслеживаю его с помощью Wireshark, я вижу полный запрос DNS-запроса. Однако я не могу понять, почему некоторые символы ASCII используются один раз, но не в другой раз. Вот пример:

0000   70 4d 7b 94 dd e0 00 d8 61 a9 c5 ec 08 00 45 00   pM{.....a.....E.
0010   00 38 d6 ff 00 00 80 11 9f 50 c0 a8 01 bb 01 01   .8.......P......
0020   01 01 e8 40 00 35 00 24 a0 19 9e f7 01 00 00 01   ...@.5.$........
0030   00 00 00 00 00 00 06 67 6f 6f 67 6c 65 03 63 6f   .......google.co
0040   6d 00 00 02 00 01                                 m.....

В этом DNS-запросе я ищу серверы имен для google.com. Фактический запрос начинается с 06 07.

06 в ASCII - это ACK / Acknowledgement.


Теперь, если мы посмотрим на gmail.com вместо этого:

0000   70 4d 7b 94 dd e0 00 d8 61 a9 c5 ec 08 00 45 00   pM{.....a.....E.
0010   00 37 d7 00 00 00 80 11 9f 50 c0 a8 01 bb 01 01   .7.......P......
0020   01 01 e8 58 00 35 00 23 8f cc 6f e2 01 00 00 01   ...X.5.#..o.....
0030   00 00 00 00 00 00 05 67 6d 61 69 6c 03 63 6f 6d   .......gmail.com
0040   00 00 02 00 01                                    .....

запрос начнется вместо 05 67

05 - это ENQ / Запрос.


Почему они отличаются? Если я пытаюсь отправить 06 вместо 05, DNS-сервер не дает мне ответа, но Wireshark сообщает мне:

Неизвестная расширенная метка

Я видел 05, 06 и 09. 09 мой самый большой "ват" за все время, потому что это HT / Horizontal Tab.

Кто-нибудь с большим знанием DNS, кто может помочь мне здесь? Я не ищу "просто используйте команду dig / nslookup / host". В настоящее время я пытаюсь немного изучить протокол DNS, и это вещь, которую я не понимаю.

Хорошо прочитал, где я получил много помощи: http://dev.lab427.net/dns-query-wth-netcat.html

1 Ответ

2 голосов
/ 09 апреля 2020

Для двоичных протоколов, подобных этому, нельзя предполагать, что каждый байт соответствует соответствующему символу ASCII.

Взгляните на раздел 4.1.2 DNS RF C (https://www.ietf.org/rfc/rfc1035.txt).

Доменное имя в запросе DNS разбито на «метка». Для каждой метки первый байт - это длина метки, а затем записываются байты для строки.

Для вашего примера на Google.com метками являются "google" и "com". 06 - это число байтов в первой метке. Далее следуют байты для "Google". Тогда 03 - это количество байтов в метке "com". После байтов «com» ​​байт 00 является меткой NULL для обозначения конца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...