Wie sende ich DNS Cookies mit dnslib?
Ich möchte mit dnslib die DNS-Antworten von den jeweiligen Anfragen mit einem DNS-Cookie versehen. Ich habe auch bereits etwas dafür in meinen Code implementiert, jedoch funktioniert das noch nicht so. Kann mir jemand sagen, was ich da brauche?
Der Code:
import socket
from dnslib import *
DNS_PORT = 53
dns_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
dns_socket.bind(('', DNS_PORT))
print(f"DNS-Server hört auf Port {DNS_PORT}...")
def dns_forward(domain):
try:
ip_address = socket.gethostbyname(domain)
return ip_address
except socket.error:
return '185.199.111.153' #Error 404
while True:
data, address = dns_socket.recvfrom(1024)
dns_message = DNSRecord.parse(data)
dns_request = str(dns_message.q.qname)
dns_answer = dns_forward(dns_request)
client_ip = address[0]
client_port = address[1]
dns_cookie = ("4096")
if client_ip == '192.168.0.113'
dns_response = DNSRecord(DNSHeader(id=dns_message.header.id, qr=1, aa=1, ra=1), q=dns_message.q)
dns_response.add_answer(RR(dns_request, QTYPE.A, rdata=A(dns_answer)))
dns_response.add_ar(RR(dns_request, QTYPE.OPT, rdata=TXT(dns_cookie)))
dns_socket.sendto(dns_response.pack(), address)
print(f"DNS-Anfrage von {client_ip} mit Port {client_port} für {dns_request} die Antwort ist {dns_answer}")
Die Fehlermeldung:
Traceback (most recent call last):
File "c:\Users\Stoppersocke\Documents\Projects\MDM Bypass\test5.py", line 35, in <module>
dns_socket.sendto(dns_response.pack(), address)
^^^^^^^^^^^^^^^^^^^
File "C:\Users\Stoppersocke\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\dnslib\dns.py", line 339, in pack
ar.pack(buffer)
File "C:\Users\Stoppersocke\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\dnslib\dns.py", line 885, in pack
for opt in self.rdata:
TypeError: 'TXT' object is not iterable
1 Antwort
Die Fehlermeldung besagt, dass das
TXT
-Objekt nicht iterierbar ist. In der Tat, das
TXT
-Objekt stellt normalerweise einen einzelnen TXT Resource Record dar, daher ist es nicht notwendig, es zu iterieren. Um einen DNS-Cookie als OPT RR zu senden, sollte der
DNSRecord
mit dem
edns
-Flag versehen werden. Das
edns
-Flag wird durch das Setzen des
rcode
-Felds auf
DNSHeader.RCODE_OK
aktiviert. Hier ist ein Beispielcode, der zeigt, wie man einen DNS-Cookie als OPT RR mit dnslib sendet:
python
Copy code
import socket from dnslib import * DNS_PORT = 53 dns_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) dns_socket.bind(('', DNS_PORT))print(f"DNS-Server hört auf Port {DNS_PORT}...") def dns_forward(domain): try: ip_address = socket.gethostbyname(domain) return ip_address except socket.error: return'185.199.111.153' #Error 404 while True: data, address = dns_socket.recvfrom(1024) dns_message = DNSRecord.parse(data) dns_request = str(dns_message.q.qname) dns_answer = dns_forward(dns_request) client_ip = address[0] client_port = address[1] dns_cookie = ("4096") if client_ip == '192.168.0.113': dns_response = DNSRecord(DNSHeader(id=dns_message.header.id, qr=1, aa=1, ra=1, rcode=DNSHeader.RCODE_OK), q=dns_message.q) dns_response.add_answer(RR(dns_request, QTYPE.A, rdata=A(dns_answer))) dns_response.add_ar(RR(dns_request, QTYPE.OPT, rdata=OPT(rdata=[TXT(dns_cookie)]))) dns_socket.sendto(dns_response.pack(), address)print(f"DNS-Anfrage von {client_ip} mit Port {client_port} für {dns_request} die Antwort ist {dns_answer}")
Hier wird ein
OPT
-RR mit einem einzelnen
TXT
-RR, der den DNS-Cookie enthält, erstellt und als Additional Record (AR) zur DNS-Antwort hinzugefügt. Das
rcode
-Feld im
DNSHeader
wird auf
DNSHeader.RCODE_OK
gesetzt, um den Einsatz von EDNS zu signalisieren.
Traceback (most recent call last):
File "c:\Users\Stoppersocke\Documents\Projects\MDM Bypass\test4.py", line 26, in <module>
dns_response = DNSRecord(DNSHeader(id=dns_message.header.id, qr=1, aa=1, ra=1, rcode=DNSHeader.RCODE_OK), q=dns_message.q)
^^^^^^^^^^^^^^^^^^
AttributeError: type object 'DNSHeader' has no attribute 'RCODE_OK'
DNSHeader hat kein Attribut namens "RCODE_OK"