yield DnsResponseSend(response, authoritative=False)
+class DnameSpoofer(ResponseSpoofer, mode="dname"):
+
+ qname = "trigger.victim."
+
+ async def get_responses(
+ self, qctx: QueryContext
+ ) -> AsyncGenerator[ResponseAction, None]:
+ response = qctx.prepare_new_response(with_zone_data=False)
+
+ cname_rrset = dns.rrset.from_text(
+ qctx.qname,
+ TTL,
+ qctx.qclass,
+ dns.rdatatype.CNAME,
+ "trigger.attacker.",
+ )
+ dname_rrset = dns.rrset.from_text(
+ "victim.", TTL, qctx.qclass, dns.rdatatype.DNAME, "attacker."
+ )
+ response.answer.append(cname_rrset)
+ response.answer.append(dname_rrset)
+
+ yield DnsResponseSend(response, authoritative=True)
+
+
def main() -> None:
spoofing_server().run()
time.sleep(61)
check_domain_hijack(ns4)
+
+
+def test_bailiwick_spoofed_dname(servers: Dict[str, NamedInstance]) -> None:
+ set_spoofing_mode(ans1="none", ans2="dname")
+
+ ns4 = servers["ns4"]
+ send_trigger_query(ns4, "trigger.victim.")
+ check_domain_hijack(ns4)