Требуются ли права root / выше для получения ответа от DNS? - PullRequest
0 голосов
/ 24 марта 2019

Добрый день,

Я не уверен, где мне следует разместить этот вопрос, я изучаю DNS и как он работает, и, как я понимаю, я отправляю запрос на UDP-порт 53 на сервер, и хост должен ответить мне правильно на этом порту ?

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

Как это возможно, если он не может прослушивать порт 53, не имея root в системе?

ДЕТАЛИ ПАКЕТА DNS

;DNS HEADER;
   ; AA AA - ID
   ; 01 00 - Query parameters
   ; 00 01 - Number of questions
   ; 00 00 - Number of answers
   ; 00 00 - Number of authority records
   ; 00 00 - Number of additional records
   ; DNS QUESTION --
   ; 07 - 'example' has length 7, ;so change this to be the length of domain ; keep in ming there are not '.' in the question.
   ; 65 - e
   ; 78 - x
   ; 61 - a
   ; 6D - m
   ; 70 - p
   ; 6C - l
   ; 65 - e

   ; 03 - subdomain '.com'  length 03  ; change this to be the length of type.

   ; 63 - c
   ; 6F - o
   ; 6D - m

КОД:

import binascii
import socket


def send_udp_message(message, address, port):
    """send_udp_message sends a message to UDP server

    message should be a hexadecimal encoded string
    """
    message = message.replace(" ", "").replace("\n", "")
    server_address = (address, port)

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        sock.sendto(binascii.unhexlify(message), server_address)
        data, _ = sock.recvfrom(4096)
    finally:
        sock.close()
    return binascii.hexlify(data).decode("utf-8")


def format_hex(hex):
    """format_hex returns a pretty version of a hex string"""
    octets = [hex[i:i+2] for i in range(0, len(hex), 2)]
    pairs = [" ".join(octets[i:i+2]) for i in range(0, len(octets), 2)]
    return "\n".join(pairs)


message = "AA AA 01 00 00 01 00 00 00 00 00 00 " \
"07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00 01"

response = send_udp_message(message, "8.8.8.8", 53)
print(format_hex(response))

РЕПЛИКА:

aa aa
81 80
00 01
00 01
00 00
00 00
07 65
78 61
6d 70
6c 65
03 63
6f 6d
00 00
01 00
01 c0
0c 00
01 00
01 00
00 32
98 00
04 5d
b8 d8
22

Если вы посмотрите на последние четыре байта, то увидите, что это IP-адрес example.com в шестнадцатеричном формате 5db8d822

Вы можете пойти сюда, чтобы проверить это. Конвертер HEX в IP Online

1 Ответ

3 голосов
/ 24 марта 2019

Нет, ваш исходный порт не является портом 53. Пользовательским процессам назначаются номера исходящих портов свыше 1023, которые непривилегированы.

Простой синхронный DNS-клиент Python будет в основном блокировать и удерживать этот порт открытым до тех пор, покасервер отвечает.Отправляемый вами IP-пакет содержит информацию, которая нужна серверу, чтобы узнать, где ответить (это в заголовках самого IP-пакета перед полезной нагрузкой DNS-запроса).

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