
यह प्रोजेक्ट CVE-2023-50868 में हमलों को पुन: उत्पन्न और मूल्यांकन करने के लिए कस्टम NSEC3 पैरामीटर के साथ DNS zonefiles उत्पन्न करता है।
यह प्रोजेक्ट DNS ज़ोनफ़ाइल्स को कस्टम NSEC3 पैरामीटर्स के साथ उत्पन्न करता है ताकि CVE-2023-50868 में दिए गए हमलों को पुनरुत्पादित और मूल्यांकन किया जा सके।
Python3 (Python3.10 पर परीक्षण किया गया)
स्थापित Python निर्भरताएँ:
lib: Python उपयोगिताएँ, जिनमें शामिल हैं:
keys.py: फ़ाइलों में कुंजियाँ लोड/स्टोर करने के लिए रैपर फ़ंक्शनnsec.py: DNSSEC NSEC हैश का कार्यान्वयनdnssec.py: NSEC3 समर्थन के साथ संशोधित/पैच की गई dnspython फ़ंक्शंसconfig.py: कॉन्फ़िग लोड करने की उपयोगिताएँkeys: प्री-जनरेटेड कुंजियों वाली PEM फ़ाइलें (gen_keys.py से उत्पन्न)zones: ज़ोनफ़ाइल्स (gen_zones.py से उत्पन्न)config.json: उदाहरण कॉन्फ़िगरेशनconfig.json को संशोधित करके यह कॉन्फ़िगर करें कि कौन से NSEC3 ज़ोन बनाने हैं (देखें कॉन्फ़िग)
कुंजियाँ उत्पन्न करें:
$ ./gen_keys.py
प्रत्येक ज़ोन के लिए, एक KSK और ZSK उत्पन्न होते हैं। जब तक कॉन्फ़िगरेशन में ज़ोन के नाम अपरिवर्तित रहते हैं, कुंजियाँ पुनः उपयोग की जाती हैं।
ज़ोनफ़ाइल्स उत्पन्न करें:
$ ./gen_zones.py -c
विकल्प -c कॉन्फ़िगरेशन फ़ाइलों के निर्यात को सक्षम करता है (वर्तमान में केवल BIND9 के लिए)
अधिक विकल्पों के लिए --help का उपयोग करें।
कॉन्फ़िग संरचना में दो तत्व होते हैं:
default: ज़ोन के लिए डिफ़ॉल्ट पैरामीटर (अब तक सभी समर्थित नहीं हैं)zones: निर्यात किए जाने वाले सभी ज़ोन की सूचीएक ज़ोन में होते हैं:
name (आवश्यक): ज़ोन को संदर्भित करते समय और निर्यात के दौरान फ़ाइल नाम के रूप में उपयोग किया जाने वाला नामorigin (आवश्यक): विहित ज़ोन मूल डोमेन नामparent: मूल ज़ोन का नाम (origin नहीं), जिसमें इस ज़ोन के NS, A, DS, और NSEC3PARAM रिकॉर्ड जोड़े जाते हैंkeysize (आवश्यक): RSA कुंजी आकार (अब तक केवल RSA)nsec3: NSEC3 पैरामीटर:
iterations: डिफ़ॉल्ट 0salt: डिफ़ॉल्ट ''algorithm: पूर्णांक मान, अभी केवल SHA-1 (1) समर्थित हैtight: एक विशेष बूलियन जो नियंत्रित करता है कि क्या origin के तुरंत बाद और *.origin से पहले और बाद में NSEC3 रिकॉर्ड जोड़े जाने चाहिए। उदाहरण के लिए, यदि *.origin में NSEC3 रिकॉर्ड 1d..ua.origin. है, तो 1d..u0.origin. और 1d..ub.origin. के रिकॉर्ड भी ज़ोनफ़ाइल में जोड़े जाते हैं। यह सुनिश्चित करता है कि origin के किसी भी उपडोमेन (जैसे, ) पर प्रत्येक NXDOMAIN प्रमाण के लिए तीन NSEC3 रिकॉर्ड की आवश्यकता हो, क्योंकि origin और वाइल्डकार्ड को कवर करने वाले NSEC3 रिकॉर्ड की next_hash तक बहुत छोटी सीमा होती हैNSEC3 हमले को पुनरुत्पादित करने के लिए, यह खंड एक DNS नामसर्वर और पीड़ित रिज़ॉल्वर से युक्त एक संभावित कस्टम सेटअप का वर्णन करता है। जारी रखने से पहले, सुनिश्चित करें कि सिस्टम वातावरण में पर्याप्त रूप से कॉन्फ़िगर किया गया फ़ायरवॉल है ताकि सार्वजनिक सर्वर हमले की ज़ोनफ़ाइल्स के संपर्क में न आएं।
NSD नामसर्वर स्थापित करें (वर्तमान संस्करण)
स्थापना निर्देशों के लिए NLNetlabs वेबसाइट (https://nsd.docs.nlnetlabs.nl/en/latest/installation.html) पर जाएं।
नामसर्वर को VM या कंटेनर में तैनात करने की अनुशंसा की जाती है। शुरुआती बिंदु के रूप में, docker/nsd में एक छोटा Dockerfile है।
कंटेनर को बनाने के लिए docker build -t <tag> <path_to_dockerfile> का उपयोग करें, उदाहरण के लिए:
cd docker/nsd && docker build -t nsd .
कंटेनर में कंसोल खोलने के लिए docker run -it --name <name> nsd bash चलाएं।
इसके बाद, नामसर्वर को हमलावर ज़ोनफ़ाइल्स होस्ट करने के लिए कॉन्फ़िगर करने की आवश्यकता है।
इसके लिए उत्पन्न करने के लिए ज़ोनफ़ाइल्स का सही कॉन्फ़िगरेशन आवश्यक है (सबसे महत्वपूर्ण बात, NS रिकॉर्ड में दिया गया IP पता कंटेनर के IP पते से मेल खाना चाहिए)।
यदि कोई नेटवर्क कॉन्फ़िगर नहीं किया गया है, तो कंटेनर का IP पता इसके साथ देखा जा सकता है:
docker container inspect <name> | grep IPAddress
कॉन्फ़िगरेशन आउटपुट (./gen_zones.py -c, ऊपर देखें) के साथ ज़ोन उत्पन्न करें और रिपॉजिटरी निर्देशिका से ज़ोन आउटपुट फ़ोल्डर को डॉकर कंटेनर में कॉपी करें:
docker cp ./zones <name>:/etc/nsd
कंटेनर कंसोल में, कंटेनर में NSD कॉन्फ़िग /etc/nsd/nsd.conf को निम्नलिखित पंक्तियों के साथ संशोधित करने की आवश्यकता है:
यदि आपको इस गाइड में कोई समस्या होती है, तो आगे मार्गदर्शन के लिए बेझिझक हमसे संपर्क करें।
a.origin.ns: इस ज़ोन का नामसर्वर। एकल मान या सूची:
ns: नामसर्वर का डोमेन नाम, डिफ़ॉल्ट ns1.originip: IPv4 पता (IPv6 वर्तमान में समर्थित नहीं), डिफ़ॉल्ट 172.0.0.1soa: SOA RDATArrsets: अतिरिक्त RRsets की सूची, 5-टुपल सूची [डोमेन नाम, ttl, class, type, rdata] के रूप में दी गई है जहाँ सभी मान (वैकल्पिक रूप से ttl को छोड़कर) स्ट्रिंग के रूप में दिए गए हैंverify:
enable: no
remote-control:
control-enable: no
include: "/etc/nsd/zones/nsd.conf"
अंत में, कंटेनर शेल से NSD को इस कमांड से चलाएं
/usr/sbin/nsd -d -c /etc/nsd/nsd.conf
विकल्प -V 4 के साथ लॉगिंग आउटपुट सक्षम करें।
अब, यदि कोई समस्या नहीं हुई, तो आधिकारिक नामसर्वर चल रहा होना चाहिए। आप होस्ट सिस्टम से dig का उपयोग करके किसी एक ज़ोन के डोमेन की क्वेरी चलाकर इसकी पुष्टि कर सकते हैं:
dig @<ip-addr-of-nsd-container> <domain>
एक रिज़ॉल्वर स्थापित करें। इस प्रदर्शन में, हम Unbound 1.17.1 के लिए एक संभावित दृष्टिकोण दिखाते हैं।
एक आधिकारिक dockerfile यहाँ पाया जा सकता है: https://github.com/NLnetLabs/pythonunbound
हमने इस Dockerfile का एक संशोधित संस्करण docker/unbound में शामिल किया है जिसमें अद्यतन Ubuntu संस्करण और Unbound 1.17.1 के लिए पूर्व-कॉन्फ़िगर किया गया है।
रिपॉजिटरी को क्लोन करें, उसकी निर्देशिका में जाएँ और Unbound कंटेनर बनाएँ:
docker build -t <tag> .
कंटेनर को इसके साथ चलाएं:
docker run --name <name> -it <tag> bash
इसके बाद, Unbound को इस प्रकार कॉन्फ़िगर करने की आवश्यकता है कि वह NSD आधिकारिक नामसर्वर का पता लगा सके।
यह कंटेनर वर्किंग डायरेक्टरी में unbound.conf फ़ाइल को संशोधित करके किया जाता है।
इसके लिए, सुनिश्चित करें कि server.module-config प्रविष्टि को कॉन्फ़िग से हटा दिया गया है।
DNSSEC सत्यापन सक्षम करने के लिए, हमलावर मूल ज़ोन के DNSKEY रिकॉर्ड को मैन्युअल रूप से कॉन्फ़िगर करने की आवश्यकता है। यह वही कुंजी होनी चाहिए जो हस्ताक्षर उत्पन्न करने के लिए उपयोग की गई थी, उदाहरण के लिए:
server:
chroot: ""
do-ip6: no
trust-anchor: "attack.er. DNSKEY 257 3 7 AwEAAdqDN3rJYlmGP3jJs5lCZq5NYrCn pCVlV0ko17JnbfYfLCroEF4reO/Xy0MK C9AVvSRTk83MHDuzMYXogm7m/gcn3Mh0 MwB2InP8jkPw5not+TMH/Wrbs31xkT2n RIBJJ+1lPF+e2AvwWvgREcEVTRbdhIqQ iM1StWXoTVudry4V"
इसके अलावा, Unbound रिज़ॉल्वर को NSD आधिकारिक नामसर्वर खोजने में सक्षम करने के लिए एक stub-zone कॉन्फ़िगर करना होगा।
यह unbound.conf फ़ाइल में निम्नलिखित जोड़कर प्राप्त किया जाता है:
stub-zone:
name: "attack.er."
stub-prime: yes
stub-addr: <ip-addr-of-nsd-container>
कंटेनर में unbound को इसके साथ प्रारंभ करें:
unbound -vvv (-dd का उपयोग करें ताकि डेमॉनाइज़ेशन को रोका जा सके)
अब आप dig के साथ unbound से क्वेरी कर सकते हैं और प्रतिक्रिया समय देख सकते हैं:
dig @127.0.0.1 attack.er