我想使用 dnslib 为来自各个请求的 DNS 响应提供 DNS cookie。我已经在我的代码中为此实现了一些东西,但它还不能那样工作。有人可以告诉我那里需要什么吗?
Python代码:
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}")
错误信息:
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
我已经尝试用“OPT”替换“TXT”部分。但是这个选项不存在。
您的代码中的问题是您正在尝试迭代 RR 记录中的 TXT 对象,该对象不可迭代。相反,您应该使用 dns_cookie 值创建一个 OPT 记录,并将其添加到 DNS 响应的附加记录部分。
这是适合您的修改后的代码:
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_opt = OPT(dns_cookie)
dns_response.add_ar(dns_opt)
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}")
在这段代码中,我们使用 dns_cookie 值创建一个 OPT 对象,并使用 DNSRecord 对象的 add_ar 方法将其添加到附加记录部分。这应该可以解决问题并允许您使用 DNS cookie 发送 DNS 响应