NFQUEUE와 Scapy를 사용하여 UDP DNS 요청을 TCP DNS 요청으로 변환 한 다음 TCP DNS resonance를 기반으로 만들어진 UDP 패킷으로 UDP DNS 요청에 응답하려고합니다. 이것은 내가 지금까지 쓴 스크립트입니다 :파이썬 UDP DNS에서 TCP DNS 변환기
#! /usr/bin/env python2.7
from scapy.all import *
from netfilterqueue import NetfilterQueue
import os
import dns.resolver
myResolver = dns.resolver.Resolver()
def resolv_dns(payload):
udp_query_pkt = IP(payload.get_payload())
domain = udp_query_pkt[DNS].qd.qname
ip_addrs = myResolver.query(domain, "A", tcp=True)
if not udp_query_pkt.haslayer(DNSQR):
payload.set_verdict(nfqueue.NF_ACCEPT)
else:
if domain in udp_query_pkt[DNS].qd.qname:
print str(ip_addrs[0])
udp_resp_pkt = IP(dst=udp_query_pkt[IP].src, src=udp_query_pkt[IP].dst)/\
UDP(dport=udp_query_pkt[UDP].sport, sport=udp_query_pkt[UDP].dport)/\
DNS(id=udp_query_pkt[DNS].id, qr=1, aa=1, qd=udp_query_pkt[DNS].qd,\
an=DNSRR(rrname=udp_query_pkt[DNS].qd.qname, ttl=10, rdata=str(ip_addrs[0])))
send(udp_resp_pkt)
payload.drop()
nfqueue = NetfilterQueue()
nfqueue.bind(1, resolv_dns)
try:
os.system("iptables -A OUTPUT -p udp --dport 53 -j NFQUEUE --queue-num 1")
print "[*] waiting for data"
nfqueue.run()
except KeyboardInterrupt:
os.system("iptables -D OUTPUT -p udp --dport 53 -j NFQUEUE --queue-num 1")
pass
스크립트의 문제는 작동하지 않는다는 것입니다!
사실 나는 와이어 샤크에서 correponding DNS 패킷을 볼 수 있고 괜찮아 보인다
을하지만 어떤 웹 사이트를 열 수 없습니다! 실제로 UDP DNS 요청 시간이 초과되었습니다 :
[email protected]:~$ dig www.xyw.com
; <<>> DiG 9.10.3-P4-Ubuntu <<>> www.xyw.com
;; global options: +cmd
;; connection timed out; no servers could be reached
무엇이 잘못 되었습니까?
업데이트 :에 (피에르의 대답은, 내가 (대신 보낸 DNS 쿼리의)에 NFQUEUE에 수신 된 UDP의 DNS 응답을 보내도록 먼저, iptable 규칙을 변경 한 후 나는 다음과 같이 resolv_dns
기능을 수정
@ 후 UDP DNS 응답의 IP 주소를 TCP DNS 쿼리를 사용하여받은 새 IP 주소로 바꿉니다.) :
def resolv_dns(packet):
pkt = IP(packet.get_payload())
domain = pkt[DNS].qd.qname
ip_addrs = myResolver.query(domain, "A", tcp=True)
pkt[DNS].an.rdata = str(ip_addrs[0])
packet.set_payload(str(pkt))
packet.accept()
그래도 작동하지 않습니다!