def _make_txt(self, packet: Packet) -> Packet: try: subdomain, *domains = packet.subdomain_from_qname.split(".") domains = domains[::-1] data = Domain.decode(subdomain) except binascii.Error: # couldn't decode, drop the packet and do nothing logger.debug("Couldn't decode subdomain in %s", packet.qname) return return Packet.build_reply( { "src": self.host_ip, "dst": packet.src, "dport": packet.sport, "dns": { "id": packet.id, "question": packet.question, "messages": [ self._make_message( packet.qname, self.on_query(data, packet.src, domains)), ], }, }, self.domain, )
def _make_a(self, packet: Packet) -> Packet: if self.config is None: return # if we receive a DNS A query for a subdomain, answer it with an ip from # the configuration file qname = packet.qname[:-1] # remove final '.' if qname in self.config.sections(): return Packet.build_reply( { "src": self.host_ip, "dst": packet.src, "dport": packet.sport, "dns": { "id": packet.id, "question": packet.question, "messages": [ DNSRR( rrname=packet.qname, rdata=self.config[qname]["ip"], type=DNSAnswer.Type.HostAddr, ttl=int(self.config[qname]["ttl"]), ), ], }, }, self.domain, )
def dns_responder(self, pkt: IP): packet = Packet(pkt, self.domain) if packet.is_valid_dnsquery(): self.logger.info("got a packet from %s:%i", packet.src, packet.sport) subdomain = packet.subdomain_from_qname.split('.')[0] self.logger.debug("subdomain: %s", subdomain) try: data = Domain.decode(subdomain) except binascii.Error: # couldn't decode, drop the packet and do nothing return # keep destination answer = Packet.build_reply( { "src": self.host_ip, "dst": packet.src, "dport": packet.sport, "dns": { "id": packet.id, "question": packet.question, # TODO ensure that we're under the 500 bytes limit "messages": [ DNSRR( rrname=packet.qname, rdata=Content.encode( self.on_query(data, packet.src)), type=DNSAnswer.Type.Text, ttl=60, # a minute long ), ], }, }, self.domain, ) self.logger.debug("Answering %s", answer.dns.summary()) send(answer.packet, verbose=0, iface=self.interface)
def dns_responder(self, pkt: IP): packet = Packet(pkt, self.domain) if packet.is_valid_dnsquery(): subdomain = packet.subdomain_from_qname logging.debug("subdomain: %s", subdomain) data = Domain.decode(subdomain) logging.debug("decoded: %s", data) # keep destination logging.debug("packet from %s:%i", packet.src, packet.sport) answer = Packet.build_reply( { "src": self.host_ip, "dst": packet.src, "dport": packet.sport, "dns": { "id": packet.id, # TODO ensure that we're under the 500 bytes limit "messages": [ DNSRR( rrname=packet.qname, rdata=Content.encode("test"), type=DNSAnswer.Type.Text, ), ], }, }, self.domain, ) logging.debug("incomming packet type: %s", hex(packet.question.qtype)) logging.debug(answer.dns.summary()) send(answer.packet, verbose=2, iface=self.interface)