
DNS टनलिंग टूल जो PowerShell और Nslookup का उपयोग करके डेटा एक्सफिल्ट्रेट करता है और DNS TXT/MX रिकॉर्ड्स के माध्यम से पेलोड डिलीवर करता है, कॉन्स्ट्रेन्ड लैंग्वेज मोड और एंडपॉइंट डिफेंसेस को बायपास करता है।
हाल ही में मैंने Cobalt Strike DNS बीकन्स से जुड़े कार्य से प्रेरित होकर, Microsoft Defender for Endpoint से बचने के मिशन वक्तव्य के साथ, मैंने कुछ समय इस बात पर शोध किया कि DNS का उपयोग कैसे किसी लक्ष्य मशीन पर पेलोड ट्रांसफर करने के लिए किया जा सकता है। मैंने आगे खुद को चुनौती देना चाहा कि ऐसा तरीके से करूं जो तब भी संभव हो जब पॉवरशेल कॉन्स्ट्रेंड लैंग्वेज मोड में हो। यह शोध विंडोज के अधिक आधुनिक संस्करणों (जैसे Win10+, Server 2019+) पर लक्षित था, लेकिन जैसा कि आप बाद में देखेंगे, यह निचले संस्करणों में भी संभव हो सकता है।
DNS टनलिंग एक तकनीक है जो लंबे समय से मौजूद है और विभिन्न हमलावरों द्वारा उपयोग की जाती है। मूल स्तर पर, इसमें DNS प्रोटोकॉल का उपयोग डेटा घुसपैठ/बहिर्वाह के साधन के रूप में या C2 संचार चैनल के रूप में किया जाता है। इस विषय पर अधिक जानकारी के लिए आप कई ब्लॉग पोस्ट का संदर्भ ले सकते हैं।
चूंकि यह बहुत पुरानी और प्रसिद्ध तकनीक है, इसलिए कई संगठनों के पास इसे रोकने के लिए पहचान के तरीके मौजूद हैं।
DNS टनलिंग के लिए ऐतिहासिक रूप से पसंदीदा DNS रिकॉर्ड प्रकार TXT रहा है। ऐसा इसलिए क्योंकि TXT रिकॉर्ड अन्य रिकॉर्ड्स की तुलना में अधिक डेटा रख सकते हैं और वे केस-सेंसिटिव भी होते हैं, जो अन्य रिकॉर्ड नहीं होते - यह तब प्रभाव डाल सकता है जब हम एन्कोडिंग की बात करते हैं।
कॉन्स्ट्रेंड लैंग्वेज मोड (CLM) पॉवरशेल के लिए एक प्रतिबंधात्मक भाषा मोड है जो पॉवरशेल की क्षमताओं और अनुमत कार्यक्षमता को बहुत कम कर देता है। संक्षिप्त सूची में, .NET, COM ऑब्जेक्ट्स, और हमलावरों के पसंदीदा जैसे (new-object net.webclient).downloadstring... उपलब्ध नहीं होते। यह लिंक अधिक जानकारी प्रदान करता है। संगठन आक्रमण सतह कम करने के नियमों के तहत सामान्य उपयोगकर्ताओं के लिए इस नीति को लागू करते हैं। यह प्रभावी रूप से हमलावरों के लिए हमारा जीवन कठिन बना देता है।
अधिकांश लोग कम से कम Nslookup जैसे उपकरणों के उपयोग से DNS से परिचित होंगे। लेकिन मूल स्तर पर, क्लाइंट एक क्वेरी भेजता है और DNS सर्वर उस क्वेरी का उत्तर लौटाता है। DNS रिकॉर्ड कई प्रकार के होते हैं: CNAME, A, AAAA, TXT, MX, और NS बस कुछ नाम हैं। इनमें से प्रत्येक रिकॉर्ड अलग-अलग जानकारी संग्रहीत और लौटा सकता है। ये रिकॉर्ड एक ज़ोनफ़ाइल में कॉन्फ़िगर किए जाते हैं, जो DNS सर्वर द्वारा प्रस्तुत किया जाता है।
एक उदाहरण ज़ोनफ़ाइल यहाँ दिखाया गया है:``` $ORIGIN example.com. @ 3600 SOA ns1.p30.dynect.net. ( zone-admin.dyndns.com. ; address of responsible party 2016072701 ; serial number 3600 ; refresh period 600 ; retry period 604800 ; expire time 1800 ) ; minimum ttl 86400 NS ns1.p30.dynect.net. 86400 NS ns2.p30.dynect.net. 86400 NS ns3.p30.dynect.net. 86400 NS ns4.p30.dynect.net. 3600 MX 10 mail.example.com. 3600 MX 20 vpn.example.com. 3600 MX 30 mail.example.com. 60 A 204.13.248.106 3600 TXT "v=spf1 includespf.dynect.net ~all" mail 14400 A 204.13.248.106 vpn 60 A 216.146.45.240 webapp 60 A 216.146.46.10 webapp 60 A 216.146.46.11 www 43200 CNAME example.com.
यदि कोई example.com के लिए NS रिकॉर्ड क्वेरी करता है, तो क्वेरी ns1.p30.dynect.net, ns2.p30.dynect.net, ns3.p30.dynect.net, और ns4.p30.dynect.net लौटाएगी।
# शोध
## डोमेन नाम पंजीकरण
शुरू करने से पहले हमें DNS रिकॉर्ड सेट करने के बारे में संक्षेप में बात करनी होगी जो एक ऐसे IP को इंगित करते हैं जिसे हम नियंत्रित करते हैं और उस पर एक DNS सर्वर चलाएंगे। जैसा कि नीचे दिखाया गया है, मैंने एक डोमेन खरीदा और DNS रिकॉर्ड सेट किए जो सबडोमेन "dns" को "ns1" सबडोमेन पर इंगित करते हैं, जिसे सर्वर का सार्वजनिक IP सौंपा गया है।

इसका मतलब है कि "dns.edu....com" के लिए किए गए कोई भी क्वेरी "ns1.edu....com" पर निर्देशित होंगे, जिसे IP 3..86 सौंपा गया है। उस IP पर हम अपने रिकॉर्ड प्रदान करने के लिए एक DNS सर्वर सेट करेंगे। इस पर बाद में फिर से आएंगे।
## क्लाइंट साइड टूल ढूँढना
मेरी खोज "powershell dns module" के लिए एक साधारण Google खोज से शुरू हुई, जिसने [यह](https://docs.microsoft.com/en-us/powershell/module/dnsclient/?view=windowsserver2022-ps) लिंक लौटाया। विशेष रुचि का Resolve-DnsName कमांड था। ऐसा प्रतीत होता है कि यह मूलतः प्रसिद्ध Nslookup.exe बाइनरी का एक पावरशेल कार्यान्वयन है। ध्यान दें कि विशिष्ट प्रकार के रिकॉर्ड का अनुरोध किया जा सकता है:

ठीक है, तो हमारे पास एक पावरशेल मॉड्यूल है जो DNS क्वेरी करने और उत्तर प्राप्त करने में सक्षम है। क्या यह कॉन्सट्रेंड लैंग्वेज मोड (CLM) में काम करता है? इसका उत्तर "हाँ तो है, लेकिन..." है।
जैसा कि आप यहाँ देख सकते हैं यदि मैं एक नई पावरशेल विंडो खोलूं, Resolve-DnsName चलाऊं, पावरशेल को CLM में डालूं (और सरल ::WriteLine कॉल के साथ परीक्षण करूं), और फिर Resolve-DnsName फिर से चलाऊं, यह बिना किसी समस्या के काम करता है:

हालांकि यदि मैं एक नई पावरशेल विंडो खोलूं और तुरंत इसे CLM में डालूं और फिर Resolve-DnsName चलाने का प्रयास करूं तो यह विफल हो जाता है:

ऐसा प्रतीत होता है कि यदि कोई मॉड्यूल पहले से लोड किया गया है, तो वह CLM लागू होने के बाद चलने में सक्षम है, हालांकि CLM इसे लोड होने से रोक देगा यदि यह पहले से लोड नहीं है। एक लक्ष्य वातावरण के बारे में सोचते हुए जहां CLM डिफ़ॉल्ट रूप से उपयोगकर्ताओं के लिए लागू है (और यह जानकारी नहीं है कि कुछ मॉड्यूल पहले से लोड हैं या DnsClient उनमें से एक है), मैंने इस बिंदु पर Resolve-DnsName को छोड़ने और पुराने अच्छे Nslookup.exe पर वापस जाने का चयन किया।

Nslookup.exe IT टूलकिट का एक स्टेपल है और एक बहुत प्रसिद्ध बाइनरी है जिसका उपयोग वैध उद्देश्यों के लिए किया जाता है। संभावनाएं हमारे पक्ष में हैं कि इसे उन वातावरणों में भी निष्पादित करने की अनुमति दी जाएगी जहां एप्लिकेशन व्हाइटलिस्टिंग एक चिंता का विषय है।
Nslookup हमारी Resolve-DnsName क्वेरी के समान ही अधिकांश जानकारी लौटाएगा, हमें बस इसे समय आने पर थोड़ा अलग तरीके से संशोधित करना होगा।
## एक एक्जीक्यूटेबल को DNS रिकॉर्ड में बदलना?
ठीक है, तो हमारे पास पीड़ित कंप्यूटर पर DNS क्वेरी करने का एक साधन है। हम अपने पेलोड को ऐसे प्रारूप में कैसे प्रदान कर सकते हैं जिसे Nslookup पुनर्प्राप्त कर सके?
एक्जीक्यूटेबल स्वाभाविक रूप से बाइनरी फ़ाइलें होती हैं, जिसका अर्थ है कि वे मानव-पठनीय नहीं हैं। परिणामस्वरूप, डेटा को ऐसी चीज़ में बदलना होगा जिसे हम DNS रिकॉर्ड में डाल सकें और जिसे Nslookup जैसा उपकरण पुनर्प्राप्त कर सके। हमारे लिए कई एन्कोडिंग विकल्प उपलब्ध हैं, लेकिन मुख्य विचार यह है कि पीड़ित बॉक्स केवल मूल विंडोज टूल्स और CLM में उपलब्ध क्षमताओं का उपयोग करके क्या डिकोड कर सकता है? Base64 स्पष्ट और अक्सर इस्तेमाल किया जाने वाला उत्तर है।
Base64 का उपयोग करके हम अपने एक्जीक्यूटेबल को एक विशाल मानव-पठनीय स्ट्रिंग में बदल देते हैं जिसे फिर कई DNS रिकॉर्ड में तोड़ा जा सकता है और Nslookup का उपयोग करके पुनर्प्राप्त किया जा सकता है। क्लाइंट साइड पर, प्रसिद्ध LOLBAS certutil.exe का उपयोग कुल DNS रिकॉर्ड को बाइनरी प्रारूप में Base64 डिकोड करने के लिए किया जा सकता है।