Расшифровка DNS ответа rrdata для MX записей в Python Scapy - PullRequest
1 голос
/ 04 июля 2019

Я использую сниффер scapy для получения DNS-пакетов, и он работает как чудо
Проблема в том, что когда я получаю MX-записи, rrdata кодируются (struct.pack или что-то вродечто)
Как я могу расшифровать эти данные?

Например, я прослушал DNS для запроса Google MX:

def pkt_callback(pkt):
    ip = pkt['IP']
    dns = pkt['DNS']
    for i in range(dns.ancount):
            dnsrr = dns.an[i]
            print(dnsrr.rdata)

sniff(iface='enp0s25', prn=pkt_callback, filter="udp and ( port 53 )", store=0)

Я получаю это:

b'\x00\n\x05aspmx\x01l\xc0\x0c'
b'\x002\x04alt4\xc0*'
b'\x00\x1e\x04alt2\xc0*'
b'\x00\x14\x04alt1\xc0*'
b'\x00(\x04alt3\xc0*'

Что должно быть так:

10 aspmx.l.google.com.
50 alt4.aspmx.l.google.com.
30 alt2.aspmx.l.google.com.
20 alt1.aspmx.l.google.com.
40 alt3.aspmx.l.google.com.

Мне удалось извлечь поле " perf " с помощью этого:

perf = struct.unpack('!h', rrdata[0:2])[0]

Но остальные данные не так просты;моя лучшая покупка была такой:

def decode_mx_rdata(rdata):
    perf = struct.unpack('!h', rdata[0:2])[0]
    rdata = rdata[2:]

    parts = []
    while rdata:
        if len(rdata) % 2 == 0:
            l = rdata[0:2]
            p = 2
        else:
            l = rdata[0:1]+b'\x00'
            p = 1
        l = int(struct.unpack('h', l)[0])
        parts.append(rdata[p:l+p])
        rdata = rdata[l+p:]
    return perf, parts

Как я могу правильно декодировать эти данные?

...