Sign Up Login Videos
1

DNS Does not work on "Make your Own DNS Server in Python"

1

DNS Does not work on "Make your Own DNS Server in Python"

The dns doesnt work if i do this it gives this error: [HTML_REMOVED]

Traceback (most recent call last):
  File "c:\Users\engin\Downloads\All files\dns.py", line 160, in <module>
    r = buildresponse(data)
  File "c:\Users\engin\Downloads\All files\dns.py", line 155, in buildresponse
    dnsbody += rectobytes(domainname, rectype, record["ttl"], record["value"])
TypeError: string indices must be integers

and i did write this code:

import socket, glob, json

port = 53
ip = '127.0.0.1'

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((ip, port))

def load_zone():
    jsonzone = {}
    zonefiles = glob.glob('zones/*.zone')


    for zone in zonefiles:
        with open(zone) as zonedata:
            data = json.load(zonedata)
            zonename = data["$origin"]
            jsonzone[zonename] = data
    return jsonzone

zonedata = load_zone()

def getFlags(flags):
    byte1 = bytes(flags[:1])
    byte2 = bytes(flags[1:2])

    rflags = ''

    QR = '1'

    OPCODE = ''

    for bit in range(1,5):
        OPCODE += str(ord(byte1) & (1<<bit))

    AA = '1'

    TC = '0'

    RD = '0'

    RA = '0'

    Z= '000'

    RCODE = '0000'

    return(int(QR + OPCODE + AA + TC + RD, 2).to_bytes(1, byteorder='big') + int(RA + Z + RCODE, 2).to_bytes(1, byteorder='big'))

def getquestiondomain(data):
    state = 0
    expectedlenght = 0
    domainsting = ''
    domainparts = []
    x = 0
    y = 0

    for byte in data:
        if state == 1:
            if byte != 0:
                domainsting += chr(byte)
            x += 1
            if x == expectedlenght:
                domainparts.append(domainsting)
                domainsting = ''
                state = 0
                x = 0
            if byte == 0:
                domainparts.append(domainsting)
                break
        else:
            state = 1
            expectedlenght = byte
        # x += 1
        y += 1

    questiontype = data[y + 1 : y + 3]

    return(domainparts, questiontype)

def getzone(domain):
    global zonedata
    zone_name = '.'.join(domain)
    return zonedata[zone_name]

def getrecs(data):
    domain, questiontype = getquestiondomain(data)
    qt = ''

    if questiontype == b'\x00\x01':
        qt = 'a'

    zone = getzone(domain)

    return (zone, qt, domain)

def rectobytes(domainname, rectype, recttl, recval):
    rbytes = b'\xc0\x0c'
    if rectype == 'a':
        rbytes = rbytes + bytes([0]) + bytes([1])

    rbytes = rbytes + bytes([0]) + bytes([1])

    rbytes += int(recttl).to_bytes(4, byteorder='big')

    if rectype == 'a':
        rbytes = rbytes + bytes([0]) + bytes([4])

        for part in recval.split('.'):
            rbytes += bytes([int(part)])
    return rbytes

def buildquestion(domainname, rectype):
    qbytes = b''

    for part in domainname:
        lenght = len (part)
        qbytes += bytes([lenght])

        for char in part:
            qbytes += ord(char).to_bytes(1, byteorder='big')
        if rectype == 'a':
            qbytes += (1).to_bytes(2, byteorder='big')
        qbytes += (1).to_bytes(2, byteorder='big')
    return qbytes

def buildresponse(data):
    TransactionID = data[:2]

    # TID = ''
    # for byte in TransactionID:
        # TID += hex(byte)

    Flags = getFlags(data[2:4])

    QDCOUNT = b'\x00\x01'

    # getquestiondomain(data[12:])

    ANCOUNT = len(getrecs(data[12:])[0]).to_bytes(2, byteorder='big')

    NSCOUNT = (0).to_bytes(2, byteorder='big')

    ARCOUNT = (0).to_bytes(2, byteorder='big')

    dnsheader = TransactionID + Flags + QDCOUNT + ANCOUNT + NSCOUNT + ARCOUNT

    dnsbody = b''

    records, rectype, domainname = getrecs(data[12:])

    dnsquestion = buildquestion(domainname, rectype)

    for record in records:
        dnsbody += rectobytes(domainname, rectype, record["ttl"], record["value"])
    return dnsheader + dnsquestion + dnsbody

while 1:
    data, addr = sock.recvfrom(512)
    r = buildresponse(data)
    sock.sendto(r, addr)

and this value record in the for at the very bottom of buildresponse it just prints out @origin

pls help!

  • Python
  • Other

0 Replies

x