
CVE-2018-16858 शोषण कार्यान्वयन
इस प्रविष्टि में देखा जाएगा कि किसी प्रोग्राम की सरल विफलता का उपयोग करके उस प्रोग्राम का उपयोग करने वाले सिस्टम में पिछला दरवाजा कैसे खोला जाए।
प्रश्न में विफलता CVE-2018-16858 द्वारा परिभाषित की गई है, जो LibreOffice सुइट से संबंधित है। यह विफलता, एक विशेष रूप से निर्मित फ़ाइल में, निर्देशिका पदानुक्रम (directory traversal) को सक्षम करती है, जिससे Python कोड का निष्पादन संभव होता है। यह निष्पादन दस्तावेज़ पर उपयोगकर्ता की कार्रवाई पर बंधा या उछलता है, और उपयोगकर्ता को मैक्रोज़ के निष्पादन के बारे में कोई चेतावनी दिए बिना किया जाता है।
यह दस्तावेज़ पाँच भागों में विभाजित है। पहले भाग में विफलता को ही समझाया जाएगा, एक OpenDocument को कैसे अनपैक किया जाए, इसकी संरचना को कैसे बदला जाए ताकि वह वांछित स्थानीय स्क्रिप्ट चलाए, और दस्तावेज़ को फिर से कैसे पैक किया जाए ताकि वह निष्पादन और परीक्षण के लिए तैयार हो।
दूसरे भाग में हम देखेंगे कि कैसे स्थानीय निष्पादन का उपयोग करके उस सिस्टम पर कोई भी कमांड लॉन्च किया जाए जिसमें दस्तावेज़ खोला गया है, और हम एक पिछला दरवाजा बनाएंगे जो दूरस्थ कमांड निष्पादन की अनुमति देता है।
तीसरे भाग में हम इस प्रक्रिया को स्वचालित करेंगे ताकि ऐसे दस्तावेज़ तैयार किए जा सकें जो प्रत्यक्ष या रिवर्स संचार के साथ पिछले दरवाजे बनाते हैं, जिसमें उस आईपी पते और पोर्ट का निर्धारण किया जाएगा जिससे कनेक्ट होना है।
चौथा भाग Metasploit सिस्टम में विफलता के एकीकरण पर होगा, ताकि msfconsole के माध्यम से ऐसे दस्तावेज़ तैयार किए जा सकें जो Metasploit के शोषण विधि के अनुकूल हों। इससे Metasploit सुइट में परिभाषित किसी भी पेलोड को निष्पादित करने के लिए कोड चुनने की सुविधा मिलेगी।
पाँचवाँ और अंतिम भाग दिखाएगा कि कैसे एक एंटीवायरस सिस्टम में पता लगाने की प्रक्रिया को एकीकृत किया जाए जो उपरोक्त प्रक्रिया द्वारा संक्रमित LibreOffice प्रकार की फ़ाइलों की पहचान कर सके। ClamAV एंटीवायरस के पता लगाने के प्रारूप का उपयोग किया जाएगा, जिससे एंटीवायरस की पता लगाने की प्रक्रिया को बेहतर ढंग से समझा जा सके और इस प्रकार इस प्रकार के खतरों से अपनी सुरक्षा को आसान बनाया जा सके।
पूरी प्रक्रिया Debian-आधारित Linux सिस्टम के लिए की जाएगी, लेकिन यहाँ जो समझाया गया है उसे अन्य सिस्टमों में भी विस्तारित किया जा सकता है, क्योंकि इसका विस्तार से वर्णन किया गया है। मूल CVE की विफलता और प्रूफ-ऑफ-कॉन्सेप्ट दोनों Windows के लिए LibreOffice के संस्करण के लिए किए गए थे, इसलिए इस दस्तावेज़ में वर्णित का उपयोग Windows संस्करणों के लिए समान रूप से करने के लिए हमेशा उस स्रोत का सहारा लिया जा सकता है।
LibreOffice (और, आनुवंशिक कारणों से, Apache OpenOffice) में इसके नवीनतम संस्करण (6.1.5) से पहले के संस्करणों में एक विफलता है जो कंप्यूटर पर कहीं भी स्थित Python कोड के निष्पादन की अनुमति देती है, बिना उपयोगकर्ता को मैक्रो के निष्पादन के बारे में चेतावनी दिए।
प्रश्न में विफलता को देखने के लिए, हम टेक्स्ट एडिटर में एक नया दस्तावेज़ बना सकते हैं जिसमें हम कुछ लिखेंगे, उसे चुनेंगे और एक हाइपरलिंक बनाएंगे। टेक्स्ट में हाइपरलिंक बनाने के लिए, मेनू Insert और उसके अंदर Hyperlink विकल्प चुनें (आप टेक्स्ट चुनकर और Ctrl+K कुंजी संयोजन का उपयोग करके भी कर सकते हैं)।
निम्नलिखित डायलॉग दिखाई देगा:

