yield DnsResponseSend(response, authoritative=True)
+class ParentGlueSpoofer(ResponseSpoofer, mode="parent-glue"):
+
+ qname = "trigger.victim."
+
+ async def get_responses(
+ self, qctx: QueryContext
+ ) -> AsyncGenerator[ResponseAction, None]:
+ response = qctx.prepare_new_response(with_zone_data=False)
+
+ ns_rrset = dns.rrset.from_text(
+ "trigger.victim.", TTL, qctx.qclass, dns.rdatatype.NS, "ns.victim."
+ )
+ response.authority.append(ns_rrset)
+
+ glue_rrset = dns.rrset.from_text(
+ "ns.victim.", TTL, qctx.qclass, dns.rdatatype.A, ATTACKER_IP
+ )
+ response.additional.append(glue_rrset)
+
+ yield DnsResponseSend(response, authoritative=False)
+
+
def main() -> None:
spoofing_server().run()
from typing import Dict
+import time
+
import dns.message
import pytest
prime_cache(ns4)
send_trigger_query(ns4, "trigger.victim.")
check_domain_hijack(ns4)
+
+
+def test_bailiwick_parent_glue(servers: Dict[str, NamedInstance]) -> None:
+ set_spoofing_mode(ans1="none", ans2="parent-glue")
+
+ ns4 = servers["ns4"]
+ prime_cache(ns4)
+ send_trigger_query(ns4, "trigger.victim.")
+
+ isctest.log.info("Waiting 61 seconds for the ns.victim. ADB entry to expire")
+ time.sleep(61)
+
+ check_domain_hijack(ns4)