-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
60 lines (44 loc) · 1.83 KB
/
main.py
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
import socket
import socketserver
import threading
from dnslib import DNSRecord
class TCPRequestHandler(socketserver.BaseRequestHandler):
def handle(self) -> None:
conn = self.request
while True:
data = conn.recv(1024)
if not data:
break
parsed_packet = DNSRecord.parse(data[2:])
print("TCP from connected user: " + str(parsed_packet))
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
dns_host = "1.1.1.1"
dns_port = 53
client_socket.sendto(data[2:], (dns_host, dns_port))
dns_response, source_address = client_socket.recvfrom(1024)
client_socket.close()
response = (b'\x00' + chr(len(dns_response)).encode() + dns_response)
print(response)
conn.sendall(response)
class UDPRequestHandler(socketserver.BaseRequestHandler):
def handle(self):
data = self.request[0].strip()
csocket = self.request[1]
print("{} wrote:".format(self.client_address[0]))
print(data)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
dns_host = "1.1.1.1"
dns_port = 53
client_socket.sendto(data, (dns_host, dns_port))
received_data, dns_addr = client_socket.recvfrom(1024)
print(received_data)
csocket.sendto(received_data, self.client_address)
if __name__ == "__main__":
with socketserver.ThreadingTCPServer(
("0.0.0.0", 5000), TCPRequestHandler
) as tcpserver, socketserver.UDPServer(("0.0.0.0", 5000), UDPRequestHandler) as udpserver:
tcpserver.daemon_threads = True
tcp_thread = threading.Thread(target=tcpserver.serve_forever)
tcp_thread.start()
udpserver.daemon_threads = True
udpserver.serve_forever()