एक हाइपरलिंक परिभाषित करने के लिए, हमें एक URL डालना होगा और Apply पर क्लिक करना होगा। URL विकल्प के अलावा, डायलॉग बॉक्स के नीचे, जहाँ Further Settings पढ़ा जा सकता है, हमारे पास Play आइकन वाला एक बटन होगा जो हमें घटनाओं को विशिष्ट क्रियाओं से जोड़ने की अनुमति देगा। यहीं पर हम परिभाषित करेंगे कि हम एक क्रिया के रूप में Python कोड निष्पादित करना चाहते हैं।
उस बटन को दबाने पर एक नया डायलॉग खुलेगा:

इसमें हम तीन बुनियादी घटनाओं और उस स्क्रिप्ट के बीच चयन कर सकते हैं जिसका उपयोग करना है। घटना के रूप में हम Mouse Over Object चुनेंगे और स्क्रिप्ट के रूप में LibreOffice Macros परिवार की स्क्रिप्ट के अंदर Python Samples चुनेंगे। उस विकल्प के अंदर केवल एक पूर्वनिर्धारित स्क्रिप्ट है जिसका नाम TableSample है, जिसे हम चुनेंगे।
एक बार यह हो जाने पर, यदि हम माउस को उस टेक्स्ट पर ले जाएँ जिसे हमने हाइपरलिंक में बदला है, तो हम देखेंगे कि एक विंडो खुलती है जिसमें एक दस्तावेज़ है जिसमें एक तालिका है। इसका मतलब है कि हमने माउस को हाइपरलिंक पर ले जाने की घटना को Python स्क्रिप्ट से जोड़ दिया है। हम इस क्रिया को अपनी इच्छित किसी अन्य क्रिया से बदलना चाहते हैं।
इसके लिए हम अपने द्वारा बनाए गए दस्तावेज़ को सहेजेंगे और LibreOffice से बाहर निकलेंगे ताकि कंसोल पर कमांड की एक श्रृंखला निष्पादित कर सकें।
ODT दस्तावेज़ प्रारूप एक ज़िप से अधिक कुछ नहीं है जिसके अंदर फ़ाइलों की एक श्रृंखला होती है (Microsoft Office का DOCX प्रारूप काफी समान है)। इसलिए, हम सबसे पहले फ़ाइल को एक ज़िप डीकंप्रेसर से डीकंप्रेस करेंगे।
हमारे मामले में हम unzip नामक कमांड लाइन टूल का उपयोग करेंगे, इसलिए हम बस निम्नलिखित वाक्य निष्पादित करेंगे:
user@host:~/Documents/prueba$ unzip ~/Documents/blog/exploitlibreoffice/doc/CV.odt
इससे हम उन फ़ाइलों को देखेंगे जो वास्तव में OpenDocument प्रकार की फ़ाइल के अंदर होती हैं। हमारे लिए सबसे प्रासंगिक मिमीटाइप फ़ाइल, content.xml फ़ाइल और styles.xml फ़ाइल होंगी।
मिमीटाइप फ़ाइल वह पहली फ़ाइल होनी चाहिए जो ज़िप की फ़ाइल सूची में दिखाई देती है, इसलिए जब हम फ़ाइलों को फिर से पैक करेंगे तो हमें अपने पैकर के साथ यह सुनिश्चित करना होगा कि ऐसा ही हो, अन्यथा फ़ाइल को OpenDocument के रूप में व्याख्या नहीं किया जाएगा।
content.xml फ़ाइल में वह दस्तावेज़ का टेक्स्ट होता है जिसे हमने लिखा है, जिसमें टेक्स्ट कुछ विशेष टैग के साथ मिश्रित होता है जो बताते हैं कि टेक्स्ट किस प्रारूप में दिखना चाहिए।
उदाहरण के लिए, निम्नलिखित पंक्ति में:
<text:p text:style-name="_5f_ECV_5f_SectionDetails">Indicar lista de documentos adjuntos a su CV. Ejemplos:</text:p>
टेक्स्ट के एक पैराग्राफ का एक उदाहरण देखा जा सकता है जो text:style-name विशेषता द्वारा परिभाषित एक विशिष्ट शैली के साथ लिखा गया है। टेक्स्ट पैराग्राफ उद्घाटन टैग text:p और समापन टैग </text:p> के बीच है।
हमने जो हाइपरलिंक बनाया है, उससे संबंधित स्क्रिप्ट को भी काफी सरलता से देखा जा सकता है। यदि हम content.xml के टेक्स्ट में python या उस Python स्क्रिप्ट का नाम खोजें जिसे हमने लोड किया है, हमारे मामले में TableSample.py, तो उस पंक्ति का आसानी से पता लगाया जा सकता है जहाँ हमें सामग्री बदलनी चाहिए:
<script:event-listener script:language="ooo:script" script:event-name="dom:mouseover" xlink:href="vnd.sun.star.script:pythonSamples|TableSample.py$createTable?language=Python&location=share" xlink:type="simple"/>
इस पंक्ति में Python स्क्रिप्ट का पथ है जो तब लोड होगा जब हम TableSample.py नामक हाइपरलिंक पर माउस रखेंगे, और Python कोड का वह फ़ंक्शन जो निष्पादित होगा, इस मामले में createTable।
LibreOffice में निहित समस्या यह है कि जब यह दस्तावेज़ पढ़ता है, तो यह लोड किए जाने वाले Python कोड के मान को ठीक से साफ नहीं करता है। प्रोग्राम फ़ाइल पथ से ../ वर्णों को साफ नहीं करता है, इसलिए सिस्टम पर किसी भी फ़ाइल तक पहुँचा जा सकता है जिसमें दस्तावेज़ खोला गया है। इसके अलावा, यदि वह फ़ाइल जिस तक पहुँचा गया है, Python कोड वाली फ़ाइल है, तो हम उस फ़ाइल में परिभाषित किसी भी फ़ंक्शन को निष्पादित कर सकते हैं।
प्रूफ-ऑफ-कॉन्सेप्ट के पहले परीक्षण के रूप में, हम बनाएंगे कि जब हाइपरलिंक पर माउस ले जाया जाए, तो कैलकुलेटर निष्पादित हो, हमारे मामले में प्रोग्राम galculator कैलकुलेटर खोलता है। हमें एक Python प्रोग्राम बनाना होगा जो एक फ़ंक्शन के अंदर एक कमांड निष्पादित करने की अनुमति देता है, जैसा कि LibreOffice निष्पादन की अपेक्षा करता है। इसके लिए हम /tmp/prueba.py पथ पर निम्नलिखित कोड बनाएंगे:
import os;
def ejecuta():
os.system("galculator");
इस छोटे से कोड से हम अपना उद्देश्य प्राप्त कर लेंगे, अब केवल हमें /tmp/prueba.py Python फ़ाइल और फ़ंक्शन का नाम ejecuta दोनों को odt फ़ाइल में की गई कॉल में जोड़ना होगा। इसलिए, वह पंक्ति जो Python को कॉल करती थी, इस प्रकार होगी: