summaryrefslogtreecommitdiff
path: root/8_doh_fake/degrade_phase1.py
blob: e6efb6019e99f3ab5db3ad7e8d6446fe720632a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import socket
import ssl
import dns.message
import dns.query
import dns.rcode
import argparse
from logger_DoE import *
import pandas as pd

domains = set(pd.read_csv('domains.csv').domain)

upstream_server = '223.5.5.5'

# 创建监听socket
listener = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
listener.bind(('127.0.0.54', 53))

parser = argparse.ArgumentParser()
parser.add_argument('-pass', '--passdoe', default=0)
parser.add_argument('-tamper', '--tamper', default='')
parser.add_argument('-inject', '--inject', default='')
parser.add_argument('-ns', '--ns', default='1.1.1.1')
args = parser.parse_args()
tamper = args.tamper +'.'
inject = args.inject +'.'
ns = args.ns

logger = InfoLogger(interval=1)
logger.log_info(LogLevel.INFO, "程序开始运行")

while True:
    # 接收DNS请求
    data, addr = listener.recvfrom(1024)
    #print(dns.message.from_wire(data))
    data = dns.message.from_wire(data)
    query_r = data.question[0].name.to_text()[:-1]
    if query_r in domains and args.passdoe==0:
        # print(data.question[0].name.to_text()[:-1])
        # print(addr)
        #print(data)
        #print('对DoE域名的DNS请求:', query_r)
        logger = InfoLogger(interval=1)
        logger.log_info(LogLevel.INFO, f'对DoE域名的DNS请求:{query_r}')
        # # 创建TLS连接并发送DNS请求到上游服务器
        resp = dns.query.udp(
            q=data,
            where=upstream_server,
            timeout=10)
        #print('DNS响应:', resp.answer)
        resp.answer = [dns.rrset.from_text(query_r+'.', 3600, dns.rdataclass.IN, dns.rdatatype.A, '10.10.10.10')]
        #print(f'对DoE域名{query_r}的DNS请求已阻断,返回10.10.10.10')
        logger.log_info(LogLevel.INFO, f'对DoE域名{query_r}的DNS请求已阻断,返回10.10.10.10')
        logger.log_info(LogLevel.PAYLOAD, str(resp.answer.__str__()))
        # with socket.create_connection((upstream_server,853)) as sock:
        #     with context.wrap_socket(sock, server_hostname=upstream_server[0]) as tls_sock:
        #         tls_sock.sendall(data.to_wire())
        #         resp = tls_sock.recv(4096)

        # 将上游服务器的响应发送回客户端
        listener.sendto(resp.to_wire(), addr)
    else:
        resp = dns.query.udp(
            q=data,
            where=upstream_server,
            timeout=10)
        if str(resp.question[0].name) == tamper and int(resp.question[0].rdtype) == 1:
            print('---tamper---', tamper)
            resp.answer = [
                dns.rrset.from_text(tamper, 3600, dns.rdataclass.IN, dns.rdatatype.A, '8.8.8.8')]
        if str(resp.question[0].name) == inject:
            print('---inject---', inject)
            resp.additional = [
                dns.rrset.from_text(inject, 3600, dns.rdataclass.IN, dns.rdatatype.NS, 'ns.' + inject.split('.', 1)[1]),
                dns.rrset.from_text('ns.' + inject.split('.', 1)[1], 3600, dns.rdataclass.IN, dns.rdatatype.A, ns)]
        listener.sendto(resp.to_wire(), addr)
        #break