
DHCP विकल्प इंजेक्टर
क्या आपने कभी DHCP अनुरोधों को इंटरसेप्ट करके उनमें प्रेषक को पता न चले कुछ अतिरिक्त DHCP विकल्प घुसाने की इच्छा की है? शायद नहीं। फिर भी, यदि कभी ऐसी आवश्यकता उत्पन्न हो, तो dhcpoptinj (उम्मीद है) आपकी मदद करेगा।
DHCP अनुरोधों में हेरफेर करने के कई कारण हो सकते हैं, हालाँकि संभावना है कि आपको अपनी समस्या के समाधान के लिए किसी बेहतर विधि की तलाश करनी चाहिए। हो सकता है कि आपके पास DHCP सर्वर/क्लाइंट तक पहुँच न हो और आपको उनके DHCP विकल्पों को संशोधित करने की आवश्यकता हो, हो सकता है कि DHCP सॉफ़्टवेयर को कॉन्फ़िगर करना कठिन हो (या वह आपके इच्छित कार्य का समर्थन न करता हो), हो सकता है कि आपका सेटअप बहुत जटिल और/या अजीब हो, या हो सकता है कि आप सिर्फ असामान्य या विकृत विकल्प भेजने का प्रयोग करना चाहते हों? संभावना कम है कि dhcoptinj वास्तव में कुछ काम आ सके।
dhcpoptinj नेटफ़िल्टर कतार में पैकेट आने की प्रतीक्षा करता है। यह सुनिश्चित करता है कि पैकेट वास्तव में BOOTP/DHCP पैकेट है, और यदि ऐसा है तो विकल्प घुसाने की प्रक्रिया शुरू करता है। यह IPv4 हेडर चेकसम की पुनर्गणना करता है, UDP चेकसम को अक्षम करता है (सरल कार्यान्वयन के लिए) और फिर पैकेट वापस नेटफ़िल्टर को देता है।
पैकेट को इंटरसेप्ट करने और dhcpoptinj को भेजने के लिए आपको एक iptables नियम की आवश्यकता है। मान लें कि आपके पास दो इंटरफ़ेस ब्रिज किए गए हैं, eth0 और eth1। मान लें कि आप eth0 से आने वाले सभी BOOTP अनुरोधों को इंटरसेप्ट करना चाहते हैं और रिले एजेंट सूचना विकल्प (82/0x52) घुसाना चाहते हैं। आइए एक बकवास पेलोड बनाते हैं: मान "Fjas" के साथ एक एजेंट सर्किट ID उप-विकल्प।
मेंगल टेबल में एक नियम जोड़ें:sudo iptables -t mangle -A PREROUTING -m physdev --physdev-in eth0 -p udp --dport 67 -j NFQUEUE --queue-num 42।
फिर dhcpoptinj चलाएँ (आइए इसे फ़ोरग्राउंड में अतिरिक्त डीबग आउटपुट के साथ चलाएँ): sudo dhcpoptinj -d -f -q 42 -o'52 01 04 46 6A 61 73'। ध्यान दें कि dhcpoptinj को CAP_NET_ADMIN क्षमता वाले उपयोगकर्ता द्वारा चलाया जाना चाहिए। आपको dhcpoptinj को रूट के रूप में चलाने की आवश्यकता नहीं है, और आपको वास्तव में ऐसा नहीं करना चाहिए। इसके बजाय, आप उदाहरण के लिए बाइनरी को CAP_NET_ADMIN क्षमता प्रदान कर सकते हैं (setcap का उपयोग करके) और निष्पादन अधिकार केवल एक विशिष्ट उपयोगकर्ता या समूह तक सीमित कर सकते हैं। यह wireshark को गैर-रूट के रूप में चलाने के लिए उपयोग की जाने वाली एक विधि है, इसलिए आपको इसे प्राप्त करने में मदद करने वाली कई मार्गदर्शिकाएँ मिलेंगी।
अब eth0 इंटरफ़ेस पर एक DHCP पैकेट भेजें और इसे (जैसे wireshark जैसे टूल का उपयोग करके) ब्रिज किए गए इंटरफ़ेस तक पहुँचने पर संशोधित होते हुए देखें। विकल्प सूची के अंत में इंजेक्ट किया गया विकल्प होना चाहिए। यदि आप Wireshark के साथ आने वाले DHCP पैकेट को कैप्चर करते हैं, तो यह अपरिवर्तित दिखाई देगा, हालाँकि वास्तव में इसमें हेरफेर किया गया होगा।
-o विकल्प के तर्क के प्रारूप पर ध्यान दें: यह एक हेक्साडेसिमल स्ट्रिंग होनी चाहिए जो DHCP विकल्प कोड से शुरू होती है और उसके बाद विकल्प पेलोड होता है। विकल्प की लंबाई (वह बाइट जो सामान्यतः विकल्प कोड का अनुसरण करती है) स्वचालित रूप से गणना की जाती है और इसे निर्दिष्ट नहीं किया जाना चाहिए। हेक्स स्ट्रिंग को पठनीयता के लिए गैर-हेक्साडेसिमल वर्णों द्वारा सीमांकित किया जा सकता है। सभी विकल्पों में एक पेलोड होना चाहिए, सिवाय पैड विकल्प (कोड 0) के।
इस उदाहरण में उपयोग किए गए अर्थहीन विकल्प का लेआउट (पहले DHCP विकल्प लेआउट, फिर विशिष्ट रिले एजेंट सूचना विकल्प उप-विकल्प लेआउट) निम्नलिखित है:
| कोड | लंबाई | डेटा |
|---|---|---|
| 52 | (स्वचालित) | 01 04 46 6A 61 73 ("Fjas") |
| उप-विकल्प | लंबाई | डेटा |
|---|---|---|
| 01 | 4 | 46 6A 61 73 ("Fjas") |
ध्यान दें कि dhcpoptinj को इस बात से कोई सरोकार नहीं है कि आप विकल्प पेलोड में क्या लिखते हैं, न ही यह जाँचता है कि आपका विकल्प कोड मौजूद है या नहीं। हालाँकि, यह आपको विकल्प कोड 255 (समाप्त करने वाला अंत विकल्प) का उपयोग करने से मना करता है। dhcpoptinj इस विकल्प को अंतिम विकल्प के रूप में स्वचालित रूप से सम्मिलित करता है।
dhcpoptinj -f -d -q42 -r -o'0C 66 6A 61 73 65 68 6F 73 74' -o'52 01 04 46 6A 61 73' -o 320A141E28
3 DHCP option(s) to inject (with a total of 25 bytes): 12 (0x0C) (Hostname), 82 (0x52) (Relay Agent Information), 50 (0x32) (Address Request)
Existing options will be removed
Initialising netfilter queue
Initialising signal handler
Initialisation completed. Waiting for packets to mangle on queue 42
Received 416 bytes
Inspecting 328-byte DHCP packet from B6:40:FE:41:30:DC to 255.255.255.255:67
Mangling packet
Found option 53 (0x35) (DHCP message type) DHCPREQUEST (copying)
Found option 54 (0x36) (DHCP Server Id) with 4-byte payload 0A 14 1E 01 (copying)
Found option 50 (0x32) (Address Request) with 4-byte payload 0A 14 1E 28 (removing)
Found option 12 (0x0C) (Hostname) with 12-byte payload 33 31 36 64 65 39 31 34 64 61 62 34 (removing)
Found option 55 (0x37) (Parameter List) with 13-byte payload 01 1C 02 03 0F 06 77 0C 2C 2F 1A 79 2A (copying)
Found END option (removing)
Injecting option 12 (0x0C) (Hostname) with 9-byte payload 66 6A 61 73 65 68 6F 73 74
Injecting option 82 (0x52) (Relay Agent Information) with 6-byte payload 01 04 46 6A 61 73
Injecting option 50 (0x32) (Address Request) with 4-byte payload 0A 14 1E 28
Inserting END option
Padding with 10 byte(s) to meet minimal BOOTP payload size
Sending mangled packet
dhcpoptinj Debian/Ubuntu में उपलब्ध है। डेब पैकेज salsa पर स्रोत नियंत्रण में है। डेब पैकेज से dhcpoptinj स्थापित करना निम्नलिखित मैनुअल स्थापना प्रक्रिया से बेहतर है, क्योंकि इसमें एक मैन पेज, bash पूर्णता नियम, उदाहरण फ़ाइलें आदि भी शामिल हैं।
आपको cmake और libnetfilter_queue (और एक C कंपाइलर जो C99 का समर्थन करता है) की आवश्यकता है। उम्मीद है कि आप Debian जैसी प्रणाली का उपयोग कर रहे हैं, जिस स्थिति में आप इन्हें स्थापित करने के लिए निम्नलिखित चला सकते हैं: sudo apt-get install cmake libnetfilter-queue-dev।
git clone git://github.com/misje/dhcpoptinjcd dhcpoptinjmkdir build && cd buildcmake .. (या cmake -DCMAKE_BUILD_TYPE=Debug .. यदि आप डीबग बिल्ड चाहते हैं)make -j4sudo make installsudo make uninstall चलाएँबिल्ड निर्देशिका और उसकी सभी सामग्री को सुरक्षित रूप से हटाया जा सकता है। यदि आपने बिल्ड निर्देशिका का उपयोग नहीं किया है, तो आप git clean -dfx चलाकर सभी cmake कचरे से छुटकारा पा सकते हैं। ध्यान दें, हालाँकि, यह प्रोजेक्ट निर्देशिका में सब कुछ हटा देता है जो स्रोत नियंत्रण में नहीं है।
dhcptopinj /etc/dhcpoptinj.conf या -c/--conf-file के साथ पारित फ़ाइल को पार्स करने का प्रयास करेगा। कॉन्फ़िगरेशन फ़ाइल का सिंटैक्स है:
रिक्त स्थान वैकल्पिक है। वर्ण # के बाद और उसे शामिल करने वाली कोई भी चीज़ टिप्पणी मानी जाती है। DHCP विकल्पों को एक-एक करके option=01:02:03 के रूप में सूचीबद्ध किया गया है। विकल्प हेक्स स्ट्रिंग के चारों ओर उद्धरण वैकल्पिक हैं, और बाइट्स को किसी भी संख्या में गैर-हेक्साडेसिमल वर्णों द्वारा अलग किया जा सकता है।
कॉन्फ़िगरेशन फ़ाइल में version, help और conf-file विकल्प स्वीकार नहीं किए जाते हैं।
उदाहरण:
# Run in foreground:
foreground
# Enable debug output:
debug
# Override hostname to "fjasehost":
option = '0C 66 6A 61 73 65 68 6F 73 74'
# Send agent ID "Fjas":
option = "52:01:04:46:6A:61:73"
# Override address request to ask for 10.20.30.40:
option=320A141E28
# Use queue 12:
queue = 12
remove-existing-opt # Remove options before inserting
यह रीडमी आपको शुरू करने में मदद करेगी। मैन पेज (डेब पैकेज में) और सहायता आउटपुट (dhcpoptinj -h) भी देखें, जो उपयोगिता द्वारा प्रदान की जाने वाली सभी चीज़ों को कवर करना चाहिए।
बग और सुझावों के लिए कृपया एक issue बनाएँ।
dhcpoptinj सरल है और उम्मीद है कि ऐसा ही रहेगा। फिर भी, निम्नलिखित लापता विशेषताएँ हैं जिन्हें किसी दिन जोड़े जाने की उम्मीद है:
Failed to bind queue handler to AF_INET: Operation not permitted
सबसे अधिक संभावना है कि आपके पास CAP_NET_ADMIN क्षमता नहीं है या उसी नेटफ़िल्टर कतार संख्या से बंधी कोई अन्य प्रक्रिया (शायद कोई अन्य dhcpoptinj इंस्टेंस?) है।
सामान्य निकास पर नहीं होने पर मेमोरी लीक।
इसे लीक नहीं माना जाता है। हालाँकि, सामान्य निकास (SIGTERM, SIGINT या SIGHUP को पकड़ने) पर कोई मेमोरी लीक नहीं होनी चाहिए।
dhcpoptinj के साथ उपयोग के लिए iptables नियम बनाते समय, निम्नलिखित विकल्प उपयोगी हो सकते हैं:
--queue-bypass
पैकेटों को न गिराएँ, बल्कि यदि dhcpoptinj नहीं चल रहा है (या सही कतार संख्या पर नहीं सुन रहा है) तो उन्हें गुज़रने दें।
यदि आपके पास कोई सुझाव है, तो कृपया एक issue छोड़ें, और मैं आपसे संपर्क करूँगा। आपका योगदान स्वागत योग्य है और पुल अनुरोधों की अत्यधिक सराहना की जाती है।
यदि आप dhcpoptinj को उपयोगी पाते हैं, तो मुझे यह जानकर खुशी होगी कि आप इसका उपयोग किस लिए कर रहे हैं। विकी पृष्ठ को अपडेट करें और अपने उपयोग का वर्णन करें।
मैंने इस प्रोजेक्ट के लिए GPL का उपयोग करने का चयन किया है। यदि यह आपके लिए उपयुक्त नहीं है, तो मुझसे संपर्क करें, और हम एक अलग लाइसेंस पर सहमत हो सकते हैं।