DNS пакет

Вот формат сообщения DNS:

ID (знаменитый 🙂 Флаги
Номера запросов Номера ответов
Номер RR ответственности Номер вспомогательного RR

ЗАПРОС

ОТВЕТ

Данные етс.. Нет данных 

Структура DNS пакетов

ID идентифицирует каждый DNS пакет, так как обмен пакетами между серверами имен происходит от порта 53 к порту 53, и кроме того, запросов за
один раз может быть несколько, поэтому ID - это единственный способ 
распознавания различных DNS запросов. Мы поговорим об этом позже..

флаги

Область флагов подразделяется на несколько частей:

QR | opcode | AA| TC| RD| RA | zero | rcode

QR - если бит QR = 0, то это значит, что пакет является запросом, в
противном случае - ответом.
opcode - если значение 0, то это обычный запрос, 1 - резервный запрос, и
2 - запрос статуса (нам не нужно знать все эти режимы).
AA - если это равно 1, то это значит, что сервер имен имеет авторитетный ответ.
TC - нет данных.
RD - если этот флаг - 1, это значит "Запрос Рекурсии", например, когда bla.bibi.com просит ns.bibi.com разрешить имя, этот флаг говорит DNS принять этот запрос.
RA - если он установлен на 1, то это значит, что рекурсия доступна.
Этот бит устанавливается на 1 в ответе сервера имен, если он поддерживает рекурсию.
Zero - три ноля...
rcode - 4 бита, это поле содержит возвращаемые сообщения об ошибке на DNS запросы, если его значение равно 0, то это означает, что "ошибокнет", 3 означает "ошибку имени"

2 следующих флага не имеют особого значения для нас.


DNS запрос

Вот формат DNS запроса:

Структура вопроса

Тип вопроса

Тип запроса

Структура вопроса примерно такова. 
Пример:
www.heike.com будет [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0] 
для IP адреса то же самое 🙂

44.33.88.123.in-addr.arpa должен быть:
[2|4|4|2|3|3|2|8|8|3|1|2|3|7|i|n|-|a|d|d|r|4|a|r|p|a|0]
[примечание]: существует формат сжатия, но мы не будем его использовать.

Тип вопроса: 
вот значения, которые мы будем использовать большинство времени: 
[примечание]: Существует более 20 типов различных значений(!) и я сыт по
горло их написанием :))
имя значение
A = 1 - IP Address ( разрешение имени в IP )
PTR = 12 - Pointer ( разрешение IP в имя )

Тип запроса:
Значения те же, что и у типа вопроса (я не знаю так ли это на самом деле, 
но ведь наша цель не изучить протокол DNS от A до Z, если вы хотите, можете взглянуть на RFC от 1033 до 1035 и 1037, нашей же целью является 
глобальное изучение этого на практике!!)


DNS ответ

Ответы имеют формат, который мы называем RR.. если вы не возражаете 🙂

Вот формат ответа (RR)

Имя домена

Тип Класс
TTL (время жизни)

Длина исходных данных

 
Исходные данные

Имя домена.
Имя домена сообщается в следующем формате:
Имя домена хранится тем же образом, что и часть вопроса для запроса на 
разрешение www.heike.com, флаг "имя домена" будет содержать 
[3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]

Тип.

Флаг "тип" - тот же, что и "тип запроса" в части вопроса пакета.

Класс.
Значение флага "класс" равно 1 для Интернет данных.

Время жизни.
Этот флаг описывает время жизни информации (в секундах) в кеше сервера имен.

Длина исходных данных.
Если значение длины исходных данных, к примеру, равно 4, то это означает, что длина исходных данных равна 4 байтам.

Исходные данные: 
здесь мы вставляем IP для примера (по крайней мере в нашем случае).

Я предлагаю вашему вниманию небольшой пример, который прояснит ситуацию:

Вот что произойдет, когда ns.bibi.com запросит у ns.heike.com адрес
www.heike.com

ns.bibi.com:53 ---> [?www.heike.com] ----> ns.heike.com:53 (страшный Heike 😉

ID = 1999 QR = 0 opcode = 0 RD = 1
номера вопросов = htons(1) номера ответов = 0
номер RR ответственности = 0  номер вспомогательного RR = 0
<часть вопроса>
имя вопроса = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]
тип вопроса = htons(1) тип запроса=htons(1)

это что касается вопроса.

Давайте теперь приглядимся к примеру ответа ns.heike.com

ns.heike.com:53 -->[IP www.heike.com это 31.33.7.44] --> ns.bibi.com:53

ID = 1999 QR=1 opcode=0 RD=1 AA =1 RA=1
номера вопросов = htons(1) номера ответов = htons(1)
номер RR ответственности = 0 номер вспомогательного RR = 0
имя вопроса = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]
тип вопроса = htons(1) тип запроса = htons(1)
имя домена = [3|w|w|w|5|h|e|i|k|e|3|c|o|m|0]
тип = htons(1) класс = htons(1)
время жизни = 999999
длина исходных данных=
htons(4)
исходные данные=inet_addr("31.33.7.44")

Да! Пока это все :))

Вот анализ:
В ответе QR = 1 так как это - ответ 🙂
AA = 1 так как сервер имен ответственен за этот домен
RA = 1 так как рекурсия доступна

Хорошо =) Я надеюсь, вы поняли, что вам нужно для дальнейших
действий.

Check Also

В королевстве PWN. Атака ret2bss, криптооракулы и реверс-инжиниринг на виртуалке Smasher с Hack The Box

В этой статье тебя ждут: низкоуровневая эксплуатация веб-сервера со срывом стека и генерац…

Оставить мнение