TTL = 3600
+class UnsolicitedNsSpoofer(ResponseSpoofer, mode="unsolicited-ns"):
+
+ qname = "trigger.victim."
+
+ async def get_responses(
+ self, qctx: QueryContext
+ ) -> AsyncGenerator[ResponseAction, None]:
+ response = qctx.prepare_new_response(with_zone_data=False)
+
+ txt_rrset = dns.rrset.from_text(
+ qctx.qname,
+ TTL,
+ qctx.qclass,
+ dns.rdatatype.TXT,
+ '"spoofed answer with extra NS"',
+ )
+ response.answer.append(txt_rrset)
+
+ ns_rrset = dns.rrset.from_text(
+ "victim.", TTL, qctx.qclass, dns.rdatatype.NS, "ns.attacker."
+ )
+ response.authority.append(ns_rrset)
+
+ yield DnsResponseSend(response, authoritative=True)
+
+
def main() -> None:
spoofing_server().run()
ns4 = servers["ns4"]
send_trigger_query(ns4, "trigger.")
check_domain_hijack(ns4)
+
+
+def test_bailiwick_unsolicited_authority(servers: Dict[str, NamedInstance]) -> None:
+ set_spoofing_mode(ans1="none", ans2="unsolicited-ns")
+
+ ns4 = servers["ns4"]
+ prime_cache(ns4)
+ send_trigger_query(ns4, "trigger.victim.")
+ check_domain_hijack(ns4)