
DynoRoot (CVE-2018-1111) के साथ DHCP शोषण
यह प्रोजेक्ट Fedora और RedHat मशीनों की एक ज्ञात कमजोरी को प्रदर्शित करता है, जो डायनेमिक होस्ट कॉन्फ़िगरेशन प्रोटोकॉल (DHCP) के असुरक्षित क्लाइंट-साइड कार्यान्वयन से संबंधित है। एक दुष्ट DHCP सर्वर एक दुर्भावनापूर्ण पेलोड के साथ DHCP ऑफ़र तैयार कर सकता है, जो पीड़ित मशीन पर रूट शेल में निष्पादित होता है।
इस कमजोरी का श्रेय Felix Wilhelm को दिया जाता है और इसे CVE-2018-1111 या "DynoRoot" के नाम से जाना जाता है।
डायनेमिक होस्ट कॉन्फ़िगरेशन प्रोटोकॉल (DHCP) नेटवर्क वाली प्रणालियों में अक्सर अनदेखा किया जाने वाला घटक है। इसकी भूमिका उन होस्ट मशीनों के गतिशील कॉन्फ़िगरेशन की अनुमति देना है जो किसी मौजूदा नेटवर्क से जुड़ती हैं। सबसे सामान्य उपयोग नए जुड़े होस्ट को IP पता निर्दिष्ट करना और उसे अन्य नेटवर्क तक पहुँचने के लिए मौजूदा रूट्स की जानकारी देना है। अतिरिक्त विकल्प निर्दिष्ट किए जा सकते हैं, उदाहरण के लिए स्थानीय DNS सर्वर का पता और उसके द्वारा सेवा प्रदान किया जाने वाला ज़ोन, या बूट फ़ाइल का स्थान।
आइए उस 4-चरणीय प्रोटोकॉल का विश्लेषण करें जिसका पालन तब किया जाता है जब कोई नया होस्ट ईथरनेट या वायरलेस कनेक्शन के माध्यम से भौतिक रूप से जुड़ने के बाद किसी नेटवर्क में शामिल होना चाहता है।
DISCOVER संदेश प्रसारित (broadcast) करता है।OFFER के साथ उत्तर देता है, जिसमें शामिल होता है: IP पता, नेटवर्क
सबमास्क, राउटर पता, और अन्य विकल्प।REQUEST के साथ उत्तर देता है, जिसमें आधिकारिक रूप से प्रस्तावित IP पते को लीज़ (lease) पर लेने का अनुरोध किया जाता है।ACK के साथ समाप्त करता है, जो दर्शाता है कि क्लाइंट को निर्दिष्ट समय अवधि के लिए IP पते का उपयोग करने की अनुमति है।प्रारंभिक आदान-प्रदान के बाद, क्लाइंट केवल एक और REQUEST संदेश भेजकर लीज़ का नवीनीकरण कर सकता है। सर्वर क्लाइंट के IP और MAC पते के साथ लीज़ की मौजूदगी की जाँच करेगा और ACK के साथ उत्तर देगा।
ध्यान देने योग्य कुछ बातें:
DISCOVER चरण को छोड़कर सीधे किसी पते का REQUEST भी कर सकता है। यह उन परिदृश्यों में
आम है जिनमें क्लाइंट पहले भी नेटवर्क से जुड़ चुका है और पिछला पता याद रखता है। इस मामले में, सर्वर पते की उपलब्धता सत्यापित करता है और अनुरोध को ACK करता है, या यदि लीज़ उपलब्ध नहीं है, तो NACK भेजता है।RELEASE संदेश भेज सकते हैं कि पता अब
उपलब्ध है। हालाँकि, प्रोटोकॉल द्वारा यह अनिवार्य नहीं है और सर्वर समय-समय पर समाप्त हुई लीज़ को वापस एकत्र करेगा।OFFER नहीं दे पाएगा।OFFERs प्राप्त होते हैं, तो
वह केवल एक को स्वीकार करेगा; अन्य सर्वर प्रसारित REQUEST को देखेंगे और प्रस्ताव को अमान्य कर देंगे।कमजोरी /etc/NetworkManager/dispatcher.d/11-dhclient में स्थित है, जिसे क्लाइंट द्वारा DHCP के माध्यम से प्राप्त विकल्पों को पार्स करने और सेट करने के लिए निष्पादित किया जाता है।
declare एक bash बिल्टिन है, जो बिना तर्कों के उपयोग किए जाने पर सभी घोषित चरों को सूचीबद्ध करता है।grep DHCP से संबंधित सभी चरों को फ़िल्टर करता है।while read opt DHCP चरों पर एक-एक करके पुनरावृत्ति करता है, कुछ पार्सिंग करता है और
प्रत्येक विकल्प के लिए export new_optionname=value जैसी एक पंक्ति प्रिंट करता है।eval के माध्यम से निष्पादित किए जाते हैं।```bash
eval "$(
declare | LC_ALL=C grep '^DHCP4_[A-Z_]=' | while read opt; do
optname=${opt%%=}
optname=${optname,,}
optname=new_${optname#dhcp4_}
optvalue=${opt#*=}
echo "export $optname=$optvalue"
done
)"<!-- omit in toc -->
#### सामान्य संचालन
सामान्य परिस्थितियों में, कोड ठीक काम करेगा और नए DHCP विकल्पों को पार्स करेगा।
उदाहरण के तौर पर, निम्नलिखित कोड:```bash
DHCP4_OPTION_ONE=42
DHCP4_OPTION_TWO="bla bla"
declare | LC_ALL=C grep '^DHCP4_[A-Z_]*=' | while read opt; do
optname=${opt%%=*}
optname=${optname,,}
optname=new_${optname#dhcp4_}
optvalue=${opt#*=}
echo "export $optname=$optvalue"
done
ये दो export स्टेटमेंट प्रिंट करेगा, जिन्हें eval द्वारा मूल्यांकित किया जाना है:```bash
export new_option_one=42
export new_option_two='bla bla'
<!-- omit in toc -->
#### कोड इंजेक्शन
हालाँकि, असुरक्षित `eval` के कारण, बैश कमांड इंजेक्ट करना संभव है:```bash
DHCP4_OPTION_ONE="x'& echo Hacked! #"
DHCP4_OPTION_TWO='bla bla'
eval "$(
declare | LC_ALL=C grep '^DHCP4_[A-Z_]*=' | while read opt; do
optname=${opt%%=*}
optname=${optname,,}
optname=new_${optname#dhcp4_}
optvalue=${opt#*=}
echo "export $optname=$optvalue"
done
)"
इसके परिणामस्वरूप echo Hacked! का मूल्यांकन होगा:```text
[1] 1541
Hacked!
### स्रोत
- [एक्सप्लॉइट डेटाबेस प्रविष्टि](https://www.exploit-db.com/exploits/44890)
- [RedHat घोषणा](https://access.redhat.com/security/vulnerabilities/3442151)
- [Tenable ब्लॉग पोस्ट](https://www.tenable.com/blog/advisory-red-hat-dhcp-client-command-injection-trouble)
- [GitHub रिपॉज़िटरी](https://github.com/kkirsche/CVE-2018-1111)
- [Twitter घोषणा](https://twitter.com/_fel1x/status/996388421273882626?lang=en)
## सेटअप
इस एक्सप्लॉइट को प्रदर्शित करने के लिए न्यूनतम सेटअप में सिर्फ दो मशीनें होती हैं: `victim` मशीन
जो Fedora 28 चला रही है, और एक `attacker` मशीन। इस सेटअप में, हमलावर को बस एक
DHCP सेवा प्रदान करनी होती है और victim के कनेक्शन का इंतज़ार करना होता है।
<figure style="text-align:center">
<img src="https://raw.githubusercontent.com/baldassarrefe/fep3370-advanced-ethical-hacking/HEAD/media/network_simple.svg" style="max-width:400px;" width="90%"/>
<figcaption>न्यूनतम एक्सप्लॉइट सेटअप।</figcaption>
</figure>
अधिक यथार्थवादी सेटअप में मशीनों को एक निजी नेटवर्क पर रखा जाता है, जहाँ एक तीसरी मशीन, `gateway`,
को हानिरहित DHCP सर्वर और बाहरी इंटरनेट के गेटवे के रूप में कॉन्फ़िगर किया जाता है।
इस सेटअप में, हमलावर को हमला करने से पहले victim को वैध DHCP सर्वर से कनेक्ट होने से रोकना होता है।
<figure style="text-align:center">
<img src="https://raw.githubusercontent.com/baldassarrefe/fep3370-advanced-ethical-hacking/HEAD/media/network.svg" style="max-width:800px;" width="90%"/>
<figcaption>एक गेटवे मशीन वाला निजी नेटवर्क सेटअप जो DHCP, राउटर और फ़ायरवॉल के रूप में कार्य करती है।</figcaption>
</figure>