Перехват DNS-запросов - вывод QR, Opccode, AA, TC и т. Д. - PullRequest
0 голосов
/ 28 июня 2018

Пытался перехватить входящие DNS-запросы, раскручивая небольшой сервер udp, и в итоге пытался https://stackoverflow.com/a/16981944/9488865.

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Чтобы вывести QR, код операции, AA, TC и т. Д., Мы делаем:

DNS_QUERY_MESSAGE_HEADER = struct.Struct("!6H")
id, misc, qdcount, ancount, nscount, arcount = DNS_QUERY_MESSAGE_HEADER.unpack_from(message)

qr = (misc & 0x8000) != 0
opcode = (misc & 0x7800) >> 11
aa = (misc & 0x0400) != 0
tc = (misc & 0x200) != 0
rd = (misc & 0x100) != 0
ra = (misc & 0x80) != 0
z = (misc & 0x70) >> 4
rcode = misc & 0xF

Хотя Scapy делает все это очень просто (https://stackoverflow.com/a/6732956/9488865), Я хотел бы воспользоваться этой возможностью, чтобы узнать немного больше здесь.

Как я могу найти использование 0x8000, 0x7800, 0x0400 .. 0x70, 0xF и т. Д. Для выполнения этих операций AND? Как мы можем найти и зафиксировать эти значения?

1 Ответ

0 голосов
/ 28 июня 2018

Формат проводника DNS определен в https://www.rfc -editor.org / rfc / rfc1035.txt

Например, у вас есть это:

4.1.1. Header section format

The header contains the following fields:

                                    1  1  1  1  1  1
      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                      ID                       |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    QDCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    ANCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    NSCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    ARCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Вверху вы видите байты, и, следовательно, покажут необходимые смещения, которые необходимо применить для получения каждой конкретной детали.

Вы также можете изучить, как это делает текущая библиотека парсеров / генераторов DNS, например, в Python: https://github.com/rthalley/dnspython/blob/master/dns/message.py#L732

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