TTL = 3600
+class SiblingNsSpoofer(ResponseSpoofer, mode="sibling-ns"):
+
+ qname = "trigger."
+
+ 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)
+
+ a_rrset = dns.rrset.from_text(
+ "ns.attacker.", TTL, qctx.qclass, dns.rdatatype.A, ATTACKER_IP
+ )
+ response.additional.append(a_rrset)
+
+ yield DnsResponseSend(response, authoritative=True)
+
+
def main() -> None:
spoofing_server().run()
"TXT",
'"correct answer from the domain under attack"',
)
+
+
+def test_bailiwick_sibling_ns_referral(servers: Dict[str, NamedInstance]) -> None:
+ set_spoofing_mode(ans1="sibling-ns", ans2="none")
+
+ ns4 = servers["ns4"]
+ send_trigger_query(ns4, "trigger.")
+ check_domain_hijack(ns4)