Beispiel #1
0
    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,
        )
Beispiel #2
0
    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,
            )
Beispiel #3
0
    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)
Beispiel #4
0
    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)